summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorDamien George <damien.p.george@gmail.com>2019-10-16 17:24:40 +1100
committerDamien George <damien.p.george@gmail.com>2019-10-31 12:54:37 +1100
commitfeaa2516742ed4f9032a0233dcec922ac6a4e80c (patch)
treea463aa178413edef560db27a5541abd3697ee760
parentd3c383de79bd25b42339cc7a4c68b79e39eccc7c (diff)
downloadmicropython-feaa2516742ed4f9032a0233dcec922ac6a4e80c.tar.gz
micropython-feaa2516742ed4f9032a0233dcec922ac6a4e80c.zip
extmod/modlwip: Make socket poll return POLLNVAL in case of bad file.
-rw-r--r--extmod/modlwip.c2
-rw-r--r--tests/extmod/uselect_poll_basic.py6
2 files changed, 8 insertions, 0 deletions
diff --git a/extmod/modlwip.c b/extmod/modlwip.c
index cd0f6946cd..1e9b8c4590 100644
--- a/extmod/modlwip.c
+++ b/extmod/modlwip.c
@@ -1477,6 +1477,8 @@ STATIC mp_uint_t lwip_socket_ioctl(mp_obj_t self_in, mp_uint_t request, uintptr_
} else if (socket->state == ERR_RST) {
// Socket was reset by peer, a write will return an error
ret |= flags & (MP_STREAM_POLL_WR | MP_STREAM_POLL_HUP);
+ } else if (socket->state == _ERR_BADF) {
+ ret |= MP_STREAM_POLL_NVAL;
} else if (socket->state < 0) {
// Socket in some other error state, use catch-all ERR flag
// TODO: may need to set other return flags here
diff --git a/tests/extmod/uselect_poll_basic.py b/tests/extmod/uselect_poll_basic.py
index df52471ac3..82a7195c03 100644
--- a/tests/extmod/uselect_poll_basic.py
+++ b/tests/extmod/uselect_poll_basic.py
@@ -33,3 +33,9 @@ try:
poller.modify(s, select.POLLIN)
except OSError as e:
assert e.args[0] == errno.ENOENT
+
+# poll after closing the socket, should return POLLNVAL
+poller.register(s)
+s.close()
+p = poller.poll(0)
+print(len(p), p[0][-1])