(original) (raw)

changeset: 70011:48743ad2d2ef branch: 2.7 parent: 70006:50a5e271edf9 user: Antoine Pitrou solipsis@pitrou.net date: Tue May 10 19:16:03 2011 +0200 files: Doc/library/socket.rst Lib/test/test_socket.py Misc/ACKS Misc/NEWS Modules/socketmodule.c description: Issue #8498: In socket.accept(), allow to specify 0 as a backlog value in order to accept exactly one connection. Patch by Daniel Evers. diff -r 50a5e271edf9 -r 48743ad2d2ef Doc/library/socket.rst --- a/Doc/library/socket.rst Tue May 10 00:39:02 2011 -0700 +++ b/Doc/library/socket.rst Tue May 10 19:16:03 2011 +0200 @@ -644,8 +644,8 @@ .. 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 -r 50a5e271edf9 -r 48743ad2d2ef Lib/test/test_socket.py --- a/Lib/test/test_socket.py Tue May 10 00:39:02 2011 -0700 +++ b/Lib/test/test_socket.py Tue May 10 19:16:03 2011 +0200 @@ -700,6 +700,13 @@ 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): diff -r 50a5e271edf9 -r 48743ad2d2ef Misc/ACKS --- a/Misc/ACKS Tue May 10 00:39:02 2011 -0700 +++ b/Misc/ACKS Tue May 10 19:16:03 2011 +0200 @@ -243,6 +243,7 @@ Tim Everett Paul Everitt David Everly +Daniel Evers Greg Ewing Martijn Faassen Clovis Fabricio diff -r 50a5e271edf9 -r 48743ad2d2ef Misc/NEWS --- a/Misc/NEWS Tue May 10 00:39:02 2011 -0700 +++ b/Misc/NEWS Tue May 10 19:16:03 2011 +0200 @@ -80,6 +80,9 @@ 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 -r 50a5e271edf9 -r 48743ad2d2ef Modules/socketmodule.c --- a/Modules/socketmodule.c Tue May 10 00:39:02 2011 -0700 +++ b/Modules/socketmodule.c Tue May 10 19:16:03 2011 +0200 @@ -2244,8 +2244,10 @@ 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 @@ "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 /solipsis@pitrou.net