lkml.org 
[lkml]   [2020]   [Apr]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 09/15] udf: avoid gcc-10 zero-length-bounds warnings
    Date
    gcc-10 warns about writes to the empty freeSpaceTable[] array, with
    many instances like:

    fs/udf/balloc.c: In function 'udf_bitmap_new_block':
    fs/udf/balloc.c:101:36: error: array subscript 65535 is outside the bounds of an interior zero-length array '__le32[0]' {aka 'unsigned int[0]'} [-Werror=zero-length-bounds]
    101 | le32_add_cpu(&lvid->freeSpaceTable[partition], cnt);
    | ~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~
    In file included from fs/udf/udfdecl.h:7,
    from fs/udf/balloc.c:22:
    fs/udf/ecma_167.h:363:11: note: while referencing 'freeSpaceTable'
    363 | __le32 freeSpaceTable[0];
    | ^~~~~~~~~~~~~~

    These can all be avoided by using a flexible array member instead.

    Another warning is a bit more obscure:

    fs/udf/super.c: In function 'udf_count_free':
    fs/udf/super.c:2521:26: warning: array subscript '(<unknown>) + 4294967295' is outside the bounds of an interior zero-length array '__le32[0]' {aka 'unsigned int[0]'} [-Wzero-length-bounds]
    2521 | lvid->freeSpaceTable[part]);

    Work around this one by changing the array access to equivalent
    pointer arithmetic, as there cannot be multiple flexible-array
    members in a single struct.

    Signed-off-by: Arnd Bergmann <arnd@arndb.de>
    ---
    fs/udf/ecma_167.h | 2 +-
    fs/udf/super.c | 2 +-
    2 files changed, 2 insertions(+), 2 deletions(-)

    diff --git a/fs/udf/ecma_167.h b/fs/udf/ecma_167.h
    index 736ebc5dc441..14ffe27342bc 100644
    --- a/fs/udf/ecma_167.h
    +++ b/fs/udf/ecma_167.h
    @@ -360,9 +360,9 @@ struct logicalVolIntegrityDesc {
    uint8_t logicalVolContentsUse[32];
    __le32 numOfPartitions;
    __le32 lengthOfImpUse;
    - __le32 freeSpaceTable[0];
    __le32 sizeTable[0];
    uint8_t impUse[0];
    + __le32 freeSpaceTable[];
    } __packed;

    /* Integrity Type (ECMA 167r3 3/10.10.3) */
    diff --git a/fs/udf/super.c b/fs/udf/super.c
    index f747bf72edbe..379867888c36 100644
    --- a/fs/udf/super.c
    +++ b/fs/udf/super.c
    @@ -117,7 +117,7 @@ struct logicalVolIntegrityDescImpUse *udf_sb_lvidiu(struct super_block *sb)
    }
    /* The offset is to skip freeSpaceTable and sizeTable arrays */
    offset = partnum * 2 * sizeof(uint32_t);
    - return (struct logicalVolIntegrityDescImpUse *)&(lvid->impUse[offset]);
    + return (struct logicalVolIntegrityDescImpUse *)(lvid->impUse + offset);
    }

    /* UDF filesystem type */
    --
    2.26.0
    \
     
     \ /
      Last update: 2020-04-30 23:33    [W:4.563 / U:0.232 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site