Skip to content

Commit 4e3fa2e

Browse files
dwsuseigaw
authored andcommitted
tree: cleanup paths when freeing namespace
When freeing a namespace object it's also necessary to update all the paths pointing to the namespace in order to avoid UAF. Reported-by: Maurizio Lombardi <[email protected]> Signed-off-by: Daniel Wagner <[email protected]>
1 parent 5be98d6 commit 4e3fa2e

1 file changed

Lines changed: 7 additions & 8 deletions

File tree

libnvme/src/nvme/tree.c

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -632,11 +632,18 @@ nvme_path_t nvme_namespace_next_path(nvme_ns_t ns, nvme_path_t p)
632632

633633
static void __nvme_free_ns(struct nvme_ns *n)
634634
{
635+
struct nvme_path *p, *_p;
636+
635637
list_del_init(&n->entry);
636638
nvme_ns_release_transport_handle(n);
637639
free(n->generic_name);
638640
free(n->name);
639641
free(n->sysfs_dir);
642+
nvme_namespace_for_each_path_safe(n, p, _p) {
643+
list_del_init(&p->nentry);
644+
p->n = NULL;
645+
}
646+
list_head_init(&n->head->paths);
640647
free(n->head->sysfs_dir);
641648
free(n->head);
642649
free(n);
@@ -3001,16 +3008,8 @@ static int nvme_subsystem_scan_namespace(struct nvme_global_ctx *ctx, nvme_subsy
30013008
return ret;
30023009
}
30033010
nvme_subsystem_for_each_ns_safe(s, _n, __n) {
3004-
struct nvme_path *p, *_p;
3005-
30063011
if (strcmp(n->name, _n->name))
30073012
continue;
3008-
/* Detach paths */
3009-
nvme_namespace_for_each_path_safe(_n, p, _p) {
3010-
list_del_init(&p->nentry);
3011-
p->n = NULL;
3012-
}
3013-
list_head_init(&_n->head->paths);
30143013
__nvme_free_ns(_n);
30153014
}
30163015
n->s = s;

0 commit comments

Comments
 (0)