diff options
-rw-r--r-- | source3/lib/util_sock.c | 45 | ||||
-rw-r--r-- | source3/libsmb/clientgen.c | 24 | ||||
-rw-r--r-- | source3/smbd/chgpasswd.c | 19 |
3 files changed, 59 insertions, 29 deletions
diff --git a/source3/lib/util_sock.c b/source3/lib/util_sock.c index 32dd2bd8a8..d0d321ee39 100644 --- a/source3/lib/util_sock.c +++ b/source3/lib/util_sock.c @@ -1042,21 +1042,20 @@ NTSTATUS read_socket_with_timeout_ntstatus(int fd, char *buf, return NT_STATUS_OK; } -ssize_t read_socket_with_timeout(int fd, char *buf, - size_t mincnt, size_t maxcnt, - unsigned int time_out, - enum smb_read_errors *pre) +/**************************************************************************** + Read data from the client, reading exactly N bytes. +****************************************************************************/ + +ssize_t read_data(int fd,char *buffer,size_t N, enum smb_read_errors *pre) { NTSTATUS status; - size_t size_ret; set_smb_read_error(pre, SMB_READ_OK); - status = read_socket_with_timeout_ntstatus(fd, buf, mincnt, maxcnt, - time_out, &size_ret); + status = read_socket_with_timeout_ntstatus(fd, buffer, N, N, 0, NULL); if (NT_STATUS_IS_OK(status)) { - return size_ret; + return N; } if (NT_STATUS_EQUAL(status, NT_STATUS_END_OF_FILE)) { @@ -1074,15 +1073,6 @@ ssize_t read_socket_with_timeout(int fd, char *buf, } /**************************************************************************** - Read data from the client, reading exactly N bytes. -****************************************************************************/ - -ssize_t read_data(int fd,char *buffer,size_t N, enum smb_read_errors *pre) -{ - return read_socket_with_timeout(fd, buffer, N, N, 0, pre); -} - -/**************************************************************************** Write data to a fd. ****************************************************************************/ @@ -1214,7 +1204,6 @@ ssize_t receive_smb_raw(int fd, enum smb_read_errors *pre) { size_t len; - ssize_t ret; NTSTATUS status; set_smb_read_error(pre,SMB_READ_OK); @@ -1264,11 +1253,23 @@ ssize_t receive_smb_raw(int fd, len = MIN(len,maxlen); } - ret = read_socket_with_timeout(fd, buffer+4, len, len, timeout, - pre); + set_smb_read_error(pre, SMB_READ_OK); - if (ret != len) { - cond_set_smb_read_error(pre,SMB_READ_ERROR); + status = read_socket_with_timeout_ntstatus( + fd, buffer+4, len, len, timeout, &len); + + if (!NT_STATUS_IS_OK(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; } diff --git a/source3/libsmb/clientgen.c b/source3/libsmb/clientgen.c index 042b3bdfb0..086c158ed2 100644 --- a/source3/libsmb/clientgen.c +++ b/source3/libsmb/clientgen.c @@ -180,8 +180,28 @@ bool cli_receive_smb(struct cli_state *cli) ssize_t cli_receive_smb_data(struct cli_state *cli, char *buffer, size_t len) { - return read_socket_with_timeout(cli->fd, buffer, len, len, - cli->timeout, &cli->smb_rw_error); + NTSTATUS status; + + set_smb_read_error(&cli->smb_rw_error, SMB_READ_OK); + + status = read_socket_with_timeout_ntstatus( + cli->fd, buffer, len, len, cli->timeout, NULL); + if (NT_STATUS_IS_OK(status)) { + return len; + } + + 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; } /**************************************************************************** diff --git a/source3/smbd/chgpasswd.c b/source3/smbd/chgpasswd.c index 668c8e2095..bd5ff1f523 100644 --- a/source3/smbd/chgpasswd.c +++ b/source3/smbd/chgpasswd.c @@ -239,7 +239,8 @@ static int dochild(int master, const char *slavedev, const struct passwd *pass, static int expect(int master, char *issue, char *expected) { char buffer[1024]; - int attempts, timeout, nread, len; + int attempts, timeout, nread; + size_t len; bool match = False; for (attempts = 0; attempts < 2; attempts++) { @@ -248,7 +249,8 @@ static int expect(int master, char *issue, char *expected) DEBUG(100, ("expect: sending [%s]\n", issue)); if ((len = sys_write(master, issue, strlen(issue))) != strlen(issue)) { - DEBUG(2,("expect: (short) write returned %d\n", len )); + DEBUG(2,("expect: (short) write returned %d\n", + (int)len )); return False; } } @@ -261,9 +263,16 @@ static int expect(int master, char *issue, char *expected) nread = 0; buffer[nread] = 0; - while ((len = read_socket_with_timeout(master, buffer + nread, 1, - sizeof(buffer) - nread - 1, - timeout, NULL)) > 0) { + while (True) { + NTSTATUS status; + status = read_socket_with_timeout_ntstatus( + master, buffer + nread, 1, + sizeof(buffer) - nread - 1, + timeout, &len); + + if (!NT_STATUS_IS_OK(status)) { + break; + } nread += len; buffer[nread] = 0; |