Messages in this thread Patch in this message | | | From | Arnd Bergmann <> | Subject | [PATCH 09/15] udf: avoid gcc-10 zero-length-bounds warnings | Date | Thu, 30 Apr 2020 23:30:51 +0200 |
| |
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
| |