Staging
v0.5.1
https://github.com/python/cpython
Revision d5aeccf9767c1619faa29e8ed61c93bde7bc5e3f authored by Victor Stinner on 31 August 2014, 13:07:57 UTC, committed by Victor Stinner on 31 August 2014, 13:07:57 UTC
There is a race condition in create_connection() used with wait_for() to have a
timeout. sock_connect() registers the file descriptor of the socket to be
notified of write event (if connect() raises BlockingIOError). When
create_connection() is cancelled with a TimeoutError, sock_connect() coroutine
gets the exception, but it doesn't unregister the file descriptor for write
event. create_connection() gets the TimeoutError and closes the socket.

If you call again create_connection(), the new socket will likely gets the same
file descriptor, which is still registered in the selector. When sock_connect()
calls add_writer(), it tries to modify the entry instead of creating a new one.

This issue was originally reported in the Trollius project, but the bug comes
from Tulip in fact (Trollius is based on Tulip):
https://bitbucket.org/enovance/trollius/issue/15/after-timeouterror-on-wait_for

This change fixes the race condition. It also makes sock_connect() more
reliable (and portable) is sock.connect() raises an InterruptedError.
1 parent 41f3c3f
History
Tip revision: d5aeccf9767c1619faa29e8ed61c93bde7bc5e3f authored by Victor Stinner on 31 August 2014, 13:07:57 UTC
asyncio, Tulip issue 205: Fix a race condition in BaseSelectorEventLoop.sock_connect()
Tip revision: d5aeccf
File Mode Size
Python-ast.c -rw-r--r-- 223.6 KB
_warnings.c -rw-r--r-- 29.7 KB
asdl.c -rw-r--r-- 1.4 KB
ast.c -rw-r--r-- 117.4 KB
bltinmodule.c -rw-r--r-- 74.5 KB
ceval.c -rw-r--r-- 147.3 KB
ceval_gil.h -rw-r--r-- 8.9 KB
codecs.c -rw-r--r-- 38.7 KB
compile.c -rw-r--r-- 124.7 KB
condvar.h -rw-r--r-- 11.0 KB
dtoa.c -rw-r--r-- 81.3 KB
dup2.c -rw-r--r-- 705 bytes
dynamic_annotations.c -rw-r--r-- 6.6 KB
dynload_aix.c -rw-r--r-- 5.6 KB
dynload_dl.c -rw-r--r-- 509 bytes
dynload_hpux.c -rw-r--r-- 1.8 KB
dynload_next.c -rw-r--r-- 3.8 KB
dynload_shlib.c -rw-r--r-- 3.3 KB
dynload_stub.c -rw-r--r-- 186 bytes
dynload_win.c -rw-r--r-- 9.5 KB
errors.c -rw-r--r-- 29.9 KB
fileutils.c -rw-r--r-- 26.8 KB
formatter_unicode.c -rw-r--r-- 48.7 KB
frozen.c -rw-r--r-- 1.6 KB
frozenmain.c -rw-r--r-- 2.6 KB
future.c -rw-r--r-- 4.6 KB
getargs.c -rw-r--r-- 53.7 KB
getcompiler.c -rw-r--r-- 366 bytes
getcopyright.c -rw-r--r-- 511 bytes
getopt.c -rw-r--r-- 3.4 KB
getplatform.c -rw-r--r-- 130 bytes
getversion.c -rw-r--r-- 289 bytes
graminit.c -rw-r--r-- 41.3 KB
import.c -rw-r--r-- 64.7 KB
importdl.c -rw-r--r-- 3.6 KB
importdl.h -rw-r--r-- 544 bytes
importlib.h -rw-r--r-- 226.4 KB
makeopcodetargets.py -rwxr-xr-x 1.2 KB
marshal.c -rw-r--r-- 47.7 KB
modsupport.c -rw-r--r-- 14.1 KB
mysnprintf.c -rw-r--r-- 3.3 KB
mystrtoul.c -rw-r--r-- 8.1 KB
opcode_targets.h -rw-r--r-- 6.2 KB
peephole.c -rw-r--r-- 24.8 KB
pyarena.c -rw-r--r-- 5.5 KB
pyctype.c -rw-r--r-- 7.7 KB
pyfpe.c -rw-r--r-- 623 bytes
pyhash.c -rw-r--r-- 13.0 KB
pymath.c -rw-r--r-- 1.5 KB
pystate.c -rw-r--r-- 25.2 KB
pystrcmp.c -rw-r--r-- 613 bytes
pystrtod.c -rw-r--r-- 38.2 KB
pythonrun.c -rw-r--r-- 81.4 KB
pytime.c -rw-r--r-- 6.5 KB
random.c -rw-r--r-- 7.5 KB
sigcheck.c -rw-r--r-- 529 bytes
strdup.c -rw-r--r-- 247 bytes
structmember.c -rw-r--r-- 8.7 KB
symtable.c -rw-r--r-- 55.5 KB
sysmodule.c -rw-r--r-- 62.3 KB
thread.c -rw-r--r-- 12.4 KB
thread_foobar.h -rw-r--r-- 1.4 KB
thread_nt.h -rw-r--r-- 10.3 KB
thread_pthread.h -rw-r--r-- 17.2 KB
traceback.c -rw-r--r-- 17.3 KB

back to top