diff options
| -rw-r--r-- | ports/unix/modsocket.c | 9 | ||||
| -rw-r--r-- | tests/extmod/socket_fileno.py | 17 |
2 files changed, 23 insertions, 3 deletions
diff --git a/ports/unix/modsocket.c b/ports/unix/modsocket.c index 14f321d34..e7f25cdd4 100644 --- a/ports/unix/modsocket.c +++ b/ports/unix/modsocket.c @@ -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: diff --git a/tests/extmod/socket_fileno.py b/tests/extmod/socket_fileno.py new file mode 100644 index 000000000..da15825e3 --- /dev/null +++ b/tests/extmod/socket_fileno.py @@ -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 |
