[PATCH] IB: fix use-after-free in user verbs cleanup

Fix a use-after-free bug in userspace verbs cleanup: we can't touch
mr->device after we free mr by calling ib_dereg_mr().

Signed-off-by: Roland Dreier <rolandd@cisco.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>

authored by Roland Dreier and committed by Linus Torvalds e1bcfcaa 1c9cf6f9

+2 -1
+2 -1
drivers/infiniband/core/uverbs_main.c
··· 130 131 list_for_each_entry_safe(uobj, tmp, &context->mr_list, list) { 132 struct ib_mr *mr = idr_find(&ib_uverbs_mr_idr, uobj->id); 133 struct ib_umem_object *memobj; 134 135 idr_remove(&ib_uverbs_mr_idr, uobj->id); 136 ib_dereg_mr(mr); 137 138 memobj = container_of(uobj, struct ib_umem_object, uobject); 139 - ib_umem_release_on_close(mr->device, &memobj->umem); 140 141 list_del(&uobj->list); 142 kfree(memobj);
··· 130 131 list_for_each_entry_safe(uobj, tmp, &context->mr_list, list) { 132 struct ib_mr *mr = idr_find(&ib_uverbs_mr_idr, uobj->id); 133 + struct ib_device *mrdev = mr->device; 134 struct ib_umem_object *memobj; 135 136 idr_remove(&ib_uverbs_mr_idr, uobj->id); 137 ib_dereg_mr(mr); 138 139 memobj = container_of(uobj, struct ib_umem_object, uobject); 140 + ib_umem_release_on_close(mrdev, &memobj->umem); 141 142 list_del(&uobj->list); 143 kfree(memobj);