unix/modsocket: Set file descriptor to -1 on close.

After s.close(), s.fileno() now returns -1, matching CPython behavior.
Some code relies on this compatibility, as it allows checking whether
a socket is closed by testing its fileno() value. This change ensures
better interoperability with existing Python code and libraries.

Signed-off-by: Mike Wang <mikewang000000@gmail.com>
This commit is contained in:
Mike Wang
2025-09-21 01:44:59 +08:00
committed by Damien George
parent a277fe4a36
commit cf097932a2
2 changed files with 23 additions and 3 deletions

View File

@@ -140,9 +140,12 @@ static mp_uint_t socket_ioctl(mp_obj_t o_in, mp_uint_t request, uintptr_t arg, i
// The rationale MicroPython follows is that close() just releases
// file descriptor. If you're interested to catch I/O errors before
// closing fd, fsync() it.
MP_THREAD_GIL_EXIT();
close(self->fd);
MP_THREAD_GIL_ENTER();
if (self->fd >= 0) {
MP_THREAD_GIL_EXIT();
close(self->fd);
MP_THREAD_GIL_ENTER();
}
self->fd = -1;
return 0;
case MP_STREAM_GET_FILENO:

View File

@@ -0,0 +1,17 @@
# Test socket.fileno() functionality
try:
import socket
except ImportError:
print("SKIP")
raise SystemExit
if not hasattr(socket.socket, "fileno"):
print("SKIP")
raise SystemExit
s = socket.socket()
print(s.fileno() >= 0)
s.close()
print(s.fileno()) # should print -1