]> www.infradead.org Git - users/dwmw2/linux.git/commitdiff
staging: gpib: avoid unintended sign extension
authorKees Bakker <kees@ijzerbout.nl>
Thu, 17 Oct 2024 19:54:47 +0000 (21:54 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 10 Nov 2024 07:04:10 +0000 (08:04 +0100)
The code was basically like this (assuming size_t can be u64)
    var_u64 |= var_u8 << 24
var_u8 is first promoted to i32 and then the shift is done. Next, it is
promoted to u64 by first signextending to 64 bits. This is very unlikely
what was intended. So now it is first forced to u32.
    var_u64 |= (u32)var_u8 << 24

This was detected by Coverity, CID 1600792.

Fixes: 4c41fe886a56 ("staging: gpib: Add Agilent/Keysight 82357x USB GPIB driver")
Signed-off-by: Kees Bakker <kees@ijzerbout.nl>
Link: https://lore.kernel.org/r/20241108201207.1194F18DDF5@bout3.ijzerbout.nl
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/gpib/agilent_82357a/agilent_82357a.c

index a6b177d7f8a0bfd7d32b27130e9cfe9765e6c7a5..bf05fb4a736b3f4b7f9b12e3cac4d1b53a6cd49c 100644 (file)
@@ -664,10 +664,10 @@ static ssize_t agilent_82357a_generic_write(gpib_board_t *board, uint8_t *buffer
                kfree(status_data);
                return -EIO;
        }
-       *bytes_written  = status_data[2];
-       *bytes_written |= status_data[3] << 8;
-       *bytes_written |= status_data[4] << 16;
-       *bytes_written |= status_data[5] << 24;
+       *bytes_written  = (u32)status_data[2];
+       *bytes_written |= (u32)status_data[3] << 8;
+       *bytes_written |= (u32)status_data[4] << 16;
+       *bytes_written |= (u32)status_data[5] << 24;
 
        kfree(status_data);
        return 0;