From 300a27de99e01f1b7a360bc1a9e210473a121195 Mon Sep 17 00:00:00 2001 From: Johan Wikman <johan.wikman@nokia.com> Date: Fri, 7 Nov 2014 15:48:23 +0200 Subject: [PATCH] If socket is about to be closed do not add to [read|write]_set. If NSG_CLOSE_IMMEDIATELY is on, then the socket will be closed, which means that (if the socket was added to either read_set or write_set) the subsequent select will in turn be performed on a socket that has been closed. Standard socket implementations seem to ignore a descriptor referring to a closed socket but LWIP (http://savannah.nongnu.org/projects/lwip/) crashes. So better not to add to the sets. --- mongoose.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/mongoose.c b/mongoose.c index bf13c0e14..543dc4c75 100644 --- a/mongoose.c +++ b/mongoose.c @@ -1024,18 +1024,19 @@ time_t ns_mgr_poll(struct ns_mgr *mgr, int milli) { if (!(conn->flags & (NSF_LISTENING | NSF_CONNECTING))) { ns_call(conn, NS_POLL, ¤t_time); } - if (!(conn->flags & NSF_WANT_WRITE)) { - //DBG(("%p read_set", conn)); - ns_add_to_set(conn->sock, &read_set, &max_fd); - } - if (((conn->flags & NSF_CONNECTING) && !(conn->flags & NSF_WANT_READ)) || - (conn->send_iobuf.len > 0 && !(conn->flags & NSF_CONNECTING) && - !(conn->flags & NSF_BUFFER_BUT_DONT_SEND))) { - //DBG(("%p write_set", conn)); - ns_add_to_set(conn->sock, &write_set, &max_fd); - } if (conn->flags & NSF_CLOSE_IMMEDIATELY) { ns_close_conn(conn); + } else { + if (!(conn->flags & NSF_WANT_WRITE)) { + //DBG(("%p read_set", conn)); + ns_add_to_set(conn->sock, &read_set, &max_fd); + } + if (((conn->flags & NSF_CONNECTING) && !(conn->flags & NSF_WANT_READ)) || + (conn->send_iobuf.len > 0 && !(conn->flags & NSF_CONNECTING) && + !(conn->flags & NSF_BUFFER_BUT_DONT_SEND))) { + //DBG(("%p write_set", conn)); + ns_add_to_set(conn->sock, &write_set, &max_fd); + } } } -- GitLab