Fix: relayd: unchecked allocation result of unlinked file pool
[lttng-tools.git] / src / common / fd-tracker / inode.c
index 0e1ebc6ff5dc51b2fe93ea7208c13ac17f5136c6..f105f5bd334df020e3d4800257ca3c0690f072eb 100644 (file)
@@ -133,6 +133,12 @@ static int lttng_unlinked_file_pool_add_inode(
                }
                pool->unlink_directory_handle = lttng_directory_handle_create(
                                pool->unlink_directory_path);
+               if (!pool->unlink_directory_handle) {
+                       ERR("Failed to create directory handle to unlinked file pool at %s",
+                                       pool->unlink_directory_path);
+                       ret = -1;
+                       goto end;
+               }
        }
 
        ret = lttng_directory_handle_rename(inode->location.directory_handle,
@@ -239,11 +245,15 @@ static void lttng_inode_get(struct lttng_inode *inode)
        urcu_ref_get(&inode->ref);
 }
 
-struct lttng_unlinked_file_pool *lttng_unlinked_file_pool_create(
+LTTNG_HIDDEN struct lttng_unlinked_file_pool *lttng_unlinked_file_pool_create(
                const char *path)
 {
        struct lttng_unlinked_file_pool *pool = zmalloc(sizeof(*pool));
 
+       if (!pool) {
+               goto error;
+       }
+
        if (!path || *path != '/') {
                ERR("Unlinked file pool must be created with an absolute path, path = \"%s\"",
                                path ? path : "NULL");
@@ -262,7 +272,7 @@ error:
        return NULL;
 }
 
-void lttng_unlinked_file_pool_destroy(
+LTTNG_HIDDEN void lttng_unlinked_file_pool_destroy(
                struct lttng_unlinked_file_pool *pool)
 {
        if (!pool) {
@@ -275,12 +285,25 @@ void lttng_unlinked_file_pool_destroy(
        free(pool);
 }
 
-void lttng_inode_put(struct lttng_inode *inode)
+LTTNG_HIDDEN void lttng_inode_put(struct lttng_inode *inode)
 {
        urcu_ref_put(&inode->ref, lttng_inode_release);
 }
 
-void lttng_inode_get_location(struct lttng_inode *inode,
+LTTNG_HIDDEN struct lttng_directory_handle *
+lttng_inode_get_location_directory_handle(
+               struct lttng_inode *inode)
+{
+       if (inode->location.directory_handle) {
+               const bool reference_acquired = lttng_directory_handle_get(
+                               inode->location.directory_handle);
+
+               assert(reference_acquired);
+       }
+       return inode->location.directory_handle;
+}
+
+LTTNG_HIDDEN void lttng_inode_borrow_location(struct lttng_inode *inode,
                const struct lttng_directory_handle **out_directory_handle,
                const char **out_path)
 {
@@ -292,7 +315,7 @@ void lttng_inode_get_location(struct lttng_inode *inode,
        }
 }
 
-int lttng_inode_rename(
+LTTNG_HIDDEN int lttng_inode_rename(
                struct lttng_inode *inode,
                struct lttng_directory_handle *old_directory_handle,
                const char *old_path,
@@ -362,7 +385,7 @@ end:
        return ret;
 }
 
-int lttng_inode_unlink(struct lttng_inode *inode)
+LTTNG_HIDDEN int lttng_inode_unlink(struct lttng_inode *inode)
 {
        int ret = 0;
 
@@ -428,7 +451,7 @@ end:
        return inode;
 }
 
-struct lttng_inode_registry *lttng_inode_registry_create(void)
+LTTNG_HIDDEN struct lttng_inode_registry *lttng_inode_registry_create(void)
 {
        struct lttng_inode_registry *registry = zmalloc(sizeof(*registry));
 
@@ -455,7 +478,8 @@ error:
        return NULL;
 }
 
-void lttng_inode_registry_destroy(struct lttng_inode_registry *registry)
+LTTNG_HIDDEN void lttng_inode_registry_destroy(
+               struct lttng_inode_registry *registry)
 {
        if (!registry) {
                return;
@@ -468,7 +492,7 @@ void lttng_inode_registry_destroy(struct lttng_inode_registry *registry)
        free(registry);
 }
 
-struct lttng_inode *lttng_inode_registry_get_inode(
+LTTNG_HIDDEN struct lttng_inode *lttng_inode_registry_get_inode(
                struct lttng_inode_registry *registry,
                struct lttng_directory_handle *handle,
                const char *path,
@@ -504,6 +528,10 @@ struct lttng_inode *lttng_inode_registry_get_inode(
 
        inode = lttng_inode_create(&id, registry->inodes, unlinked_file_pool,
                        handle, path);
+       if (!inode) {
+               goto end_unlock;
+       }
+
        node = cds_lfht_add_unique(registry->inodes,
                        lttng_inode_id_hash(&inode->id), lttng_inode_match,
                        &inode->id, &inode->registry_node);
This page took 0.025557 seconds and 5 git commands to generate.