lkml.org 
[lkml]   [2023]   [Nov]   [12]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 6.5 01/10] media: gspca: cpia1: shift-out-of-bounds in set_flicker
    Date
    From: Rajeshwar R Shinde <coolrrsh@gmail.com>

    [ Upstream commit 099be1822d1f095433f4b08af9cc9d6308ec1953 ]

    Syzkaller reported the following issue:
    UBSAN: shift-out-of-bounds in drivers/media/usb/gspca/cpia1.c:1031:27
    shift exponent 245 is too large for 32-bit type 'int'

    When the value of the variable "sd->params.exposure.gain" exceeds the
    number of bits in an integer, a shift-out-of-bounds error is reported. It
    is triggered because the variable "currentexp" cannot be left-shifted by
    more than the number of bits in an integer. In order to avoid invalid
    range during left-shift, the conditional expression is added.

    Reported-by: syzbot+e27f3dbdab04e43b9f73@syzkaller.appspotmail.com
    Closes: https://lore.kernel.org/all/20230818164522.12806-1-coolrrsh@gmail.com
    Link: https://syzkaller.appspot.com/bug?extid=e27f3dbdab04e43b9f73
    Signed-off-by: Rajeshwar R Shinde <coolrrsh@gmail.com>
    Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/media/usb/gspca/cpia1.c | 3 +++
    1 file changed, 3 insertions(+)

    diff --git a/drivers/media/usb/gspca/cpia1.c b/drivers/media/usb/gspca/cpia1.c
    index 46ed95483e222..5f5fa851ca640 100644
    --- a/drivers/media/usb/gspca/cpia1.c
    +++ b/drivers/media/usb/gspca/cpia1.c
    @@ -18,6 +18,7 @@

    #include <linux/input.h>
    #include <linux/sched/signal.h>
    +#include <linux/bitops.h>

    #include "gspca.h"

    @@ -1028,6 +1029,8 @@ static int set_flicker(struct gspca_dev *gspca_dev, int on, int apply)
    sd->params.exposure.expMode = 2;
    sd->exposure_status = EXPOSURE_NORMAL;
    }
    + if (sd->params.exposure.gain >= BITS_PER_TYPE(currentexp))
    + return -EINVAL;
    currentexp = currentexp << sd->params.exposure.gain;
    sd->params.exposure.gain = 0;
    /* round down current exposure to nearest value */
    --
    2.42.0
    \
     
     \ /
      Last update: 2023-11-20 13:57    [W:4.228 / U:0.344 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site