• Javier Carrasco's avatar
    mfd: omap-usb-tll: Use struct_size to allocate tll · 40176714
    Javier Carrasco authored
    Commit 16c2004d ("mfd: omap-usb-tll: Allocate driver data at once")
    changed the memory allocation of 'tll' to consolidate it into a single
    allocation, introducing an incorrect size calculation.
    
    In particular, the allocation for the array of pointers was converted
    into a single-pointer allocation.
    
    The memory allocation used to occur in two steps:
    
    tll = devm_kzalloc(dev, sizeof(struct usbtll_omap), GFP_KERNEL);
    tll->ch_clk = devm_kzalloc(dev, sizeof(struct clk *) * tll->nch,
                               GFP_KERNEL);
    
    And it turned that into the following allocation:
    
    tll = devm_kzalloc(dev, sizeof(*tll) + sizeof(tll->ch_clk[nch]),
                       GFP_KERNEL);
    
    sizeof(tll->ch_clk[nch]) returns the size of a single pointer instead of
    the expected nch pointers.
    
    This bug went unnoticed because the allocation size was small enough to
    fit within the minimum size of a memory allocation for this particular
    case [1].
    
    The complete allocation can still be done at once with the struct_size
    macro, which comes in handy for structures with a trailing flexible
    array.
    
    Fix the memory allocation to obtain the original size again.
    
    Link: https://lore.kernel.org/all/202406261121.2FFD65647@keescook/ [1]
    Fixes: 16c2004d ("mfd: omap-usb-tll: Allocate driver data at once")
    Reviewed-by: default avatarKees Cook <kees@kernel.org>
    Signed-off-by: default avatarJavier Carrasco <javier.carrasco.cruz@gmail.com>
    Fixes: commit 16c2004d ("mfd: omap-usb-tll: Allocate driver data at once")
    Link: https://lore.kernel.org/r/20240626-omap-usb-tll-counted_by-v2-1-4bedf20d1b51@gmail.comSigned-off-by: default avatarLee Jones <lee@kernel.org>
    40176714
omap-usb-tll.c 12.3 KB