Second part of fix for bug #8679 - recvfile code path using splice() on Linux leaves...
authorJeremy Allison <jra@samba.org>
Sat, 31 Dec 2011 04:23:00 +0000 (20:23 -0800)
committerKarolin Seeger <kseeger@samba.org>
Wed, 4 Jan 2012 20:30:36 +0000 (21:30 +0100)
Split out the functionality of drain_socket() into a separate
function from default_sys_recvfile().
(cherry picked from commit a5715420e37b98038fe8f2c3028e4c6938400eed)
(cherry picked from commit 7924e459b6677ba3500afff4b78f797e1e0ad83d)

source3/lib/recvfile.c

index a1254a2f19d5bc306fe55e84260142f28dbfd0c8..449bdf3bcef94cc12115a207f12d72e8bd2c6880 100644 (file)
@@ -241,9 +241,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;
 }