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

Second part of fix for bug #8679 - recvfile code path using splice() on Linux leaves data in the pipe on short write.

Split out the functionality of drain_socket() into a separate
function from default_sys_recvfile().
This commit is contained in:
Jeremy Allison 2011-12-30 20:23:00 -08:00
parent a108eb4fdb
commit a5715420e3

View File

@ -242,9 +242,38 @@ ssize_t sys_recvfile(int fromfd,
/*****************************************************************
Throw away "count" bytes from the client socket.
Returns count or -1 on error.
*****************************************************************/
ssize_t drain_socket(int sockfd, size_t count)
{
return default_sys_recvfile(sockfd, -1, (SMB_OFF_T)-1, count);
size_t total = 0;
size_t bufsize = MIN(TRANSFER_BUF_SIZE,count);
char *buffer = NULL;
if (count == 0) {
return 0;
}
buffer = SMB_MALLOC_ARRAY(char, bufsize);
if (buffer == NULL) {
return -1;
}
while (total < count) {
ssize_t read_ret;
size_t toread = MIN(bufsize,count - total);
/* Read from socket - ignore EINTR. */
read_ret = sys_read(sockfd, buffer, toread);
if (read_ret <= 0) {
/* EOF or socket error. */
free(buffer);
return -1;
}
total += read_ret;
}
free(buffer);
return count;
}