lkml.org 
[lkml]   [2022]   [Apr]   [5]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.10 017/599] spi: Fix erroneous sgs value with min_t()
    Date
    From: Biju Das <biju.das.jz@bp.renesas.com>

    [ Upstream commit ebc4cb43ea5ada3db46c80156fca58a54b9bbca8 ]

    While computing sgs in spi_map_buf(), the data type
    used in min_t() for max_seg_size is 'unsigned int' where
    as that of ctlr->max_dma_len is 'size_t'.

    min_t(unsigned int,x,y) gives wrong results if one of x/y is
    'size_t'

    Consider the below examples on a 64-bit machine (ie size_t is
    64-bits, and unsigned int is 32-bit).
    case 1) min_t(unsigned int, 5, 0x100000001);
    case 2) min_t(size_t, 5, 0x100000001);

    Case 1 returns '1', where as case 2 returns '5'. As you can see
    the result from case 1 is wrong.

    This patch fixes the above issue by using the data type of the
    parameters that are used in min_t with maximum data length.

    Fixes: commit 1a4e53d2fc4f68aa ("spi: Fix invalid sgs value")
    Reported-by: Linus Torvalds <torvalds@linux-foundation.org>
    Suggested-by: Geert Uytterhoeven <geert+renesas@glider.be>
    Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
    Reviewed-by: Lad Prabhakar <prabhakar.mahadev-lad.rj@bp.renesas.com>
    Link: https://lore.kernel.org/r/20220316175317.465-1-biju.das.jz@bp.renesas.com
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/spi/spi.c | 4 ++--
    1 file changed, 2 insertions(+), 2 deletions(-)

    diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
    index 2396565fc91b..6ea7b286c80c 100644
    --- a/drivers/spi/spi.c
    +++ b/drivers/spi/spi.c
    @@ -881,10 +881,10 @@ int spi_map_buf(struct spi_controller *ctlr, struct device *dev,
    int i, ret;

    if (vmalloced_buf || kmap_buf) {
    - desc_len = min_t(unsigned int, max_seg_size, PAGE_SIZE);
    + desc_len = min_t(unsigned long, max_seg_size, PAGE_SIZE);
    sgs = DIV_ROUND_UP(len + offset_in_page(buf), desc_len);
    } else if (virt_addr_valid(buf)) {
    - desc_len = min_t(unsigned int, max_seg_size, ctlr->max_dma_len);
    + desc_len = min_t(size_t, max_seg_size, ctlr->max_dma_len);
    sgs = DIV_ROUND_UP(len, desc_len);
    } else {
    return -EINVAL;
    --
    2.34.1


    \
     
     \ /
      Last update: 2022-04-06 00:51    [W:4.977 / U:0.084 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site