]> git.meshlink.io Git - meshlink/commitdiff
Prevent meshlink_join() when the joining node is already part of a mesh.
authorGuus Sliepen <guus@meshlink.io>
Thu, 4 Jul 2019 18:40:09 +0000 (20:40 +0200)
committerGuus Sliepen <guus@meshlink.io>
Thu, 4 Jul 2019 18:40:09 +0000 (20:40 +0200)
src/meshlink.c
test/invite-join.c

index 9b13dca1652d22658f282be6cfbfbce02c81357e..302624fc5d0944cdd53934bd272a11d942ee8d65 100644 (file)
@@ -2310,7 +2310,15 @@ bool meshlink_join(meshlink_handle_t *mesh, const char *invitation) {
 
        //Before doing meshlink_join make sure we are not connected to another mesh
        if(mesh->threadstarted) {
 
        //Before doing meshlink_join make sure we are not connected to another mesh
        if(mesh->threadstarted) {
-               logger(mesh, MESHLINK_DEBUG, "Already connected to a mesh\n");
+               logger(mesh, MESHLINK_ERROR, "Cannot join while started\n");
+               meshlink_errno = MESHLINK_EINVAL;
+               pthread_mutex_unlock(&(mesh->mesh_mutex));
+               return false;
+       }
+
+       // Refuse to join a mesh if we are already part of one. We are part of one if we know at least one other node.
+       if(mesh->nodes->count > 1) {
+               logger(mesh, MESHLINK_ERROR, "Already part of an existing mesh\n");
                meshlink_errno = MESHLINK_EINVAL;
                pthread_mutex_unlock(&(mesh->mesh_mutex));
                return false;
                meshlink_errno = MESHLINK_EINVAL;
                pthread_mutex_unlock(&(mesh->mesh_mutex));
                return false;
index b69eb3d87a267179cc560d212da2706dc6fd6ca5..52a922a89a9509695639dd88e90623255e039884 100644 (file)
@@ -106,8 +106,6 @@ int main() {
                return 1;
        }
 
                return 1;
        }
 
-       free(baz_url);
-
        if(!meshlink_start(mesh2)) {
                fprintf(stderr, "Baz could not start\n");
                return 1;
        if(!meshlink_start(mesh2)) {
                fprintf(stderr, "Baz could not start\n");
                return 1;
@@ -140,6 +138,15 @@ int main() {
                return 1;
        }
 
                return 1;
        }
 
+       // Check that an invitation cannot be used twice
+
+       if(meshlink_join(mesh3, baz_url)) {
+               fprintf(stderr, "Quux could join foo's mesh using an already used invitation\n");
+               return 1;
+       }
+
+       free(baz_url);
+
        // Check that nodes cannot join with expired invitations
 
        meshlink_set_invitation_timeout(mesh1, 0);
        // Check that nodes cannot join with expired invitations
 
        meshlink_set_invitation_timeout(mesh1, 0);
@@ -151,6 +158,31 @@ int main() {
 
        free(quux_url);
 
 
        free(quux_url);
 
+       // Check that existing nodes cannot join another mesh
+
+       char *corge_url = meshlink_invite(mesh3, NULL, "corge");
+
+       if(!corge_url) {
+               fprintf(stderr, "Quux could not generate an invitation for corge\n");
+               return 1;
+       }
+
+       fprintf(stderr, "Invitation URL for corge: %s\n", corge_url);
+
+       if(!meshlink_start(mesh3)) {
+               fprintf(stderr, "Quux could not start\n");
+               return 1;
+       }
+
+       meshlink_stop(mesh2);
+
+       if(meshlink_join(mesh2, corge_url)) {
+               fprintf(stderr, "Bar could join twice\n");
+               return 1;
+       }
+
+       free(corge_url);
+
        // Clean up.
 
        meshlink_close(mesh3);
        // Clean up.
 
        meshlink_close(mesh3);