utcp_abort_all_connections() was called when a node is blacklisted or a
a node reconnects with a different session ID. In both cases, all active
channels should be closed. However, utcp_abort_all_connections() also freed
the UTCP connection object, which would cause a double free when the
application freed the corresponding meshlink_channel object.
Rename utcp_abort_all_connections() to utcp_reset_all_connections(), and
have it not invalidate any handles.
n->session_id = n->prevedge->reverse->session_id;
if(n->utcp) {
- utcp_abort_all_connections(n->utcp);
+ utcp_reset_all_connections(n->utcp);
}
n->status.validkey = false;
}
}
- utcp_abort_all_connections(n->utcp);
+ utcp_reset_all_connections(n->utcp);
n->mtu = 0;
n->minmtu = 0;
buffer_clear(&c->sndbuf);
buffer_clear(&c->rcvbuf);
- c->recv = NULL;
- c->poll = NULL;
-
switch(c->state) {
case CLOSED:
return true;
c->reapable = true;
}
-// Closes all the opened connections
-void utcp_abort_all_connections(struct utcp *utcp) {
+// Resets all connections, but does not invalidate connection handles
+void utcp_reset_all_connections(struct utcp *utcp) {
if(!utcp) {
errno = EINVAL;
return;
continue;
}
- utcp_recv_t old_recv = c->recv;
- utcp_poll_t old_poll = c->poll;
+ reset_connection(c);
- utcp_abort(c);
-
- if(old_recv) {
+ if(c->recv) {
errno = 0;
- old_recv(c, NULL, 0);
+ c->recv(c, NULL, 0);
}
- if(old_poll && !c->reapable) {
+ if(c->poll && !c->reapable) {
errno = 0;
- old_poll(c, 0);
+ c->poll(c, 0);
}
}
void utcp_set_poll_cb(struct utcp_connection *connection, utcp_poll_t poll);
void utcp_set_accept_cb(struct utcp *utcp, utcp_accept_t accept, utcp_listen_t listen);
bool utcp_is_active(struct utcp *utcp);
-void utcp_abort_all_connections(struct utcp *utcp);
+void utcp_reset_all_connections(struct utcp *utcp);
// Global socket options