linux-uconsole/drivers/block/drbd
Richard Weinberger f523deedff drbd: Fix kernel_sendmsg() usage - potential NULL deref
commit d8e9e5e80e upstream.

Don't pass a size larger than iov_len to kernel_sendmsg().
Otherwise it will cause a NULL pointer deref when kernel_sendmsg()
returns with rv < size.

DRBD as external module has been around in the kernel 2.4 days already.
We used to be compatible to 2.4 and very early 2.6 kernels,
we used to use
 rv = sock_sendmsg(sock, &msg, iov.iov_len);
then later changed to
 rv = kernel_sendmsg(sock, &msg, &iov, 1, size);
when we should have used
 rv = kernel_sendmsg(sock, &msg, &iov, 1, iov.iov_len);

tcp_sendmsg() used to totally ignore the size parameter.
 57be5bd ip: convert tcp_sendmsg() to iov_iter primitives
changes that, and exposes our long standing error.

Even with this error exposed, to trigger the bug, we would need to have
an environment (config or otherwise) causing us to not use sendpage()
for larger transfers, a failing connection, and have it fail "just at the
right time".  Apparently that was unlikely enough for most, so this went
unnoticed for years.

Still, it is known to trigger at least some of these,
and suspected for the others:
[0] http://lists.linbit.com/pipermail/drbd-user/2016-July/023112.html
[1] http://lists.linbit.com/pipermail/drbd-dev/2016-March/003362.html
[2] https://forums.grsecurity.net/viewtopic.php?f=3&t=4546
[3] https://ubuntuforums.org/showthread.php?t=2336150
[4] http://e2.howsolveproblem.com/i/1175162/

This should go into 4.9,
and into all stable branches since and including v4.0,
which is the first to contain the exposing change.

It is correct for all stable branches older than that as well
(which contain the DRBD driver; which is 2.6.33 and up).

It requires a small "conflict" resolution for v4.4 and earlier, with v4.5
we dropped the comment block immediately preceding the kernel_sendmsg().

Fixes: b411b3637f ("The DRBD driver")
Cc: viro@zeniv.linux.org.uk
Cc: christoph.lechleitner@iteg.at
Cc: wolfgang.glas@iteg.at
Reported-by: Christoph Lechleitner <christoph.lechleitner@iteg.at>
Tested-by: Christoph Lechleitner <christoph.lechleitner@iteg.at>
Signed-off-by: Richard Weinberger <richard@nod.at>
[changed oneliner to be "obvious" without context; more verbose message]
Signed-off-by: Lars Ellenberg <lars.ellenberg@linbit.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2016-11-18 10:48:35 +01:00
..
drbd_actlog.c block: add a bi_error field to struct bio 2015-07-29 08:55:15 -06:00
drbd_bitmap.c Merge branch 'akpm' (patches from Andrew) 2015-11-07 14:32:45 -08:00
drbd_debugfs.c make simple_positive() public 2015-06-23 18:02:01 -04:00
drbd_debugfs.h drbd: debugfs: add basic hierarchy 2014-07-10 18:35:16 +02:00
drbd_int.h block: change ->make_request_fn() and users to return a queue cookie 2015-11-07 10:40:46 -07:00
drbd_interval.c drbd: use RB_DECLARE_CALLBACKS() to define augment callbacks 2014-09-18 09:00:17 -06:00
drbd_interval.h drbd: application writes may set-in-sync in protocol != C 2014-07-10 18:35:02 +02:00
drbd_main.c drbd: Fix kernel_sendmsg() usage - potential NULL deref 2016-11-18 10:48:35 +01:00
drbd_nl.c block: have drivers use blk_queue_max_discard_sectors() 2015-07-17 08:41:53 -06:00
drbd_nla.c drbd: Remove drbd_wrappers.h 2014-04-30 13:46:54 -06:00
drbd_nla.h drbd: Split off netlink mandatory attribute handling into separate file 2012-11-08 16:57:45 +01:00
drbd_proc.c drbd: Add missing newline in resync progress display in /proc/drbd 2014-09-11 08:41:29 -06:00
drbd_protocol.h drbd: Enable QUEUE_FLAG_DISCARD only if the peer can recieve P_TRIM 2014-04-30 13:46:55 -06:00
drbd_receiver.c mm, page_alloc: distinguish between being unable to sleep, unwilling to sleep and avoiding waking kswapd 2015-11-06 17:50:42 -08:00
drbd_req.c block: change ->make_request_fn() and users to return a queue cookie 2015-11-07 10:40:46 -07:00
drbd_req.h drbd: silence -Wmissing-prototypes warnings 2014-07-10 18:34:57 +02:00
drbd_state.c drbd: fix resync throttling initialization 2014-11-10 09:27:37 -07:00
drbd_state.h drbd: fix race between role change and handshake 2014-11-10 09:27:35 -07:00
drbd_strings.c drbd: Move string function prototypes from linux/drbd.h to drbd_string.h 2014-02-17 16:50:37 +01:00
drbd_strings.h drbd: Move string function prototypes from linux/drbd.h to drbd_string.h 2014-02-17 16:50:37 +01:00
drbd_vli.h
drbd_worker.c block: add a bi_error field to struct bio 2015-07-29 08:55:15 -06:00
Kconfig drbd: update Kconfig to match current dependencies 2012-12-06 13:08:29 +01:00
Makefile drbd: debugfs: add basic hierarchy 2014-07-10 18:35:16 +02:00