summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/lib/util_sock.c45
-rw-r--r--source3/libsmb/clientgen.c24
-rw-r--r--source3/smbd/chgpasswd.c19
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;