make kmalloc() fail for swapped size / GFP flags
Subsystems (3)
PATCH 1/1 make kmalloc() fail for swapped size / GFP flags
The patch below makes kmalloc() fail for swapped flags and size arguments as mention in Dave Jones keynote at OLS. This is done by adding a new flag, __GFP_VALID, which is checked for in kmalloc(), that results in the size being too large. Please apply.
-ben
include/linux/gfp.h +7 -6
@@ -40,6 +40,7 @@ struct vm_area_struct;#define __GFP_ZERO 0x8000u/* Return zeroed page on success */ #define __GFP_NOMEMALLOC 0x10000u/* Don't use emergency reserves */ #define __GFP_NORECLAIM 0x20000u/* No realy zone reclaim during allocation */ +#define __GFP_VALID 0x80000000u/* valid GFP flags */ #define __GFP_BITS_SHIFT 20/* Room for 20 __GFP_FOO bits */ #define __GFP_BITS_MASK ((1 << __GFP_BITS_SHIFT) - 1)
@@ -50,12 +51,12 @@ struct vm_area_struct; __GFP_NOFAIL|__GFP_NORETRY|__GFP_NO_GROW|__GFP_COMP| \ __GFP_NOMEMALLOC|__GFP_NORECLAIM) -#define GFP_ATOMIC (__GFP_HIGH) -#define GFP_NOIO (__GFP_WAIT) -#define GFP_NOFS (__GFP_WAIT | __GFP_IO) -#define GFP_KERNEL (__GFP_WAIT | __GFP_IO | __GFP_FS) -#define GFP_USER (__GFP_WAIT | __GFP_IO | __GFP_FS) -#define GFP_HIGHUSER (__GFP_WAIT | __GFP_IO | __GFP_FS | __GFP_HIGHMEM) +#define GFP_ATOMIC (__GFP_VALID | __GFP_HIGH) +#define GFP_NOIO (__GFP_VALID | __GFP_WAIT) +#define GFP_NOFS (__GFP_VALID | __GFP_WAIT | __GFP_IO) +#define GFP_KERNEL (__GFP_VALID | __GFP_WAIT | __GFP_IO | __GFP_FS) +#define GFP_USER (__GFP_VALID | __GFP_WAIT | __GFP_IO | __GFP_FS) +#define GFP_HIGHUSER (__GFP_VALID | __GFP_WAIT | __GFP_IO | __GFP_FS | __GFP_HIGHMEM)/* Flag - indicates that the buffer will be suitable for DMA. Ignored on some platforms, used as appropriate on others */
include/linux/slab.h +4 -0
@@ -78,6 +78,10 @@ extern void *__kmalloc(size_t, unsignedstatic inline void *kmalloc (size_t size,unsigned int __nocast flags) { +if (__builtin_constant_p (flags) && !(flags & __GFP_VALID)) { +extern void __your_kmalloc_flags_are_not_valid (void ); +__your_kmalloc_flags_are_not_valid (); + }if (__builtin_constant_p (size)) {int i =0 ;#define CACHE (x) \