• H. Nikolaus Schaller's avatar
    power: generic-adc-battery: fix out-of-bounds write when copying channel properties · a3702bba
    H. Nikolaus Schaller authored
    commit 932d4744 upstream.
    
    We did have sporadic problems in the pinctrl framework during boot
    where a pin group name unexpectedly became NULL leading to a NULL
    dereference in strcmp.
    
    Detailled analysis of the failing cases did reveal that there were
    two devm allocated objects close to each other. The second one was
    the affected group_desc in pinmux and the first one was the
    psy_desc->properties buffer of the gab driver.
    
    Review of the gab code showed that the address calculation for
    one memcpy() is wrong. It does
    
    	properties + sizeof(type) * index
    
    but C is defined to do the index multiplication already for
    pointer + integer additions. Hence the factor was applied twice
    and the memcpy() does write outside of the properties buffer.
    Sometimes it happened to be the pinctrl and triggered the strcmp(NULL).
    
    Anyways, it is overkill to use a memcpy() here instead of a simple
    assignment, which is easier to read and has less risk for wrong
    address calculations. So we change code to a simple assignment.
    
    If we initialize the index to the first free location, we can even
    remove the local variable 'properties'.
    
    This bug seems to exist right from the beginning in 3.7-rc1 in
    
    commit e60fea79 ("power: battery: Generic battery driver using IIO")
    Signed-off-by: default avatarH. Nikolaus Schaller <hns@goldelico.com>
    Cc: stable@vger.kernel.org
    Fixes: e60fea79 ("power: battery: Generic battery driver using IIO")
    Signed-off-by: default avatarSebastian Reichel <sebastian.reichel@collabora.co.uk>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    a3702bba
generic-adc-battery.c 10.7 KB