• Geert Uytterhoeven's avatar
    eeprom: at25: Rework buggy read splitting · 19e506b3
    Geert Uytterhoeven authored
    The recent change to split reads into chunks has several problems:
      1. If an SPI controller has no transfer size limit, max_chunk is
         SIZE_MAX, and num_msgs becomes zero, causing no data to be read
         into the buffer, and exposing the original contents of the buffer
         to userspace,
      2. If the requested read size is not a multiple of the maximum
         transfer size, the last transfer reads too much data, overflowing
         the buffer,
      3. The loop logic differs from the write case.
    
    Fix the above by:
      1. Keeping track of the number of bytes that are still to be
         transferred, instead of precalculating the number of messages and
         keeping track of the number of bytes tranfered,
      2. Calculating the transfer size of each individual message, taking
         into account the number of bytes left,
      3. Switching from a "while"-loop to a "do-while"-loop, and renaming
         "msg_count" to "segment".
    
    While at it, drop the superfluous cast from "unsigned int" to "unsigned
    int", also from at25_ee_write(), where it was probably copied from.
    
    Fixes: 0a35780c ("eeprom: at25: Split reads into chunks and cap write size")
    Signed-off-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
    Link: https://lore.kernel.org/r/7ae260778d2c08986348ea48ce02ef148100e088.1655817534.git.geert+renesas@glider.beSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    19e506b3
at25.c 12.9 KB