Skip to contentSkip to conversation

UBSAN: shift-out-of-bounds in set_flicker

PATCH Superseded [email protected] 1 participant 1 message Aug 21, 2023

Subsystems (2)

v2 of 5 Superseded Latest is v5 →

lore
Share & tools
lore
#0 lore raw

PATCH v2 1/1 UBSAN: shift-out-of-bounds in set_flicker

From: Rajeshwar R Shinde <[email protected]>

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'

shift-out-of-bounds error was triggered when variable 'sd->params.exposure.gain' is greater than the number of bits of int. When the variable 'currentexp' is left shifted beyond 31 bits then the error is produced. Therefore added the conditional expression to verify valid range.

Tested via syzbot.

[email protected]/

---
v1->v2
changed the patch
changed commit message and tested with checkpatch

---
 drivers/media/usb/gspca/cpia1.c | 2 ++
 1 file changed, 2 insertions(+)
drivers/media/usb/gspca/cpia1.c +2 -0
index 46ed95483e22..dafc522d5e7b 100644
@@ -1028,6 +1028,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 > 31)
+			return -1;
 		currentexp = currentexp << sd->params.exposure.gain;
 		sd->params.exposure.gain = 0;
 		/* round down current exposure to nearest value */
Signature · 1 line
2.25.1