X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=src%2Flttng-tracker-id.c;h=4fc23b85d7e1adeeb16bd7291ecbb044df60a83a;hb=e8c0bbd373ddb18f409f6ac3c9d00dfebdab74ef;hp=205c4af4d9dffb5e2af65f0a0a5c9f78d967f106;hpb=cfa6cc1d0f01c2cfcc1a679abf3a6572d411c309;p=lttng-modules.git diff --git a/src/lttng-tracker-id.c b/src/lttng-tracker-id.c index 205c4af4..4fc23b85 100644 --- a/src/lttng-tracker-id.c +++ b/src/lttng-tracker-id.c @@ -19,6 +19,7 @@ #include #include #include +#include /* * Hash table is allocated and freed when there are no possible @@ -75,6 +76,7 @@ int lttng_id_tracker_add(struct lttng_id_tracker *lf, int id) struct lttng_id_tracker_rcu *p = lf->p; uint32_t hash = hash_32(id, 32); bool allocated = false; + int ret; if (!p) { p = lttng_id_tracker_rcu_create(); @@ -84,18 +86,28 @@ int lttng_id_tracker_add(struct lttng_id_tracker *lf, int id) } head = &p->id_hash[hash & (LTTNG_ID_TABLE_SIZE - 1)]; lttng_hlist_for_each_entry(e, head, hlist) { - if (id == e->id) - return -EEXIST; + if (id == e->id) { + ret = -EEXIST; + goto error; + } } e = kmalloc(sizeof(struct lttng_id_hash_node), GFP_KERNEL); - if (!e) - return -ENOMEM; + if (!e) { + ret = -ENOMEM; + goto error; + } e->id = id; hlist_add_head_rcu(&e->hlist, head); if (allocated) { rcu_assign_pointer(lf->p, p); } return 0; + +error: + if (allocated) { + kfree(p); + } + return ret; } static