-
-
Notifications
You must be signed in to change notification settings - Fork 31.9k
Unfixable potential race conditions on file descriptors in CPython #121544
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Comments
What concrete parts of the stdlib or tests have this race condition? There were some issues in multiprocessing, I tried to avoid introducing such kind of race condition. |
This makes select.poll() and kqueue() objects thread-safe in the free-threaded build. Note that calling close() concurrently with other functions is still not thread-safe due to races on file descriptors (pythongh-121544).
This makes select.poll() and kqueue() objects thread-safe in the free-threaded build. Note that calling close() concurrently with other functions is still not thread-safe due to races on file descriptors (pythongh-121544).
…ythonGH-121594) This makes select.poll() and kqueue() objects thread-safe in the free-threaded build. Note that calling close() concurrently with other functions is still not thread-safe due to races on file descriptors (pythongh-121544). (cherry picked from commit 44937d1) Co-authored-by: Sam Gross <[email protected]>
…H-121594) (#121623) This makes select.poll() and kqueue() objects thread-safe in the free-threaded build. Note that calling close() concurrently with other functions is still not thread-safe due to races on file descriptors (gh-121544). (cherry picked from commit 44937d1) Co-authored-by: Sam Gross <[email protected]>
…ython#121594) This makes select.poll() and kqueue() objects thread-safe in the free-threaded build. Note that calling close() concurrently with other functions is still not thread-safe due to races on file descriptors (pythongh-121544).
@serhiy-storchaka I don't think the stdlib has internal races on file descriptors. We have some in tests, but it may take me a bit to find them because we still have other race conditions reported by TSan, and it's easy to get them mixed up.
|
…ython#121594) This makes select.poll() and kqueue() objects thread-safe in the free-threaded build. Note that calling close() concurrently with other functions is still not thread-safe due to races on file descriptors (pythongh-121544).
@kumaraditya303 fixed the file descriptor race in the asyncio tests:
I'm going to close this issue as I don't think there's anything actionable left to do. |
Python allows multiple threads to concurrently access file descriptors through files and sockets. Race conditions at the Python level can lead to unexpected behavior, even with the global interpreter lock.
Thread sanitizer reports these races in some of our tests that exercise this behavior. We cannot fix these potential race conditions without introducing potential deadlocks.
For example, consider:
If you are particularly unlucky, then the file descriptor for
secrets
may be closed bythread2
and reused as the file descriptor forlog
just beforethread1
writes to it. In other words,thread1
may write "a secret" to a completely different file or socket than it intended.This can happen, even with the GIL, because the GIL is released around
write()
andclose()
. In other words, the following can happen:secrets.write()
call releases the GIL, but before it actually calls the Cwrite()
function on the file descriptor....secrets.close()
call closes the file descriptoropen("log.txt", "w")
re-uses the same file descriptor numbersecrets.write()
call nowwrite()
on the wrong file descriptorNote that we must release the GIL before calling
write()
orclose()
because these functions potentially block.The text was updated successfully, but these errors were encountered: