Skip to content

Commit f9e6b51

Browse files
cgrogregkh
authored andcommitted
staging: next: configfs: fix release link
The functions link_destroy and link_release are both deleting list items. link_release, however, does not check whether a certain link has already been deleted from the list by function link_destroy. By fixing this this patch prevents a kernel crash when removing the configuration directory of a link that already has been destroyed. Signed-off-by: Christian Gromm <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent b7935e5 commit f9e6b51

File tree

1 file changed

+19
-7
lines changed

1 file changed

+19
-7
lines changed

drivers/staging/most/configfs.c

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,8 @@ static ssize_t mdev_link_create_link_store(struct config_item *item,
128128
return ret;
129129
list_add_tail(&mdev_link->list, &mdev_link_list);
130130
mdev_link->create_link = tmp;
131+
mdev_link->destroy_link = false;
132+
131133
return count;
132134
}
133135

@@ -143,13 +145,16 @@ static ssize_t mdev_link_destroy_link_store(struct config_item *item,
143145
return ret;
144146
if (!tmp)
145147
return count;
146-
mdev_link->destroy_link = tmp;
148+
147149
ret = most_remove_link(mdev_link->device, mdev_link->channel,
148150
mdev_link->comp);
149151
if (ret)
150152
return ret;
151153
if (!list_empty(&mdev_link_list))
152154
list_del(&mdev_link->list);
155+
156+
mdev_link->destroy_link = tmp;
157+
153158
return count;
154159
}
155160

@@ -378,13 +383,20 @@ static void mdev_link_release(struct config_item *item)
378383
struct mdev_link *mdev_link = to_mdev_link(item);
379384
int ret;
380385

381-
if (!list_empty(&mdev_link_list)) {
382-
ret = most_remove_link(mdev_link->device, mdev_link->channel,
383-
mdev_link->comp);
384-
if (ret && (ret != -ENODEV))
385-
pr_err("Removing link failed.\n");
386-
list_del(&mdev_link->list);
386+
if (mdev_link->destroy_link)
387+
goto free_item;
388+
389+
ret = most_remove_link(mdev_link->device, mdev_link->channel,
390+
mdev_link->comp);
391+
if (ret) {
392+
pr_err("Removing link failed.\n");
393+
goto free_item;
387394
}
395+
396+
if (!list_empty(&mdev_link_list))
397+
list_del(&mdev_link->list);
398+
399+
free_item:
388400
kfree(to_mdev_link(item));
389401
}
390402

0 commit comments

Comments
 (0)