On Mon, Sep 02, 2024 at 09:36:26AM +0800, Tang, Feng wrote: > On Tue, Jul 30, 2024 at 08:15:34PM +0800, Vlastimil Babka wrote: > > On 7/30/24 3:35 AM, Danilo Krummrich wrote: [...] > > > > Let's say we kmalloc(56, __GFP_ZERO), we get an object from kmalloc-64 > > cache. Since commit 946fa0dbf2d89 ("mm/slub: extend redzone check to > > extra allocated kmalloc space than requested") and preceding commits, if > > slub_debug is enabled (red zoning or user tracking), only the 56 bytes > > will be zeroed. The rest will be either unknown garbage, or redzone. > > Yes. > > > > > Then we might e.g. krealloc(120) and get a kmalloc-128 object and 64 > > bytes (result of ksize()) will be copied, including the garbage/redzone. > > I think it's fixable because when we do this in slub_debug, we also > > store the original size in the metadata, so we could read it back and > > adjust how many bytes are copied. > > krealloc() --> __do_krealloc() --> ksize() > When ksize() is called, as we don't know what user will do with the > extra space ([57, 64] here), the orig_size check will be unset by > __ksize() calling skip_orig_size_check(). > > And if the newsize is bigger than the old 'ksize', the 'orig_size' > will be correctly set for the newly allocated kmalloc object. > > For the 'unstable' branch of -mm tree, which has all latest patches > from Danilo, I run some basic test and it seems to be fine. when doing more test, I found one case matching Vlastimil's previous concern, that if we kzalloc a small object, and then krealloc with a slightly bigger size which can still reuse the kmalloc object, some redzone will be preserved. With test code like: buf = kzalloc(36, GFP_KERNEL); memset(buf, 0xff, 36); buf = krealloc(buf, 48, GFP_KERNEL | __GFP_ZERO); Data after kzalloc+memset : ffff88802189b040: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ffff88802189b050: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ffff88802189b060: ff ff ff ff cc cc cc cc cc cc cc cc cc cc cc cc ffff88802189b070: cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc Data after krealloc: ffff88802189b040: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ffff88802189b050: ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ffff88802189b060: ff ff ff ff cc cc cc cc cc cc cc cc cc cc cc cc ffff88802189b070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 If we really want to make [37, 48] to be zeroed too, we can lift the get_orig_size() from slub.c to slab_common.c and use it as the start of zeroing in krealloc(). Thanks, Feng