[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20200430213101.135134-10-arnd@arndb.de>
Date: Thu, 30 Apr 2020 23:30:51 +0200
From: Arnd Bergmann <arnd@...db.de>
To: linux-kernel@...r.kernel.org, Jan Kara <jack@...e.com>
Cc: Arnd Bergmann <arnd@...db.de>,
Pali Rohár <pali@...nel.org>,
Andrew Morton <akpm@...ux-foundation.org>,
"Steven J. Magnani" <steve@...idescorp.com>,
Al Viro <viro@...iv.linux.org.uk>
Subject: [PATCH 09/15] udf: avoid gcc-10 zero-length-bounds warnings
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@...db.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
Powered by blists - more mailing lists