diff options
| -rw-r--r-- | Doc/library/socket.rst | 4 | ||||
| -rw-r--r-- | Lib/test/test_socket.py | 7 | ||||
| -rw-r--r-- | Misc/ACKS | 1 | ||||
| -rw-r--r-- | Misc/NEWS | 3 | ||||
| -rw-r--r-- | Modules/socketmodule.c | 11 | 
5 files changed, 20 insertions, 6 deletions
diff --git a/Doc/library/socket.rst b/Doc/library/socket.rst index 96152f9..d6b1e4c 100644 --- a/Doc/library/socket.rst +++ b/Doc/library/socket.rst @@ -644,8 +644,8 @@ correspond to Unix system calls applicable to sockets.  .. method:: socket.listen(backlog)     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 -   is system-dependent (usually 5). +   maximum number of queued connections and should be at least 0; the maximum value +   is system-dependent (usually 5), the minimum value is forced to 0.  .. method:: socket.makefile([mode[, bufsize]]) diff --git a/Lib/test/test_socket.py b/Lib/test/test_socket.py index 7ee16eb..12e09dd 100644 --- a/Lib/test/test_socket.py +++ b/Lib/test/test_socket.py @@ -700,6 +700,13 @@ class GeneralModuleTests(unittest.TestCase):      def test_sendall_interrupted_with_timeout(self):          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.')  class BasicTCPTest(SocketConnectedTest): @@ -243,6 +243,7 @@ Carey Evans  Tim Everett  Paul Everitt  David Everly +Daniel Evers  Greg Ewing  Martijn Faassen  Clovis Fabricio @@ -80,6 +80,9 @@ Core and Builtins  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 #11164: Remove obsolete allnodes test from minidom test. diff --git a/Modules/socketmodule.c b/Modules/socketmodule.c index 96b83b1..76d860c 100644 --- a/Modules/socketmodule.c +++ b/Modules/socketmodule.c @@ -2244,8 +2244,10 @@ sock_listen(PySocketSockObject *s, PyObject *arg)      if (backlog == -1 && PyErr_Occurred())          return NULL;      Py_BEGIN_ALLOW_THREADS -    if (backlog < 1) -        backlog = 1; +    /* To avoid problems on systems that don't allow a negative backlog +     * (which doesn't make sense anyway) we force a minimum value of 0. */ +    if (backlog < 0) +        backlog = 0;      res = listen(s->sock_fd, backlog);      Py_END_ALLOW_THREADS      if (res < 0) @@ -2258,8 +2260,9 @@ PyDoc_STRVAR(listen_doc,  "listen(backlog)\n\  \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\ -will allow before refusing new connections."); +least 0 (if it is lower, it is set to 0); it specifies the number of\n\ +unaccepted connections that the system will allow before refusing new\n\ +connections.");  #ifndef NO_DUP  | 
