• Lukas Wunner's avatar
    spi: bcm2835: Fix out-of-bounds access with more than 4 slaves · 13817d46
    Lukas Wunner authored
    Commit 571e31fa ("spi: bcm2835: Cache CS register value for
    ->prepare_message()") limited the number of slaves to 3 at compile-time.
    The limitation was necessitated by a statically-sized array prepare_cs[]
    in the driver private data which contains a per-slave register value.
    
    The commit sought to enforce the limitation at run-time by setting the
    controller's num_chipselect to 3:  Slaves with a higher chipselect are
    rejected by spi_add_device().
    
    However the commit neglected that num_chipselect only limits the number
    of *native* chipselects.  If GPIO chipselects are specified in the
    device tree for more than 3 slaves, num_chipselect is silently raised by
    of_spi_get_gpio_numbers() and the result are out-of-bounds accesses to
    the statically-sized array prepare_cs[].
    
    As a bandaid fix which is backportable to stable, raise the number of
    allowed slaves to 24 (which "ought to be enough for anybody"), enforce
    the limitation on slave ->setup and revert num_chipselect to 3 (which is
    the number of native chipselects supported by the controller).
    An upcoming for-next commit will allow an arbitrary number of slaves.
    
    Fixes: 571e31fa ("spi: bcm2835: Cache CS register value for ->prepare_message()")
    Reported-by: default avatarJoe Burmeister <joe.burmeister@devtank.co.uk>
    Signed-off-by: default avatarLukas Wunner <lukas@wunner.de>
    Cc: stable@vger.kernel.org # v5.4+
    Cc: Phil Elwell <phil@raspberrypi.com>
    Link: https://lore.kernel.org/r/75854affc1923309fde05e47494263bde73e5592.1621703210.git.lukas@wunner.deSigned-off-by: default avatarMark Brown <broonie@kernel.org>
    13817d46
spi-bcm2835.c 41.1 KB