diff options
author | Volker Lendecke <vl@samba.org> | 2015-06-03 13:41:24 +0000 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2015-06-04 01:02:26 +0200 |
commit | ab26e84da15c636ecd772afcba740b307e1a5a79 (patch) | |
tree | b438fcb9c46ee693c0026ac7f86c95b3f027374a /libcli | |
parent | 2f2cdaf644337ef577de8044f1c223203d87141b (diff) | |
download | samba-ab26e84da15c636ecd772afcba740b307e1a5a79.tar.gz |
tstream: Make socketpair nonblocking
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>
Diffstat (limited to 'libcli')
-rw-r--r-- | libcli/named_pipe_auth/npa_tstream.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/libcli/named_pipe_auth/npa_tstream.c b/libcli/named_pipe_auth/npa_tstream.c index 3d3f55edd35..35392021275 100644 --- a/libcli/named_pipe_auth/npa_tstream.c +++ b/libcli/named_pipe_auth/npa_tstream.c @@ -1468,17 +1468,23 @@ int _tstream_npa_socketpair(uint16_t file_type, 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) { - int sys_errno = errno; - close(fd1); - close(fd2); - errno = sys_errno; - return -1; + goto close_fail; } rc = _tstream_npa_existing_socket(mem_ctx2, @@ -1498,4 +1504,13 @@ int _tstream_npa_socketpair(uint16_t file_type, *pstream2 = stream2; return 0; + +close_fail: + { + int sys_errno = errno; + close(fd1); + close(fd2); + errno = sys_errno; + return -1; + } } |