]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
scsi: advansys: fix uninitialized data access
authorArnd Bergmann <arnd@arndb.de>
Thu, 23 Mar 2017 15:02:18 +0000 (16:02 +0100)
committerSasha Levin <alexander.levin@microsoft.com>
Sun, 4 Mar 2018 15:28:28 +0000 (10:28 -0500)
[ Upstream commit 44a5b977128c0ffff0654392b40f4c2ce72a619b ]

gcc-7.0.1 now warns about a previously unnoticed access of uninitialized
struct members:

drivers/scsi/advansys.c: In function 'AscMsgOutSDTR':
drivers/scsi/advansys.c:3860:26: error: '*((void *)&sdtr_buf+5)' may be used uninitialized in this function [-Werror=maybe-uninitialized]
         ((ushort)s_buffer[i + 1] << 8) | s_buffer[i]);
                          ^
drivers/scsi/advansys.c:3860:26: error: '*((void *)&sdtr_buf+7)' may be used uninitialized in this function [-Werror=maybe-uninitialized]
drivers/scsi/advansys.c:3860:26: error: '*((void *)&sdtr_buf+5)' may be used uninitialized in this function [-Werror=maybe-uninitialized]
drivers/scsi/advansys.c:3860:26: error: '*((void *)&sdtr_buf+7)' may be used uninitialized in this function [-Werror=maybe-uninitialized]

The code has existed in this exact form at least since v2.6.12, and the
warning seems correct. This uses named initializers to ensure we
initialize all members of the structure.

Signed-off-by: Arnd Bergmann <arnd@arndb.de>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
drivers/scsi/advansys.c

index 969469261353435556657bd0cd5b40f5a35b207f..42a14c456da0b8c4ccee0f9289ebff08578c1e3b 100644 (file)
@@ -6482,18 +6482,17 @@ static uchar AscGetSynPeriodIndex(ASC_DVC_VAR *asc_dvc, uchar syn_time)
 static uchar
 AscMsgOutSDTR(ASC_DVC_VAR *asc_dvc, uchar sdtr_period, uchar sdtr_offset)
 {
-       EXT_MSG sdtr_buf;
-       uchar sdtr_period_index;
-       PortAddr iop_base;
-
-       iop_base = asc_dvc->iop_base;
-       sdtr_buf.msg_type = EXTENDED_MESSAGE;
-       sdtr_buf.msg_len = MS_SDTR_LEN;
-       sdtr_buf.msg_req = EXTENDED_SDTR;
-       sdtr_buf.xfer_period = sdtr_period;
+       PortAddr iop_base = asc_dvc->iop_base;
+       uchar sdtr_period_index = AscGetSynPeriodIndex(asc_dvc, sdtr_period);
+       EXT_MSG sdtr_buf = {
+               .msg_type = EXTENDED_MESSAGE,
+               .msg_len = MS_SDTR_LEN,
+               .msg_req = EXTENDED_SDTR,
+               .xfer_period = sdtr_period,
+               .req_ack_offset = sdtr_offset,
+       };
        sdtr_offset &= ASC_SYN_MAX_OFFSET;
-       sdtr_buf.req_ack_offset = sdtr_offset;
-       sdtr_period_index = AscGetSynPeriodIndex(asc_dvc, sdtr_period);
+
        if (sdtr_period_index <= asc_dvc->max_sdtr_index) {
                AscMemWordCopyPtrToLram(iop_base, ASCV_MSGOUT_BEG,
                                        (uchar *)&sdtr_buf,