• David Laight's avatar
    slab: kmalloc_size_roundup() must not return 0 for non-zero size · 8446a4de
    David Laight authored
    The typical use of kmalloc_size_roundup() is:
    
    	ptr = kmalloc(sz = kmalloc_size_roundup(size), ...);
    	if (!ptr) return -ENOMEM.
    
    This means it is vitally important that the returned value isn't less
    than the argument even if the argument is insane.
    In particular if kmalloc_slab() fails or the value is above
    (MAX_ULONG - PAGE_SIZE) zero is returned and kmalloc() will return
    its single zero-length buffer ZERO_SIZE_PTR.
    
    Fix this by returning the input size if the size exceeds
    KMALLOC_MAX_SIZE. kmalloc() will then return NULL as the size really is
    too big.
    
    kmalloc_slab() should not normally return NULL, unless called too early.
    Again, returning zero is not the correct action as it can be in some
    usage scenarios stored to a variable and only later cause kmalloc()
    return ZERO_SIZE_PTR and subsequent crashes on access. Instead we can
    simply stop checking the kmalloc_slab() result completely, as calling
    kmalloc_size_roundup() too early would then result in an immediate crash
    during boot and the developer noticing an issue in their code.
    
    [vbabka@suse.cz: remove kmalloc_slab() result check, tweak comments and
     commit log]
    Fixes: 05a94065
    
     ("slab: Introduce kmalloc_size_roundup()")
    Signed-off-by: default avatarDavid Laight <david.laight@aculab.com>
    Signed-off-by: default avatarVlastimil Babka <vbabka@suse.cz>
    8446a4de
slab_common.c 39.5 KB