mm/slab_common.c: check kmem_create_cache flags are common
authorThomas Garnier <thgarnie@google.com>
Tue, 13 Dec 2016 00:41:38 +0000 (16:41 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Tue, 13 Dec 2016 02:55:06 +0000 (18:55 -0800)
Verify that kmem_create_cache flags are not allocator specific.  It is
done before removing flags that are not available with the current
configuration.

The current kmem_cache_create removes incorrect flags but do not
validate the callers are using them right.  This change will ensure that
callers are not trying to create caches with flags that won't be used
because allocator specific.

Link: http://lkml.kernel.org/r/1478553075-120242-2-git-send-email-thgarnie@google.com
Signed-off-by: Thomas Garnier <thgarnie@google.com>
Cc: Christoph Lameter <cl@linux.com>
Cc: Pekka Enberg <penberg@kernel.org>
Cc: David Rientjes <rientjes@google.com>
Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
mm/slab.h
mm/slab_common.c

index ceb7d70cdb76436d8606b7e9272f09b7fa079cb8..699b072dc46e4678d6c482255e8f7e7263693272 100644 (file)
--- a/mm/slab.h
+++ b/mm/slab.h
@@ -142,8 +142,23 @@ static inline unsigned long kmem_cache_flags(unsigned long object_size,
 #define SLAB_CACHE_FLAGS (0)
 #endif
 
+/* Common flags available with current configuration */
 #define CACHE_CREATE_MASK (SLAB_CORE_FLAGS | SLAB_DEBUG_FLAGS | SLAB_CACHE_FLAGS)
 
+/* Common flags permitted for kmem_cache_create */
+#define SLAB_FLAGS_PERMITTED (SLAB_CORE_FLAGS | \
+                             SLAB_RED_ZONE | \
+                             SLAB_POISON | \
+                             SLAB_STORE_USER | \
+                             SLAB_TRACE | \
+                             SLAB_CONSISTENCY_CHECKS | \
+                             SLAB_MEM_SPREAD | \
+                             SLAB_NOLEAKTRACE | \
+                             SLAB_RECLAIM_ACCOUNT | \
+                             SLAB_TEMPORARY | \
+                             SLAB_NOTRACK | \
+                             SLAB_ACCOUNT)
+
 int __kmem_cache_shutdown(struct kmem_cache *);
 void __kmem_cache_release(struct kmem_cache *);
 int __kmem_cache_shrink(struct kmem_cache *);
index 5d2f24fbafc5535997f282e6751476afdf28f83e..ae323841adb1ac76052eb6536aa2a3acc36b88e3 100644 (file)
@@ -404,6 +404,12 @@ kmem_cache_create(const char *name, size_t size, size_t align,
                goto out_unlock;
        }
 
+       /* Refuse requests with allocator specific flags */
+       if (flags & ~SLAB_FLAGS_PERMITTED) {
+               err = -EINVAL;
+               goto out_unlock;
+       }
+
        /*
         * Some allocators will constraint the set of valid flags to a subset
         * of all flags. We expect them to define CACHE_CREATE_MASK in this