Kaydet (Commit) 47d1d0dc authored tarafından Antoine Pitrou's avatar Antoine Pitrou

Issue #8498: In socket.accept(), allow to specify 0 as a backlog value in

order to accept exactly one connection.  Patch by Daniel Evers.
üst 35176123
...@@ -644,8 +644,8 @@ correspond to Unix system calls applicable to sockets. ...@@ -644,8 +644,8 @@ correspond to Unix system calls applicable to sockets.
.. method:: socket.listen(backlog) .. method:: socket.listen(backlog)
Listen for connections made to the socket. The *backlog* argument specifies the Listen for connections made to the socket. The *backlog* argument specifies the
maximum number of queued connections and should be at least 1; the maximum value maximum number of queued connections and should be at least 0; the maximum value
is system-dependent (usually 5). is system-dependent (usually 5), the minimum value is forced to 0.
.. method:: socket.makefile([mode[, bufsize]]) .. method:: socket.makefile([mode[, bufsize]])
......
...@@ -700,6 +700,13 @@ class GeneralModuleTests(unittest.TestCase): ...@@ -700,6 +700,13 @@ class GeneralModuleTests(unittest.TestCase):
def test_sendall_interrupted_with_timeout(self): def test_sendall_interrupted_with_timeout(self):
self.check_sendall_interrupted(True) self.check_sendall_interrupted(True)
def testListenBacklog0(self):
srv = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
srv.bind((HOST, 0))
# backlog = 0
srv.listen(0)
srv.close()
@unittest.skipUnless(thread, 'Threading required for this test.') @unittest.skipUnless(thread, 'Threading required for this test.')
class BasicTCPTest(SocketConnectedTest): class BasicTCPTest(SocketConnectedTest):
......
...@@ -243,6 +243,7 @@ Carey Evans ...@@ -243,6 +243,7 @@ Carey Evans
Tim Everett Tim Everett
Paul Everitt Paul Everitt
David Everly David Everly
Daniel Evers
Greg Ewing Greg Ewing
Martijn Faassen Martijn Faassen
Clovis Fabricio Clovis Fabricio
......
...@@ -80,6 +80,9 @@ Core and Builtins ...@@ -80,6 +80,9 @@ Core and Builtins
Library Library
------- -------
- Issue #8498: In socket.accept(), allow to specify 0 as a backlog value in
order to accept exactly one connection. Patch by Daniel Evers.
- Issue #12012: ssl.PROTOCOL_SSLv2 becomes optional. - Issue #12012: ssl.PROTOCOL_SSLv2 becomes optional.
- Issue #11164: Remove obsolete allnodes test from minidom test. - Issue #11164: Remove obsolete allnodes test from minidom test.
......
...@@ -2244,8 +2244,10 @@ sock_listen(PySocketSockObject *s, PyObject *arg) ...@@ -2244,8 +2244,10 @@ sock_listen(PySocketSockObject *s, PyObject *arg)
if (backlog == -1 && PyErr_Occurred()) if (backlog == -1 && PyErr_Occurred())
return NULL; return NULL;
Py_BEGIN_ALLOW_THREADS Py_BEGIN_ALLOW_THREADS
if (backlog < 1) /* To avoid problems on systems that don't allow a negative backlog
backlog = 1; * (which doesn't make sense anyway) we force a minimum value of 0. */
if (backlog < 0)
backlog = 0;
res = listen(s->sock_fd, backlog); res = listen(s->sock_fd, backlog);
Py_END_ALLOW_THREADS Py_END_ALLOW_THREADS
if (res < 0) if (res < 0)
...@@ -2258,8 +2260,9 @@ PyDoc_STRVAR(listen_doc, ...@@ -2258,8 +2260,9 @@ PyDoc_STRVAR(listen_doc,
"listen(backlog)\n\ "listen(backlog)\n\
\n\ \n\
Enable a server to accept connections. The backlog argument must be at\n\ Enable a server to accept connections. The backlog argument must be at\n\
least 1; it specifies the number of unaccepted connection that the system\n\ least 0 (if it is lower, it is set to 0); it specifies the number of\n\
will allow before refusing new connections."); unaccepted connections that the system will allow before refusing new\n\
connections.");
#ifndef NO_DUP #ifndef NO_DUP
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment