mirror of
https://github.com/torvalds/linux.git
synced 2024-11-26 14:12:06 +00:00
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 <linux@roeck-us.net> Cc: David S. Miller <davem@davemloft.net> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
parent
d6efd3f187
commit
fc7c028dcd
@ -39,6 +39,7 @@ struct mdesc_hdr {
|
|||||||
u32 node_sz; /* node block size */
|
u32 node_sz; /* node block size */
|
||||||
u32 name_sz; /* name block size */
|
u32 name_sz; /* name block size */
|
||||||
u32 data_sz; /* data block size */
|
u32 data_sz; /* data block size */
|
||||||
|
char data[];
|
||||||
} __attribute__((aligned(16)));
|
} __attribute__((aligned(16)));
|
||||||
|
|
||||||
struct mdesc_elem {
|
struct mdesc_elem {
|
||||||
@ -612,7 +613,7 @@ EXPORT_SYMBOL(mdesc_get_node_info);
|
|||||||
|
|
||||||
static struct mdesc_elem *node_block(struct mdesc_hdr *mdesc)
|
static struct mdesc_elem *node_block(struct mdesc_hdr *mdesc)
|
||||||
{
|
{
|
||||||
return (struct mdesc_elem *) (mdesc + 1);
|
return (struct mdesc_elem *) mdesc->data;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *name_block(struct mdesc_hdr *mdesc)
|
static void *name_block(struct mdesc_hdr *mdesc)
|
||||||
|
Loading…
Reference in New Issue
Block a user