summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/lib/recvfile.c31
1 files changed, 30 insertions, 1 deletions
diff --git a/source3/lib/recvfile.c b/source3/lib/recvfile.c
index 5d1c0b2c55..31d9311498 100644
--- a/source3/lib/recvfile.c
+++ b/source3/lib/recvfile.c
@@ -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;
}