]> git.meshlink.io Git - meshlink/commitdiff
Don't call terminate_connection() from meshlink_blacklist().
authorGuus Sliepen <guus@meshlink.io>
Mon, 28 Oct 2019 20:14:17 +0000 (21:14 +0100)
committerGuus Sliepen <guus@meshlink.io>
Mon, 28 Oct 2019 20:14:17 +0000 (21:14 +0100)
If meshlink_blacklist() is called from a callback function, this can result
in a use-after-free bug. Instead, shut down the socket, so the event loop
will take care of it.

src/meshlink.c

index 98e02f7db623d8c8b4e837eb96e77f23580fddd8..dd571190d86f53b46965e7e2f2aa5be0dd62a174 100644 (file)
@@ -2831,10 +2831,12 @@ void meshlink_blacklist(meshlink_handle_t *mesh, meshlink_node_t *node) {
 
        logger(mesh, MESHLINK_DEBUG, "Blacklisted %s.\n", node->name);
 
-       //Immediately terminate any connections we have with the blacklisted node
+       /* Immediately shut down any connections we have with the blacklisted node.
+        * We can't call terminate_connection(), because we might be called from a callback function.
+        */
        for list_each(connection_t, c, mesh->connections) {
                if(c->node == n) {
-                       terminate_connection(mesh, c, c->status.active);
+                       shutdown(c->socket, SHUT_RDWR);
                }
        }
 
@@ -2846,10 +2848,6 @@ void meshlink_blacklist(meshlink_handle_t *mesh, meshlink_node_t *node) {
        n->mtuprobes = 0;
        n->status.udp_confirmed = false;
 
-       if(n->status.reachable) {
-               update_node_status(mesh, n);
-       }
-
        pthread_mutex_unlock(&mesh->mutex);
 }