Ensure the RECVFILE path in vfs_write_data() operates on a blocking socket.
authorJeremy Allison <jra@samba.org>
Mon, 8 Apr 2013 17:32:10 +0000 (10:32 -0700)
committerJeremy Allison <jra@samba.org>
Fri, 19 Apr 2013 21:11:27 +0000 (14:11 -0700)
Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Stefan (metze) Metzmacher <metze@samba.org>
source3/smbd/vfs.c

index 856e090ed34a1c6c5fa0e26729b5929f949a38ee..dd74d79880012aa2a403bb3b7c2420dffb552327 100644 (file)
@@ -428,14 +428,25 @@ ssize_t vfs_write_data(struct smb_request *req,
        ssize_t ret;
 
        if (req && req->unread_bytes) {
+               int sockfd = req->sconn->sock;
+               int old_flags;
                SMB_ASSERT(req->unread_bytes == N);
                /* VFS_RECVFILE must drain the socket
                 * before returning. */
                req->unread_bytes = 0;
-               return SMB_VFS_RECVFILE(req->sconn->sock,
+               /* Ensure the socket is blocking. */
+               old_flags = fcntl(sockfd, F_GETFL, 0);
+               if (set_blocking(sockfd, true) == -1) {
+                       return (ssize_t)-1;
+               }
+               ret = SMB_VFS_RECVFILE(sockfd,
                                        fsp,
                                        (off_t)-1,
                                        N);
+               if (fcntl(sockfd, F_SETFL, old_flags) == -1) {
+                       return (ssize_t)-1;
+               }
+               return ret;
        }
 
        while (total < N) {