minmax: scsi: fix mis-use of 'clamp()' in sr.c
authorLinus Torvalds <torvalds@linux-foundation.org>
Mon, 29 Jul 2024 00:06:20 +0000 (17:06 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Mon, 29 Jul 2024 00:06:20 +0000 (17:06 -0700)
While working on simplifying the minmax functions, and avoiding
excessive macro expansion, it turns out that the sr.c use of the
'clamp()' macro has the arguments the wrong way around.

The clamp logic is

val = clamp(in, low, high);

and it returns the input clamped to the low/high limits. But sr.c ddid

speed = clamp(0, speed, 0xffff / 177);

which clamps the value '0' to the range '[speed, 0xffff / 177]' and ends
up being nonsensical.

Happily, I don't think anybody ever cared.

Fixes: 9fad9d560af5 ("scsi: sr: Fix unintentional arithmetic wraparound")
Cc: Justin Stitt <justinstitt@google.com>
Cc: Kees Cook <keescook@chromium.org>
Cc: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/scsi/sr_ioctl.c

index a0d2556a27bba32b43cda153bb6adb471c0eef0c..089653018d32c1d92663c777c8abccf475a662d6 100644 (file)
@@ -431,7 +431,7 @@ int sr_select_speed(struct cdrom_device_info *cdi, unsigned long speed)
        struct packet_command cgc;
 
        /* avoid exceeding the max speed or overflowing integer bounds */
-       speed = clamp(0, speed, 0xffff / 177);
+       speed = clamp(speed, 0, 0xffff / 177);
 
        if (speed == 0)
                speed = 0xffff; /* set to max */