mirror of
https://github.com/samba-team/samba.git
synced 2024-12-23 17:34:34 +03:00
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.
This commit is contained in:
parent
5a22c0225a
commit
43c766a14a
@ -1383,7 +1383,7 @@ ssize_t read_udp_v4_socket(int fd,
|
||||
char *buf,
|
||||
size_t len,
|
||||
struct sockaddr_storage *psa);
|
||||
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);
|
||||
|
@ -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)) {
|
||||
|
@ -296,7 +296,7 @@ ssize_t cli_receive_smb_data(struct cli_state *cli, char *buffer, size_t len)
|
||||
|
||||
set_smb_read_error(&cli->smb_rw_error, SMB_READ_OK);
|
||||
|
||||
status = read_socket_with_timeout(
|
||||
status = read_fd_with_timeout(
|
||||
cli->fd, buffer, len, len, cli->timeout, NULL);
|
||||
if (NT_STATUS_IS_OK(status)) {
|
||||
return len;
|
||||
|
@ -269,7 +269,7 @@ static int expect(int master, char *issue, char *expected)
|
||||
buffer[nread] = 0;
|
||||
|
||||
while (True) {
|
||||
status = read_socket_with_timeout(
|
||||
status = read_fd_with_timeout(
|
||||
master, buffer + nread, 1,
|
||||
sizeof(buffer) - nread - 1,
|
||||
timeout, &len);
|
||||
|
@ -128,7 +128,7 @@ static NTSTATUS read_packet_remainder(int fd, char *buffer,
|
||||
return NT_STATUS_OK;
|
||||
}
|
||||
|
||||
return read_socket_with_timeout(fd, buffer, len, len, timeout, NULL);
|
||||
return read_fd_with_timeout(fd, buffer, len, len, timeout, NULL);
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
@ -162,7 +162,7 @@ static NTSTATUS receive_smb_raw_talloc_partial_read(TALLOC_CTX *mem_ctx,
|
||||
|
||||
memcpy(writeX_header, lenbuf, 4);
|
||||
|
||||
status = read_socket_with_timeout(
|
||||
status = read_fd_with_timeout(
|
||||
fd, writeX_header + 4,
|
||||
STANDARD_WRITE_AND_X_HEADER_SIZE,
|
||||
STANDARD_WRITE_AND_X_HEADER_SIZE,
|
||||
|
Loading…
Reference in New Issue
Block a user