OSDN Git Service

mm: Use overflow helpers in kvmalloc()
authorKees Cook <keescook@chromium.org>
Tue, 8 May 2018 19:55:26 +0000 (12:55 -0700)
committerKees Cook <keescook@chromium.org>
Tue, 5 Jun 2018 19:16:51 +0000 (12:16 -0700)
Instead of open-coded multiplication and bounds checking, use the new
overflow helper. Additionally prepare for vmalloc() users to add
array_size()-family helpers in the future.

Signed-off-by: Kees Cook <keescook@chromium.org>
include/linux/mm.h
include/linux/vmalloc.h

index 1ac1f06..7cb1c6a 100644 (file)
@@ -25,6 +25,7 @@
 #include <linux/err.h>
 #include <linux/page_ref.h>
 #include <linux/memremap.h>
+#include <linux/overflow.h>
 
 struct mempolicy;
 struct anon_vma;
@@ -560,10 +561,12 @@ static inline void *kvzalloc(size_t size, gfp_t flags)
 
 static inline void *kvmalloc_array(size_t n, size_t size, gfp_t flags)
 {
-       if (size != 0 && n > SIZE_MAX / size)
+       size_t bytes;
+
+       if (unlikely(check_mul_overflow(n, size, &bytes)))
                return NULL;
 
-       return kvmalloc(n * size, flags);
+       return kvmalloc(bytes, flags);
 }
 
 extern void kvfree(const void *addr);
index 1e5d8c3..398e9c9 100644 (file)
@@ -8,6 +8,7 @@
 #include <linux/llist.h>
 #include <asm/page.h>          /* pgprot_t */
 #include <linux/rbtree.h>
+#include <linux/overflow.h>
 
 struct vm_area_struct;         /* vma defining user mapping in mm_types.h */
 struct notifier_block;         /* in notifier.h */