mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 11:41:38 -04:00
nbd: fix use after free on module unload
list_for_each_entry() isn't super safe if we're freeing the objects while we traverse the list. Also don't bother taking the extra reference, the module refcounting stuff will save us from having anybody messing with the device while we're trying to unload. Reported-by: Ming Lei <[email protected]> Signed-off-by: Josef Bacik <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
This commit is contained in:
parent
bf290f8f98
commit
60ae36ad03
1 changed files with 4 additions and 4 deletions
|
|
@ -2090,7 +2090,6 @@ static int nbd_exit_cb(int id, void *ptr, void *data)
|
|||
struct list_head *list = (struct list_head *)data;
|
||||
struct nbd_device *nbd = ptr;
|
||||
|
||||
refcount_inc(&nbd->refs);
|
||||
list_add_tail(&nbd->list, list);
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -2106,11 +2105,12 @@ static void __exit nbd_cleanup(void)
|
|||
idr_for_each(&nbd_index_idr, &nbd_exit_cb, &del_list);
|
||||
mutex_unlock(&nbd_index_mutex);
|
||||
|
||||
list_for_each_entry(nbd, &del_list, list) {
|
||||
if (refcount_read(&nbd->refs) != 2)
|
||||
while (!list_empty(&del_list)) {
|
||||
nbd = list_first_entry(&del_list, struct nbd_device, list);
|
||||
list_del_init(&nbd->list);
|
||||
if (refcount_read(&nbd->refs) != 1)
|
||||
printk(KERN_ERR "nbd: possibly leaking a device\n");
|
||||
nbd_put(nbd);
|
||||
nbd_put(nbd);
|
||||
}
|
||||
|
||||
idr_destroy(&nbd_index_idr);
|
||||
|
|
|
|||
Loading…
Reference in a new issue