Fix: Bad return error code handling
[lttng-tools.git] / src / bin / lttng-sessiond / ust-app.c
index c93f93dc9add8333c07470688ae95f14a8f1ec80..e0562ed4e5448d2e184b288481fad0e80bb77b0b 100644 (file)
@@ -976,9 +976,10 @@ static struct ust_app_session *create_ust_app_session(
                ret = ustctl_create_session(app->sock);
                if (ret < 0) {
                        ERR("Creating session for app pid %d", app->pid);
+                       delete_ust_app_session(-1, ua_sess);
                        /* This means that the tracer is gone... */
                        ua_sess = (void*) -1UL;
-                       goto error;
+                       goto end;
                }
 
                ua_sess->handle = ret;
@@ -993,11 +994,6 @@ static struct ust_app_session *create_ust_app_session(
 end:
        health_code_update(&health_thread_cmd);
        return ua_sess;
-
-error:
-       delete_ust_app_session(-1, ua_sess);
-       health_code_update(&health_thread_cmd);
-       return NULL;
 }
 
 /*
@@ -1510,8 +1506,16 @@ void ust_app_unregister(int sock)
        /* Assign second node for deletion */
        iter.iter.node = &lta->pid_n.node;
 
+       /*
+        * Ignore return value since the node might have been removed before by an
+        * add replace during app registration because the PID can be reassigned by
+        * the OS.
+        */
        ret = lttng_ht_del(ust_app_ht, &iter);
-       assert(!ret);
+       if (ret) {
+               DBG3("Unregister app by PID %d failed. This can happen on pid reuse",
+                               lta->pid);
+       }
 
        /* Free memory */
        call_rcu(&lta->pid_n.head, delete_ust_app_rcu);
@@ -1702,21 +1706,22 @@ error:
 void ust_app_clean_list(void)
 {
        int ret;
+       struct ust_app *app;
        struct lttng_ht_iter iter;
-       struct lttng_ht_node_ulong *node;
 
        DBG2("UST app cleaning registered apps hash table");
 
        rcu_read_lock();
 
-       cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, node, node) {
+       cds_lfht_for_each_entry(ust_app_ht->ht, &iter.iter, app, pid_n.node) {
                ret = lttng_ht_del(ust_app_ht, &iter);
                assert(!ret);
-               call_rcu(&node->head, delete_ust_app_rcu);
+               call_rcu(&app->pid_n.head, delete_ust_app_rcu);
        }
 
        /* Cleanup socket hash table */
-       cds_lfht_for_each_entry(ust_app_ht_by_sock->ht, &iter.iter, node, node) {
+       cds_lfht_for_each_entry(ust_app_ht_by_sock->ht, &iter.iter, app,
+                       sock_n.node) {
                ret = lttng_ht_del(ust_app_ht_by_sock, &iter);
                assert(!ret);
        }
@@ -2558,7 +2563,8 @@ void ust_app_global_update(struct ltt_ust_session *usess, int sock)
        }
 
        ua_sess = create_ust_app_session(usess, app);
-       if (ua_sess == NULL) {
+       if (ua_sess == NULL || ua_sess == (void *) -1UL) {
+               /* Tracer is gone for this session and has been freed */
                goto error;
        }
 
This page took 0.025363 seconds and 4 git commands to generate.