From: Benjamin LaHaise The patch below makes kmalloc() fail at compile time for swapped flags and size arguments when the flags are a constant. It will also fail at runtime (non-constant flags) due to the size being too large. This is done by adding a new flag, __GFP_VALID, which is checked for in kmalloc(), that results in the size being too large. Signed-off-by: Andrew Morton --- include/linux/gfp.h | 13 +++++++------ include/linux/slab.h | 4 ++++ 2 files changed, 11 insertions(+), 6 deletions(-) diff -puN include/linux/gfp.h~make-kmalloc-fail-for-swapped-size--gfp-flags include/linux/gfp.h --- devel/include/linux/gfp.h~make-kmalloc-fail-for-swapped-size--gfp-flags 2005-07-26 00:15:49.000000000 -0700 +++ devel-akpm/include/linux/gfp.h 2005-07-26 00:15:49.000000000 -0700 @@ -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 */ diff -puN include/linux/slab.h~make-kmalloc-fail-for-swapped-size--gfp-flags include/linux/slab.h --- devel/include/linux/slab.h~make-kmalloc-fail-for-swapped-size--gfp-flags 2005-07-26 00:15:49.000000000 -0700 +++ devel-akpm/include/linux/slab.h 2005-07-26 00:15:49.000000000 -0700 @@ -78,6 +78,10 @@ extern void *__kmalloc(size_t, unsigned static 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) \ _