Skip to content

Commit f5ce3bc

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 <mlombard@bsdbackstore.eu> Signed-off-by: Daniel Wagner <dwagner@suse.de>
1 parent abe29d0 commit f5ce3bc

File tree

1 file changed

+7
-8
lines changed

1 file changed

+7
-8
lines changed

libnvme/src/nvme/tree.c

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

638638
static void __nvme_free_ns(struct nvme_ns *n)
639639
{
640+
struct nvme_path *p, *_p;
641+
640642
list_del_init(&n->entry);
641643
nvme_ns_release_transport_handle(n);
642644
free(n->generic_name);
643645
free(n->name);
644646
free(n->sysfs_dir);
647+
nvme_namespace_for_each_path_safe(n, p, _p) {
648+
list_del_init(&p->nentry);
649+
p->n = NULL;
650+
}
651+
list_head_init(&n->head->paths);
645652
free(n->head->sysfs_dir);
646653
free(n->head);
647654
free(n);
@@ -2992,16 +2999,8 @@ static int nvme_subsystem_scan_namespace(struct nvme_global_ctx *ctx, nvme_subsy
29922999
return ret;
29933000
}
29943001
nvme_subsystem_for_each_ns_safe(s, _n, __n) {
2995-
struct nvme_path *p, *_p;
2996-
29973002
if (strcmp(n->name, _n->name))
29983003
continue;
2999-
/* Detach paths */
3000-
nvme_namespace_for_each_path_safe(_n, p, _p) {
3001-
list_del_init(&p->nentry);
3002-
p->n = NULL;
3003-
}
3004-
list_head_init(&_n->head->paths);
30053004
__nvme_free_ns(_n);
30063005
}
30073006
n->s = s;

0 commit comments

Comments
 (0)