]> git.meshlink.io Git - meshlink/blobdiff - src/discovery.c
Ensure only valid hostnames end up in the invitation URL.
[meshlink] / src / discovery.c
index 9064523c9c603222cd2e55bd8736a56c1f712ec5..ae2cf895d7d44c228b31319c3fa944d49189e7df 100644 (file)
@@ -221,7 +221,6 @@ static void discovery_resolve_callback(CattaSServiceResolver *resolver, CattaIfI
                        pthread_mutex_lock(&(mesh->mesh_mutex));
 
                        node_name += 1;
-                       node_fp += 1;
 
                        meshlink_node_t *node = meshlink_get_node(mesh, node_name);
 
@@ -341,6 +340,7 @@ static void discovery_log_cb(CattaLogLevel level, const char *txt) {
 }
 
 static void *discovery_loop(void *userdata) {
+       bool status = false;
        meshlink_handle_t *mesh = userdata;
        assert(mesh != NULL);
 
@@ -348,7 +348,21 @@ static void *discovery_loop(void *userdata) {
        catta_set_log_function(discovery_log_cb);
 
        // create service type string
-       size_t servicetype_strlen = sizeof(MESHLINK_MDNS_SERVICE_TYPE) + strlen(mesh->appname) + 1;
+       char appname[strlen(mesh->appname) + 2];
+       strcpy(appname, mesh->appname);
+
+       for(char *p = appname; *p; p++) {
+               if(!isalnum(*p) && *p != '_' && *p != '-') {
+                       *p = '_';
+               }
+       }
+
+       if(!appname[1]) {
+               appname[1] = '_';
+               appname[2] = '\0';
+       }
+
+       size_t servicetype_strlen = sizeof(MESHLINK_MDNS_SERVICE_TYPE) + strlen(appname) + 1;
        mesh->catta_servicetype = malloc(servicetype_strlen);
 
        if(mesh->catta_servicetype == NULL) {
@@ -356,7 +370,7 @@ static void *discovery_loop(void *userdata) {
                goto fail;
        }
 
-       snprintf(mesh->catta_servicetype, servicetype_strlen, MESHLINK_MDNS_SERVICE_TYPE, mesh->appname);
+       snprintf(mesh->catta_servicetype, servicetype_strlen, MESHLINK_MDNS_SERVICE_TYPE, appname);
 
        // Allocate discovery loop object
        if(!(mesh->catta_poll = catta_simple_poll_new())) {
@@ -397,13 +411,17 @@ static void *discovery_loop(void *userdata) {
                goto fail;
        }
 
+       status = true;
+
+fail:
+
        pthread_mutex_lock(&mesh->discovery_mutex);
        pthread_cond_broadcast(&mesh->discovery_cond);
        pthread_mutex_unlock(&mesh->discovery_mutex);
 
-       catta_simple_poll_loop(mesh->catta_poll);
-
-fail:
+       if(status) {
+               catta_simple_poll_loop(mesh->catta_poll);
+       }
 
        if(mesh->catta_browser != NULL) {
                catta_s_service_browser_free(mesh->catta_browser);