IB/nes: Return an error on ib_copy_from_udata() failure instead of NULL
authorYann Droneaud <ydroneaud@opteya.com>
Mon, 10 Mar 2014 22:06:27 +0000 (23:06 +0100)
committerRoland Dreier <roland@purestorage.com>
Mon, 17 Mar 2014 23:20:28 +0000 (16:20 -0700)
commit9d194d1025f463392feafa26ff8c2d8247f71be1
treeccb9dbba79c9bf2b7ec0395a7defc68704471fd0
parent06064a103f6bd5b409ffed6248983270c0681c21
IB/nes: Return an error on ib_copy_from_udata() failure instead of NULL

In case of error while accessing to userspace memory, function
nes_create_qp() returns NULL instead of an error code wrapped through
ERR_PTR().  But NULL is not expected by ib_uverbs_create_qp(), as it
check for error with IS_ERR().

As page 0 is likely not mapped, it is going to trigger an Oops when
the kernel will try to dereference NULL pointer to access to struct
ib_qp's fields.

In some rare cases, page 0 could be mapped by userspace, which could
turn this bug to a vulnerability that could be exploited: the function
pointers in struct ib_device will be under userspace total control.

This was caught when using spatch (aka. coccinelle)
to rewrite calls to ib_copy_{from,to}_udata().

Link: https://www.gitorious.org/opteya/ib-hw-nes-create-qp-null
Link: https://www.gitorious.org/opteya/coccib/source/75ebf2c1033c64c1d81df13e4ae44ee99c989eba:ib_copy_udata.cocci
Link: http://marc.info/?i=cover.1394485254.git.ydroneaud@opteya.com
Cc: <stable@vger.kernel.org>
Signed-off-by: Yann Droneaud <ydroneaud@opteya.com>
Signed-off-by: Roland Dreier <roland@purestorage.com>
drivers/infiniband/hw/nes/nes_verbs.c