tstream: Make socketpair nonblocking
authorVolker Lendecke <vl@samba.org>
Wed, 3 Jun 2015 13:41:24 +0000 (13:41 +0000)
committerJeremy Allison <jra@samba.org>
Wed, 3 Jun 2015 23:02:26 +0000 (01:02 +0200)
When we have a large RPC reply, we can't block in the RPC server.

Test: Do rpcclient netshareenumall with a thousand shares defined

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
libcli/named_pipe_auth/npa_tstream.c

index 3d3f55edd3553576c983a4a47447d26040be21de..3539202127504a58d0414b5247271a42ce65f7db 100644 (file)
@@ -1468,17 +1468,23 @@ int _tstream_npa_socketpair(uint16_t file_type,
        fd1 = fds[0];
        fd2 = fds[1];
 
        fd1 = fds[0];
        fd2 = fds[1];
 
+       rc = set_blocking(fd1, false);
+       if (rc == -1) {
+               goto close_fail;
+       }
+
+       rc = set_blocking(fd2, false);
+       if (rc == -1) {
+               goto close_fail;
+       }
+
        rc = _tstream_npa_existing_socket(mem_ctx1,
                                          fd1,
                                          file_type,
                                          &stream1,
                                          location);
        if (rc == -1) {
        rc = _tstream_npa_existing_socket(mem_ctx1,
                                          fd1,
                                          file_type,
                                          &stream1,
                                          location);
        if (rc == -1) {
-               int sys_errno = errno;
-               close(fd1);
-               close(fd2);
-               errno = sys_errno;
-               return -1;
+               goto close_fail;
        }
 
        rc = _tstream_npa_existing_socket(mem_ctx2,
        }
 
        rc = _tstream_npa_existing_socket(mem_ctx2,
@@ -1498,4 +1504,13 @@ int _tstream_npa_socketpair(uint16_t file_type,
        *pstream2 = stream2;
 
        return 0;
        *pstream2 = stream2;
 
        return 0;
+
+close_fail:
+       {
+               int sys_errno = errno;
+               close(fd1);
+               close(fd2);
+               errno = sys_errno;
+               return -1;
+       }
 }
 }