summaryrefslogtreecommitdiff
path: root/source3/lib/util_sock.c
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2009-09-06 21:38:50 -0700
committerJeremy Allison <jra@samba.org>2009-09-06 21:38:50 -0700
commit43c766a14a5eeed80e57bae9fde21eb2b542c209 (patch)
treeb0330fce78ed8ec8fc30e039acf701787ebca90e /source3/lib/util_sock.c
parent5a22c0225abe2da11e844888475cbd9c40c6c47c (diff)
downloadsamba-43c766a14a5eeed80e57bae9fde21eb2b542c209.tar.gz
samba-43c766a14a5eeed80e57bae9fde21eb2b542c209.tar.bz2
samba-43c766a14a5eeed80e57bae9fde21eb2b542c209.zip
Fix bug 6673 - smbpasswd does not work with "unix password sync = yes".
Revert change from 3.3 -> 3.4 with read_socket_with_timeout changed from sys_read() to sys_recv(). read_socket_with_timeout() is called with non-fd's (with a pty in chgpasswd.c and with a disk file in lib/dbwrap_file.c via read_data()). recv works for the disk file, but not the pty. Change the name of read_socket_with_timeout() to read_fd_with_timeout() to make this clear (and add comments). Jeremy.
Diffstat (limited to 'source3/lib/util_sock.c')
-rw-r--r--source3/lib/util_sock.c42
1 files changed, 25 insertions, 17 deletions
diff --git a/source3/lib/util_sock.c b/source3/lib/util_sock.c
index 638a92d23b..6cc2e53811 100644
--- a/source3/lib/util_sock.c
+++ b/source3/lib/util_sock.c
@@ -538,13 +538,15 @@ ssize_t read_udp_v4_socket(int fd,
}
/****************************************************************************
- Read data from a socket with a timout in msec.
+ Read data from a file descriptor with a timout in msec.
mincount = if timeout, minimum to read before returning
maxcount = number to be read.
time_out = timeout in milliseconds
+ NB. This can be called with a non-socket fd, don't change
+ sys_read() to sys_recv() or other socket call.
****************************************************************************/
-NTSTATUS read_socket_with_timeout(int fd, char *buf,
+NTSTATUS read_fd_with_timeout(int fd, char *buf,
size_t mincnt, size_t maxcnt,
unsigned int time_out,
size_t *size_ret)
@@ -568,10 +570,10 @@ NTSTATUS read_socket_with_timeout(int fd, char *buf,
}
while (nread < mincnt) {
- readret = sys_recv(fd, buf + nread, maxcnt - nread, 0);
+ readret = sys_read(fd, buf + nread, maxcnt - nread);
if (readret == 0) {
- DEBUG(5,("read_socket_with_timeout: "
+ DEBUG(5,("read_fd_with_timeout: "
"blocking read. EOF from client.\n"));
return NT_STATUS_END_OF_FILE;
}
@@ -581,12 +583,12 @@ NTSTATUS read_socket_with_timeout(int fd, char *buf,
if (fd == get_client_fd()) {
/* Try and give an error message
* saying what client failed. */
- DEBUG(0,("read_socket_with_timeout: "
+ DEBUG(0,("read_fd_with_timeout: "
"client %s read error = %s.\n",
get_peer_addr(fd,addr,sizeof(addr)),
strerror(save_errno) ));
} else {
- DEBUG(0,("read_socket_with_timeout: "
+ DEBUG(0,("read_fd_with_timeout: "
"read error = %s.\n",
strerror(save_errno) ));
}
@@ -620,12 +622,12 @@ NTSTATUS read_socket_with_timeout(int fd, char *buf,
if (fd == get_client_fd()) {
/* Try and give an error message saying
* what client failed. */
- DEBUG(0,("read_socket_with_timeout: timeout "
+ DEBUG(0,("read_fd_with_timeout: timeout "
"read for client %s. select error = %s.\n",
get_peer_addr(fd,addr,sizeof(addr)),
strerror(save_errno) ));
} else {
- DEBUG(0,("read_socket_with_timeout: timeout "
+ DEBUG(0,("read_fd_with_timeout: timeout "
"read. select error = %s.\n",
strerror(save_errno) ));
}
@@ -634,16 +636,16 @@ NTSTATUS read_socket_with_timeout(int fd, char *buf,
/* Did we timeout ? */
if (selrtn == 0) {
- DEBUG(10,("read_socket_with_timeout: timeout read. "
+ DEBUG(10,("read_fd_with_timeout: timeout read. "
"select timed out.\n"));
return NT_STATUS_IO_TIMEOUT;
}
- readret = sys_recv(fd, buf+nread, maxcnt-nread, 0);
+ readret = sys_read(fd, buf+nread, maxcnt-nread);
if (readret == 0) {
/* we got EOF on the file descriptor */
- DEBUG(5,("read_socket_with_timeout: timeout read. "
+ DEBUG(5,("read_fd_with_timeout: timeout read. "
"EOF from client.\n"));
return NT_STATUS_END_OF_FILE;
}
@@ -654,12 +656,12 @@ NTSTATUS read_socket_with_timeout(int fd, char *buf,
if (fd == get_client_fd()) {
/* Try and give an error message
* saying what client failed. */
- DEBUG(0,("read_socket_with_timeout: timeout "
+ DEBUG(0,("read_fd_with_timeout: timeout "
"read to client %s. read error = %s.\n",
get_peer_addr(fd,addr,sizeof(addr)),
strerror(save_errno) ));
} else {
- DEBUG(0,("read_socket_with_timeout: timeout "
+ DEBUG(0,("read_fd_with_timeout: timeout "
"read. read error = %s.\n",
strerror(save_errno) ));
}
@@ -678,16 +680,20 @@ NTSTATUS read_socket_with_timeout(int fd, char *buf,
}
/****************************************************************************
- Read data from the client, reading exactly N bytes.
+ Read data from an fd, reading exactly N bytes.
+ NB. This can be called with a non-socket fd, don't add dependencies
+ on socket calls.
****************************************************************************/
NTSTATUS read_data(int fd, char *buffer, size_t N)
{
- return read_socket_with_timeout(fd, buffer, N, N, 0, NULL);
+ return read_fd_with_timeout(fd, buffer, N, N, 0, NULL);
}
/****************************************************************************
Write all data from an iov array
+ NB. This can be called with a non-socket fd, don't add dependencies
+ on socket calls.
****************************************************************************/
ssize_t write_data_iov(int fd, const struct iovec *orig_iov, int iovcnt)
@@ -757,6 +763,8 @@ ssize_t write_data_iov(int fd, const struct iovec *orig_iov, int iovcnt)
/****************************************************************************
Write data to a fd.
+ NB. This can be called with a non-socket fd, don't add dependencies
+ on socket calls.
****************************************************************************/
ssize_t write_data(int fd, const char *buffer, size_t N)
@@ -817,7 +825,7 @@ NTSTATUS read_smb_length_return_keepalive(int fd, char *inbuf,
int msg_type;
NTSTATUS status;
- status = read_socket_with_timeout(fd, inbuf, 4, 4, timeout, NULL);
+ status = read_fd_with_timeout(fd, inbuf, 4, 4, timeout, NULL);
if (!NT_STATUS_IS_OK(status)) {
return status;
@@ -898,7 +906,7 @@ NTSTATUS receive_smb_raw(int fd, char *buffer, size_t buflen, unsigned int timeo
len = MIN(len,maxlen);
}
- status = read_socket_with_timeout(
+ status = read_fd_with_timeout(
fd, buffer+4, len, len, timeout, &len);
if (!NT_STATUS_IS_OK(status)) {