Ensure the RECVFILE path in vfs_pwrite_data() operates on a blocking socket.
authorJeremy Allison <jra@samba.org>
Mon, 8 Apr 2013 17:49:03 +0000 (10:49 -0700)
committerJeremy Allison <jra@samba.org>
Fri, 19 Apr 2013 23:04:05 +0000 (01:04 +0200)
Signed-off-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Stefan (metze) Metzmacher <metze@samba.org>
Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Sat Apr 20 01:04:05 CEST 2013 on sn-devel-104

source3/smbd/vfs.c

index dd74d79880012aa2a403bb3b7c2420dffb552327..49609d0179412196b7f447749acb10dd690bd9f9 100644 (file)
@@ -472,14 +472,25 @@ ssize_t vfs_pwrite_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,
                                        offset,
                                        N);
+               if (fcntl(sockfd, F_SETFL, old_flags) == -1) {
+                       return (ssize_t)-1;
+               }
+               return ret;
        }
 
        while (total < N) {