mirror of
https://github.com/cesanta/mongoose.git
synced 2026-10-16 10:39:49 +00:00
Fix connection management bugs in mg_lwip_if
* Do not set MG_F_SSL ona connection until it's been fully accepted (MG_SIG_ACCEPT is handled). This fixes a crash when SSL connection is polled before it's fully initialized. * Fix mg_lwip_tcp_error_cb to NULL out tcp_pcb pointer even if mg_connection is already shutting down. After mg_lwip_tcp_error_cb, tcp_pcb pointer can no longer be used and doesn't need to be freed. This fixes https://github.com/cesanta/mongoose-os/issues/545
This commit is contained in:
1 parent
70034b5873
commit
2fbfe61c37
3 files changed
+4
-4
No files matched your search
+2
-2
@@ -2757,7 +2757,6 @@ struct mg_connection *mg_if_accept_new_conn(struct mg_connection *lc) {
|
||||
nc->user_data = lc->user_data;
|
||||
nc->recv_mbuf_limit = lc->recv_mbuf_limit;
|
||||
nc->iface = lc->iface;
|
||||
if (lc->flags & MG_F_SSL) nc->flags |= MG_F_SSL;
|
||||
mg_add_conn(nc->mgr, nc);
|
||||
LOG(LL_DEBUG, ("%p %p %d %#x", lc, nc, (int) nc->sock, (int) nc->flags));
|
||||
return nc;
|
||||
@@ -15005,9 +15004,10 @@ static err_t mg_lwip_tcp_conn_cb(void *arg, struct tcp_pcb *tpcb, err_t err) {
|
||||
static void mg_lwip_tcp_error_cb(void *arg, err_t err) {
|
||||
struct mg_connection *nc = (struct mg_connection *) arg;
|
||||
DBG(("%p conn error %d", nc, (int) err));
|
||||
if (nc == NULL || (nc->flags & MG_F_CLOSE_IMMEDIATELY)) return;
|
||||
if (nc == NULL) return;
|
||||
struct mg_lwip_conn_state *cs = (struct mg_lwip_conn_state *) nc->sock;
|
||||
cs->pcb.tcp = NULL; /* Has already been deallocated */
|
||||
if (nc->flags & MG_F_CLOSE_IMMEDIATELY) return;
|
||||
if (nc->flags & MG_F_CONNECTING) {
|
||||
cs->err = err;
|
||||
mg_lwip_post_signal(MG_SIG_CONNECT_RESULT, nc);
|
||||
|
||||
@@ -138,9 +138,10 @@ static err_t mg_lwip_tcp_conn_cb(void *arg, struct tcp_pcb *tpcb, err_t err) {
|
||||
static void mg_lwip_tcp_error_cb(void *arg, err_t err) {
|
||||
struct mg_connection *nc = (struct mg_connection *) arg;
|
||||
DBG(("%p conn error %d", nc, (int) err));
|
||||
if (nc == NULL || (nc->flags & MG_F_CLOSE_IMMEDIATELY)) return;
|
||||
if (nc == NULL) return;
|
||||
struct mg_lwip_conn_state *cs = (struct mg_lwip_conn_state *) nc->sock;
|
||||
cs->pcb.tcp = NULL; /* Has already been deallocated */
|
||||
if (nc->flags & MG_F_CLOSE_IMMEDIATELY) return;
|
||||
if (nc->flags & MG_F_CONNECTING) {
|
||||
cs->err = err;
|
||||
mg_lwip_post_signal(MG_SIG_CONNECT_RESULT, nc);
|
||||
|
||||
@@ -521,7 +521,6 @@ struct mg_connection *mg_if_accept_new_conn(struct mg_connection *lc) {
|
||||
nc->user_data = lc->user_data;
|
||||
nc->recv_mbuf_limit = lc->recv_mbuf_limit;
|
||||
nc->iface = lc->iface;
|
||||
if (lc->flags & MG_F_SSL) nc->flags |= MG_F_SSL;
|
||||
mg_add_conn(nc->mgr, nc);
|
||||
LOG(LL_DEBUG, ("%p %p %d %#x", lc, nc, (int) nc->sock, (int) nc->flags));
|
||||
return nc;
|
||||
|
||||
Reference in new issue
Block a user