]> granicus.if.org Git - python/commitdiff
Issue #8498: In socket.accept(), allow to specify 0 as a backlog value in
authorAntoine Pitrou <solipsis@pitrou.net>
Tue, 10 May 2011 17:16:29 +0000 (19:16 +0200)
committerAntoine Pitrou <solipsis@pitrou.net>
Tue, 10 May 2011 17:16:29 +0000 (19:16 +0200)
order to accept exactly one connection.  Patch by Daniel Evers.

Doc/library/socket.rst
Lib/test/test_socket.py
Misc/ACKS
Misc/NEWS
Modules/socketmodule.c

index bfb8ae9414675539147ed6b414632f4f43129def..14cd4ff5ce6389dd1e66ff8bbecb545d9bd6eb3f 100644 (file)
@@ -652,8 +652,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='r', buffering=None, *, encoding=None, \
index a948541825ab7e150bab7bc6f070702d6de7a163..4100c34452c7fd0ff99898b79836e261b410d811 100644 (file)
@@ -788,6 +788,13 @@ class GeneralModuleTests(unittest.TestCase):
             fp.close()
             self.assertEqual(repr(fp), "<_io.BufferedReader name=-1>")
 
+    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):
index 5c33b2e0a2b557adebdd0033e438c0b8b0dbaf9c..399de8cba9a69856fe19878ee7314a32e93606a9 100644 (file)
--- a/Misc/ACKS
+++ b/Misc/ACKS
@@ -268,6 +268,7 @@ Carey Evans
 Tim Everett
 Paul Everitt
 David Everly
+Daniel Evers
 Greg Ewing
 Martijn Faassen
 Clovis Fabricio
index 4309858ec5d71d1f5ef13175d983dcde0bb4e05a..ac9ac79da25c3c1804053dd3ed7c573f08a7ca99 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -86,6 +86,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 #11164: Stop trying to use _xmlplus in the xml module.
 
 - Issue #11927: SMTP_SSL now uses port 465 by default as documented.  Patch
index e2fdb5e12ebf7d35e2abf6ad379ba90ff9c44147..bc11b23c56719c49d8b8330f1f60e4e15e0aab53 100644 (file)
@@ -2220,8 +2220,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)
@@ -2234,8 +2236,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.");
 
 
 /*