compat: cleanup coding in compat_get_bitmap() and compat_put_bitmap()
authorHelge Deller <deller@gmx.de>
Thu, 4 Jun 2015 21:57:18 +0000 (23:57 +0200)
committerHelge Deller <deller@gmx.de>
Thu, 4 Jun 2015 21:57:18 +0000 (23:57 +0200)
commit9b7b819ca1e508195feed5ece558dca66adeef05
treecf62f858c89c61d5b38052273ff7ca2defb3a818
parentff25ea8f4eeea252bfcaf65289fa57ba6de080dd
compat: cleanup coding in compat_get_bitmap() and compat_put_bitmap()

In the functions compat_get_bitmap() and compat_put_bitmap() the
variable nr_compat_longs stores how many compat_ulong_t words should be
copied in a loop.

The copy loop itself is this:
  if (nr_compat_longs-- > 0) {
      if (__get_user(um, umask)) return -EFAULT;
  } else {
      um = 0;
  }

Since nr_compat_longs gets unconditionally decremented in each loop and
since it's type is unsigned this could theoretically lead to out of
bounds accesses to userspace if nr_compat_longs wraps around to
(unsigned)(-1).

Although the callers currently do not trigger out-of-bounds accesses, we
should better implement the loop in a safe way to completely avoid such
warp-arounds.

Signed-off-by: Helge Deller <deller@gmx.de>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Al Viro <viro@zeniv.linux.org.uk>
kernel/compat.c