[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 1/2] misc: Replace zero-length arrays with flexible array member (automatic)



On 3/4/20 1:51 AM, Philippe Mathieu-Daudé wrote:
Description copied from Linux kernel commit from Gustavo A. R. Silva
(see [3]):

--v-- description start --v--

   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], 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 unadvertenly introduced [2] to the
   Linux codebase from now on.

--^-- description end --^--

Do the similar housekeeping in the QEMU codebase (which uses
C99 since commit 7be41675f7cb).

All these instances of code were found with the help of the
following Coccinelle script:

   @@
   identifier s, a;
   type T;
   @@
    struct s {
       ...
   -   T a[0];
   +   T a[];
   };
   @@
   identifier s, a;
   type T;
   @@
    struct s {
       ...
   -   T a[0];
   +   T a[];
    } QEMU_PACKED;

[1] https://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
[2] 
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=76497732932f
[3] 
https://git.kernel.org/pub/scm/linux/kernel/git/gustavoars/linux.git/commit/?id=17642a2fbd2c1

Inspired-by: Gustavo A. R. Silva <gustavo@xxxxxxxxxxxxxx>
Signed-off-by: Philippe Mathieu-Daudé <philmd@xxxxxxxxxx>
---
  bsd-user/qemu.h                       |  2 +-
  contrib/libvhost-user/libvhost-user.h |  2 +-
  hw/m68k/bootinfo.h                    |  2 +-
  hw/scsi/srp.h                         |  6 +++---
  hw/xen/xen_pt.h                       |  2 +-
  include/hw/acpi/acpi-defs.h           | 12 ++++++------
  include/hw/arm/smmu-common.h          |  2 +-
  include/hw/i386/intel_iommu.h         |  3 ++-
  include/hw/virtio/virtio-iommu.h      |  2 +-
  include/sysemu/cryptodev.h            |  2 +-
  include/tcg/tcg.h                     |  2 +-
  pc-bios/s390-ccw/bootmap.h            |  2 +-
  pc-bios/s390-ccw/sclp.h               |  2 +-
  tests/qtest/libqos/ahci.h             |  2 +-
  block/linux-aio.c                     |  2 +-
  hw/acpi/nvdimm.c                      |  6 +++---
  hw/dma/soc_dma.c                      |  2 +-
  hw/i386/x86.c                         |  2 +-
  hw/misc/omap_l4.c                     |  2 +-
  hw/nvram/eeprom93xx.c                 |  2 +-
  hw/rdma/vmw/pvrdma_qp_ops.c           |  4 ++--
  hw/usb/dev-network.c                  |  2 +-
  hw/usb/dev-smartcard-reader.c         |  4 ++--
  hw/virtio/virtio.c                    |  4 ++--
  net/queue.c                           |  2 +-
  25 files changed, 38 insertions(+), 37 deletions(-)

[...]
diff --git a/hw/scsi/srp.h b/hw/scsi/srp.h
index d27f31d2d5..54c954badd 100644
--- a/hw/scsi/srp.h
+++ b/hw/scsi/srp.h
@@ -112,7 +112,7 @@ struct srp_direct_buf {
  struct srp_indirect_buf {
      struct srp_direct_buf    table_desc;
      uint32_t                 len;
-    struct srp_direct_buf    desc_list[0];
+    struct srp_direct_buf    desc_list[];
  } QEMU_PACKED;
enum {
@@ -211,7 +211,7 @@ struct srp_cmd {
      uint8_t    reserved4;
      uint8_t    add_cdb_len;
      uint8_t    cdb[16];
-    uint8_t    add_data[0];
+    uint8_t    add_data[];
  } QEMU_PACKED;
enum {
@@ -241,7 +241,7 @@ struct srp_rsp {
      uint32_t   data_in_res_cnt;
      uint32_t   sense_data_len;
      uint32_t   resp_data_len;
-    uint8_t    data[0];
+    uint8_t    data[];
  } QEMU_PACKED;

hw/scsi/spapr_vscsi.c:69:29: error: field 'iu' with variable sized type 'union viosrp_iu' not at the end of a struct or class is a GNU extension [-Werror,-Wgnu-variable-sized-type-not-at-end]
    union viosrp_iu         iu;
                            ^

Yay we found a bug! Thanks Gustavo :)

union srp_iu {
    struct srp_login_req login_req;
    struct srp_login_rsp login_rsp;
    struct srp_login_rej login_rej;
    struct srp_i_logout i_logout;
    struct srp_t_logout t_logout;
    struct srp_tsk_mgmt tsk_mgmt;
    struct srp_cmd cmd;
    struct srp_rsp rsp;
    uint8_t reserved[SRP_MAX_IU_LEN];
};

union viosrp_iu {
    union srp_iu srp;
    union mad_iu mad;
};

typedef struct vscsi_req {
    vscsi_crq               crq;
    union viosrp_iu         iu;

    /* SCSI request tracking */
    SCSIRequest             *sreq;
    uint32_t                qtag; /* qemu tag != srp tag */
    bool                    active;
    bool                    writing;
    bool                    dma_error;
    uint32_t                data_len;
    uint32_t                senselen;
    uint8_t                 sense[SCSI_SENSE_BUF_SIZE];

    /* RDMA related bits */
    uint8_t                 dma_fmt;
    uint16_t                local_desc;
    uint16_t                total_desc;
    uint16_t                cdb_offset;
    uint16_t                cur_desc_num;
    uint16_t                cur_desc_offset;
} vscsi_req;

#endif /* SCSI_SRP_H */
[...]


_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.