Skip to content

Commit fc7c028

Browse files
committed
sparc: avoid stringop-overread errors
The sparc mdesc code does pointer games with 'struct mdesc_hdr', but didn't describe to the compiler how that header is then followed by the data that the header describes. As a result, gcc is now unhappy since it does stricter pointer range tracking, and doesn't understand about how these things work. This results in various errors like: arch/sparc/kernel/mdesc.c: In function ‘mdesc_node_by_name’: arch/sparc/kernel/mdesc.c:647:22: error: ‘strcmp’ reading 1 or more bytes from a region of size 0 [-Werror=stringop-overread] 647 | if (!strcmp(names + ep[ret].name_offset, name)) | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ which are easily avoided by just describing 'struct mdesc_hdr' better, and making the node_block() helper function look into that unsized data[] that follows the header. This makes the sparc64 build happy again at least for my cross-compiler version (gcc version 11.2.1). Link: https://lore.kernel.org/lkml/CAHk-=wi4NW3NC0xWykkw=6LnjQD6D_rtRtxY9g8gQAJXtQMi8A@mail.gmail.com/ Cc: Guenter Roeck <[email protected]> Cc: David S. Miller <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
1 parent d6efd3f commit fc7c028

File tree

1 file changed

+2
-1
lines changed

1 file changed

+2
-1
lines changed

arch/sparc/kernel/mdesc.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ struct mdesc_hdr {
3939
u32 node_sz; /* node block size */
4040
u32 name_sz; /* name block size */
4141
u32 data_sz; /* data block size */
42+
char data[];
4243
} __attribute__((aligned(16)));
4344

4445
struct mdesc_elem {
@@ -612,7 +613,7 @@ EXPORT_SYMBOL(mdesc_get_node_info);
612613

613614
static struct mdesc_elem *node_block(struct mdesc_hdr *mdesc)
614615
{
615-
return (struct mdesc_elem *) (mdesc + 1);
616+
return (struct mdesc_elem *) mdesc->data;
616617
}
617618

618619
static void *name_block(struct mdesc_hdr *mdesc)

0 commit comments

Comments
 (0)