Repository navigation
Conversation
06cb5dc to
c7af374
Compare
| # socket() rejected the arguments; the dup()'d descriptor would | ||
| # otherwise leak, since nothing holds a reference to it. | ||
| close(nfd) |
There was a problem hiding this comment.
I don't think that the comment is useful.
| # socket() rejected the arguments; the dup()'d descriptor would | |
| # otherwise leak, since nothing holds a reference to it. | |
| close(nfd) | |
| close(nfd) |
| return socket(family, type, proto, nfd) | ||
| try: | ||
| return socket(family, type, proto, nfd) | ||
| except BaseException: |
There was a problem hiding this comment.
IMO a bare except is better here, since we just re-raise the exception later.
| except BaseException: | |
| except: |
|
|
||
| def _testFromFdInvalidArgsDoesNotLeak(self): | ||
| pass | ||
|
|
There was a problem hiding this comment.
You can use os_helper.fd_count() which works on all platforms. I suggest a shorter test name and more flat code to trigger errors:
| def testFromFdError(self): | |
| # Make sure that the fromfd() duplicated socket is closed on error. | |
| # In debug mode, Python test suite checks for file descriptor leaks. | |
| fd = self.cli_conn.fileno() | |
| fd_count_before = os_helper.fd_count() | |
| with self.assertRaises(TypeError): | |
| socket.fromfd(fd, "not-a-valid-family", socket.SOCK_STREAM) | |
| with self.assertRaises(TypeError): | |
| socket.fromfd(fd, socket.AF_UNIX, "not-a-valid-type") | |
| with self.assertRaises(OverflowError): | |
| socket.fromfd(fd, socket.AF_UNIX, 1 << 100) | |
| self.assertEqual(os_helper.fd_count(), fd_count_before) | |
| def _testFromFdError(self): | |
| pass |
Remove the code comment and use a bare except, as requested. Rename the test to testFromFdError, flatten it and use os_helper.fd_count() so the descriptor count works on all platforms.
|
@lumenyr: Please sign the Python CLA: see #160579 (comment) comment. |
… review suggestion
socket.AF_UNIX is not defined in the Windows builds, so the test raised AttributeError before it reached either assertion. AF_INET is the family testFromFd already uses.
|
All three applied, thank you.
Checked both sides on a free-threading debug build: with the guard the test passes, and with the guard taken out it fails twice, one for each of the Separately: the account was renamed, which is why the CLA check asked again. It is signed and the bot is green now. |
vstinner
left a comment
There was a problem hiding this comment.
LGTM. Please just remove the outdated comment (second line of the PR).
There are warnings about AF_UNIX, but you already replaced it with AF_INET. I'm not sure why warnings are still there.
|
|
||
| def testFromFdError(self): | ||
| # Make sure that the fromfd() duplicated socket is closed on error. | ||
| # In debug mode, Python test suite checks for file descriptor leaks. |
There was a problem hiding this comment.
I'm sorry, I suggested this comment but then added os_helper.fd_count(). This comment can be removed.
|
Comment removed in 3cf12d1. On the AF_UNIX warnings: the |
|
Both done in 86b7495: the comment is gone, and the test now matches your snippet exactly, including |
socket.fromfd()duplicates the descriptor and then hands it to the constructor. If the constructor rejects its arguments, the duplicate has no owner and is never closed.That leaks 3 descriptors; with the change, 0. A valid call still returns a working socket and the descriptor count is unchanged.
The test counts
/proc/self/fdbefore and after one rejected call, so it is skipped where/procis absent. It passes on this branch and fails against unmodifiedLib/socket.pywithAssertionError: 7 != 6../python -m unittest test.test_socket.BasicTCPTest.testFromFdInvalidArgsDoesNotLeakis OK, andtest_socketis green on the free-threading debug build (run=755, skipped=50).NEWS entry included. No behaviour change on the success path.