• K
    mm/slub: fix redzoning for small allocations · 74c1d3e0
    Kees Cook 提交于
    The redzone area for SLUB exists between s->object_size and s->inuse
    (which is at least the word-aligned object_size).  If a cache were
    created with an object_size smaller than sizeof(void *), the in-object
    stored freelist pointer would overwrite the redzone (e.g.  with boot
    param "slub_debug=ZF"):
    
      BUG test (Tainted: G    B            ): Right Redzone overwritten
      -----------------------------------------------------------------------------
    
      INFO: 0xffff957ead1c05de-0xffff957ead1c05df @offset=1502. First byte 0x1a instead of 0xbb
      INFO: Slab 0xffffef3950b47000 objects=170 used=170 fp=0x0000000000000000 flags=0x8000000000000200
      INFO: Object 0xffff957ead1c05d8 @offset=1496 fp=0xffff957ead1c0620
    
      Redzone  (____ptrval____): bb bb bb bb bb bb bb bb    ........
      Object   (____ptrval____): f6 f4 a5 40 1d e8          ...@..
      Redzone  (____ptrval____): 1a aa                      ..
      Padding  (____ptrval____): 00 00 00 00 00 00 00 00    ........
    
    Store the freelist pointer out of line when object_size is smaller than
    sizeof(void *) and redzoning is enabled.
    
    Additionally remove the "smaller than sizeof(void *)" check under
    CONFIG_DEBUG_VM in kmem_cache_sanity_check() as it is now redundant:
    SLAB and SLOB both handle small sizes.
    
    (Note that no caches within this size range are known to exist in the
    kernel currently.)
    
    Link: https://lkml.kernel.org/r/20210608183955.280836-3-keescook@chromium.org
    Fixes: 81819f0f ("SLUB core")
    Signed-off-by: NKees Cook <keescook@chromium.org>
    Acked-by: NVlastimil Babka <vbabka@suse.cz>
    Cc: Christoph Lameter <cl@linux.com>
    Cc: David Rientjes <rientjes@google.com>
    Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com>
    Cc: "Lin, Zhenpeng" <zplin@psu.edu>
    Cc: Marco Elver <elver@google.com>
    Cc: Pekka Enberg <penberg@kernel.org>
    Cc: Roman Gushchin <guro@fb.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    74c1d3e0
slab_common.c 32.6 KB