1
0
mirror of https://github.com/samba-team/samba.git synced 2025-01-13 13:18:06 +03:00

Convert receive_smb_raw to NTSTATUS

This commit is contained in:
Volker Lendecke 2008-01-25 23:54:22 +01:00
parent 90554799af
commit ba771bd858
5 changed files with 62 additions and 55 deletions

View File

@ -4422,9 +4422,30 @@ static void readline_callback(void)
session keepalives and then drop them here. session keepalives and then drop them here.
*/ */
if (FD_ISSET(cli->fd,&fds)) { if (FD_ISSET(cli->fd,&fds)) {
if (receive_smb_raw(cli->fd,cli->inbuf,0,0,&cli->smb_rw_error) == -1) { NTSTATUS status;
DEBUG(0, ("Read from server failed, maybe it closed the " size_t len;
"connection\n"));
set_smb_read_error(&cli->smb_rw_error, SMB_READ_OK);
status = receive_smb_raw(cli->fd, cli->inbuf, 0, 0, &len);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(0, ("Read from server failed, maybe it closed "
"the connection\n"));
if (NT_STATUS_EQUAL(status, NT_STATUS_END_OF_FILE)) {
set_smb_read_error(&cli->smb_rw_error,
SMB_READ_EOF);
return;
}
if (NT_STATUS_EQUAL(status, NT_STATUS_IO_TIMEOUT)) {
set_smb_read_error(&cli->smb_rw_error,
SMB_READ_TIMEOUT);
return;
}
set_smb_read_error(&cli->smb_rw_error, SMB_READ_ERROR);
return; return;
} }
if(CVAL(cli->inbuf,0) != SMBkeepalive) { if(CVAL(cli->inbuf,0) != SMBkeepalive) {

View File

@ -1196,34 +1196,17 @@ NTSTATUS read_smb_length(int fd, char *inbuf, unsigned int timeout,
Doesn't check the MAC on signed packets. Doesn't check the MAC on signed packets.
****************************************************************************/ ****************************************************************************/
ssize_t receive_smb_raw(int fd, NTSTATUS receive_smb_raw(int fd, char *buffer, unsigned int timeout,
char *buffer, size_t maxlen, size_t *p_len)
unsigned int timeout,
size_t maxlen,
enum smb_read_errors *pre)
{ {
size_t len; size_t len;
NTSTATUS status; NTSTATUS status;
set_smb_read_error(pre,SMB_READ_OK);
status = read_smb_length_return_keepalive(fd,buffer,timeout,&len); status = read_smb_length_return_keepalive(fd,buffer,timeout,&len);
if (!NT_STATUS_IS_OK(status)) { if (!NT_STATUS_IS_OK(status)) {
DEBUG(10, ("receive_smb_raw: %s!\n", nt_errstr(status))); DEBUG(10, ("receive_smb_raw: %s!\n", nt_errstr(status)));
return status;
if (NT_STATUS_EQUAL(status, NT_STATUS_END_OF_FILE)) {
set_smb_read_error(pre, SMB_READ_EOF);
return -1;
}
if (NT_STATUS_EQUAL(status, NT_STATUS_IO_TIMEOUT)) {
set_smb_read_error(pre, SMB_READ_TIMEOUT);
return -1;
}
set_smb_read_error(pre, SMB_READ_ERROR);
return -1;
} }
/* /*
@ -1235,15 +1218,7 @@ ssize_t receive_smb_raw(int fd,
DEBUG(0,("Invalid packet length! (%lu bytes).\n", DEBUG(0,("Invalid packet length! (%lu bytes).\n",
(unsigned long)len)); (unsigned long)len));
if (len > BUFFER_SIZE + (SAFETY_MARGIN/2)) { if (len > BUFFER_SIZE + (SAFETY_MARGIN/2)) {
return NT_STATUS_INVALID_PARAMETER;
/*
* Correct fix. smb_read_error may have already been
* set. Only set it here if not already set. Global
* variables still suck :-). JRA.
*/
cond_set_smb_read_error(pre,SMB_READ_ERROR);
return -1;
} }
} }
@ -1252,24 +1227,11 @@ ssize_t receive_smb_raw(int fd,
len = MIN(len,maxlen); len = MIN(len,maxlen);
} }
set_smb_read_error(pre, SMB_READ_OK);
status = read_socket_with_timeout( status = read_socket_with_timeout(
fd, buffer+4, len, len, timeout, &len); fd, buffer+4, len, len, timeout, &len);
if (!NT_STATUS_IS_OK(status)) { if (!NT_STATUS_IS_OK(status)) {
if (NT_STATUS_EQUAL(status, NT_STATUS_END_OF_FILE)) { return status;
set_smb_read_error(pre, SMB_READ_EOF);
return -1;
}
if (NT_STATUS_EQUAL(status, NT_STATUS_IO_TIMEOUT)) {
set_smb_read_error(pre, SMB_READ_TIMEOUT);
return -1;
}
set_smb_read_error(pre, SMB_READ_ERROR);
return -1;
} }
/* not all of samba3 properly checks for packet-termination /* not all of samba3 properly checks for packet-termination
@ -1278,7 +1240,8 @@ ssize_t receive_smb_raw(int fd,
SSVAL(buffer+4,len, 0); SSVAL(buffer+4,len, 0);
} }
return len; *p_len = len;
return NT_STATUS_OK;
} }
/**************************************************************************** /****************************************************************************

View File

@ -69,15 +69,36 @@ int cli_set_port(struct cli_state *cli, int port)
static ssize_t client_receive_smb(struct cli_state *cli, size_t maxlen) static ssize_t client_receive_smb(struct cli_state *cli, size_t maxlen)
{ {
ssize_t len; size_t len;
for(;;) { for(;;) {
len = receive_smb_raw(cli->fd, cli->inbuf, cli->timeout, NTSTATUS status;
maxlen, &cli->smb_rw_error);
if (len < 0) { set_smb_read_error(&cli->smb_rw_error, SMB_READ_OK);
status = receive_smb_raw(cli->fd, cli->inbuf, cli->timeout,
maxlen, &len);
if (!NT_STATUS_IS_OK(status)) {
DEBUG(10,("client_receive_smb failed\n")); DEBUG(10,("client_receive_smb failed\n"));
show_msg(cli->inbuf); show_msg(cli->inbuf);
if (NT_STATUS_EQUAL(status, NT_STATUS_END_OF_FILE)) {
set_smb_read_error(&cli->smb_rw_error,
SMB_READ_EOF);
return -1;
}
if (NT_STATUS_EQUAL(status, NT_STATUS_IO_TIMEOUT)) {
set_smb_read_error(&cli->smb_rw_error,
SMB_READ_TIMEOUT);
return -1;
}
set_smb_read_error(&cli->smb_rw_error, SMB_READ_ERROR);
return -1;
}
if (len < 0) {
return len; return len;
} }

View File

@ -121,7 +121,6 @@ static files_struct *irix_oplock_receive_message(fd_set *fds)
DEBUG(0,("irix_oplock_receive_message: read of kernel " DEBUG(0,("irix_oplock_receive_message: read of kernel "
"notification failed. Error was %s.\n", "notification failed. Error was %s.\n",
strerror(errno) )); strerror(errno) ));
set_smb_read_error(get_srv_read_error(), SMB_READ_ERROR);
return NULL; return NULL;
} }
@ -141,7 +140,6 @@ static files_struct *irix_oplock_receive_message(fd_set *fds)
*/ */
return NULL; return NULL;
} }
set_smb_read_error(get_srv_read_error(), SMB_READ_ERROR);
return NULL; return NULL;
} }

View File

@ -169,7 +169,9 @@ static void filter_child(int c, struct sockaddr_storage *dest_ss)
if (num <= 0) continue; if (num <= 0) continue;
if (c != -1 && FD_ISSET(c, &fds)) { if (c != -1 && FD_ISSET(c, &fds)) {
if (!receive_smb_raw(c, packet, 0, 0, NULL)) { size_t len;
if (!NT_STATUS_IS_OK(receive_smb_raw(
c, packet, 0, 0, &len))) {
d_printf("client closed connection\n"); d_printf("client closed connection\n");
exit(0); exit(0);
} }
@ -180,7 +182,9 @@ static void filter_child(int c, struct sockaddr_storage *dest_ss)
} }
} }
if (s != -1 && FD_ISSET(s, &fds)) { if (s != -1 && FD_ISSET(s, &fds)) {
if (!receive_smb_raw(s, packet, 0, 0, NULL)) { size_t len;
if (!NT_STATUS_IS_OK(receive_smb_raw(
s, packet, 0, 0, &len))) {
d_printf("server closed connection\n"); d_printf("server closed connection\n");
exit(0); exit(0);
} }