]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/commitdiff
orinoco: Replace zero-length array with flexible-array member
authorGustavo A. R. Silva <gustavo@embeddedor.com>
Tue, 25 Feb 2020 01:14:15 +0000 (19:14 -0600)
committerKalle Valo <kvalo@codeaurora.org>
Mon, 23 Mar 2020 16:59:50 +0000 (18:59 +0200)
The current codebase makes use of the zero-length array language
extension to the C90 standard, but the preferred mechanism to declare
variable-length types such as these ones is a flexible array member[1][2],
introduced in C99:

struct foo {
        int stuff;
        struct boo array[];
};

By making use of the mechanism above, we will get a compiler warning
in case the flexible array does not occur last in the structure, which
will help us prevent some kind of undefined behavior bugs from being
inadvertently introduced[3] to the codebase from now on.

Also, notice that, dynamic memory allocations won't be affected by
this change:

"Flexible array members have incomplete type, and so the sizeof operator
may not be applied. As a quirk of the original implementation of
zero-length arrays, sizeof evaluates to zero."[1]

This issue was found with the help of Coccinelle.

[1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
[2] https://github.com/KSPP/linux/issues/21
[3] commit 76497732932f ("cxgb3/l2t: Fix undefined behaviour")

Signed-off-by: Gustavo A. R. Silva <gustavo@embeddedor.com>
Signed-off-by: Kalle Valo <kvalo@codeaurora.org>
Link: https://lore.kernel.org/r/20200225011415.GA31868@embeddedor
drivers/net/wireless/intersil/orinoco/fw.c
drivers/net/wireless/intersil/orinoco/hermes.h
drivers/net/wireless/intersil/orinoco/hermes_dld.c
drivers/net/wireless/intersil/orinoco/orinoco_usb.c

index 400a3521764406df48dbde06c5074ee298dd6c69..015af782881bfdb959a702a8c3376b41c050a254 100644 (file)
@@ -49,7 +49,7 @@ struct orinoco_fw_header {
        __le32 pdr_offset;      /* Offset to PDR data from eof header */
        __le32 pri_offset;      /* Offset to primary plug data */
        __le32 compat_offset;   /* Offset to compatibility data*/
-       char signature[0];      /* FW signature length headersize-20 */
+       char signature[];      /* FW signature length headersize-20 */
 } __packed;
 
 /* Check the range of various header entries. Return a pointer to a
index 121fdd8e5da2f2c7da6806ddedee9fcb0e9c3975..9f668185b7d2820afe5aa72d3a1c530831c4a9ac 100644 (file)
@@ -341,7 +341,7 @@ struct agere_ext_scan_info {
        __le64  timestamp;
        __le16  beacon_interval;
        __le16  capabilities;
-       u8      data[0];
+       u8      data[];
 } __packed;
 
 #define HERMES_LINKSTATUS_NOT_CONNECTED   (0x0000)
index 4a10b7aca043ba90ca4a184986636b6d35e0e6bd..dbeadfcfefe26e452fc2ca8e38c10cfff8f3c6e1 100644 (file)
@@ -64,7 +64,7 @@
 struct dblock {
        __le32 addr;            /* adapter address where to write the block */
        __le16 len;             /* length of the data only, in bytes */
-       char data[0];           /* data to be written */
+       char data[];            /* data to be written */
 } __packed;
 
 /*
@@ -76,7 +76,7 @@ struct pdr {
        __le32 id;              /* record ID */
        __le32 addr;            /* adapter address where to write the data */
        __le32 len;             /* expected length of the data, in bytes */
-       char next[0];           /* next PDR starts here */
+       char next[];            /* next PDR starts here */
 } __packed;
 
 /*
@@ -87,7 +87,7 @@ struct pdr {
 struct pdi {
        __le16 len;             /* length of ID and data, in words */
        __le16 id;              /* record ID */
-       char data[0];           /* plug data */
+       char data[];            /* plug data */
 } __packed;
 
 /*** FW data block access functions ***/
index e753f43e0162f109c35b8d0b4a712462e276bd6f..a77bbcd544d64b0b7a7093daf69b2fda864cbcdc 100644 (file)
@@ -202,7 +202,7 @@ struct ezusb_packet {
        __le16 crc;             /* CRC up to here */
        __le16 hermes_len;
        __le16 hermes_rid;
-       u8 data[0];
+       u8 data[];
 } __packed;
 
 /* Table of devices that work or may work with this driver */