mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-07 14:32:23 +00:00
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>
This commit is contained in:
parent
ff25ea8f4e
commit
9b7b819ca1
@ -912,7 +912,8 @@ long compat_get_bitmap(unsigned long *mask, const compat_ulong_t __user *umask,
|
||||
* bitmap. We must however ensure the end of the
|
||||
* kernel bitmap is zeroed.
|
||||
*/
|
||||
if (nr_compat_longs-- > 0) {
|
||||
if (nr_compat_longs) {
|
||||
nr_compat_longs--;
|
||||
if (__get_user(um, umask))
|
||||
return -EFAULT;
|
||||
} else {
|
||||
@ -954,7 +955,8 @@ long compat_put_bitmap(compat_ulong_t __user *umask, unsigned long *mask,
|
||||
* We dont want to write past the end of the userspace
|
||||
* bitmap.
|
||||
*/
|
||||
if (nr_compat_longs-- > 0) {
|
||||
if (nr_compat_longs) {
|
||||
nr_compat_longs--;
|
||||
if (__put_user(um, umask))
|
||||
return -EFAULT;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user