summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown2019-07-22 15:51:28 +0200
committerMichael Brown2019-07-22 15:51:28 +0200
commita4f8c6e31f6c62522cfc633bbbffa81b22f9d6f3 (patch)
treeb6c39c8a0450839720fe0f2295dbdf6e48ce5b9e
parent[build] Workaround compilation error with gcc 9.1 (diff)
downloadipxe-a4f8c6e31f6c62522cfc633bbbffa81b22f9d6f3.tar.gz
ipxe-a4f8c6e31f6c62522cfc633bbbffa81b22f9d6f3.tar.xz
ipxe-a4f8c6e31f6c62522cfc633bbbffa81b22f9d6f3.zip
[build] Do not apply WORKAROUND_CFLAGS for host compiler
The WORKAROUND_CFLAGS list is constructed based on running tests on the target compiler, and the results may not be valid for the host compiler. The only relevant workaround required for the host compiler is -Wno-stringop-truncation, which is needed to avoid a spurious compiler warning for a totally correct usage of strncpy() in util/elf2efi.c. Duplicating the workaround tests for the host compiler is messy, as is conditionally applying __attribute__((nonstring)). Fix instead by disapplying WORKAROUND_CFLAGS for the host compiler, and using memcpy() with an explicitly calculated length instead of strncpy() in util/elf2efi.c. Reported-by: Ignat Korchagin <ignat@cloudflare.com> Reported-by: Christopher Clark <christopher.w.clark@gmail.com> Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r--src/Makefile.housekeeping2
-rw-r--r--src/util/elf2efi.c6
2 files changed, 6 insertions, 2 deletions
diff --git a/src/Makefile.housekeeping b/src/Makefile.housekeeping
index 4b09e81f..1b175b95 100644
--- a/src/Makefile.housekeeping
+++ b/src/Makefile.housekeeping
@@ -454,7 +454,7 @@ endif
CFLAGS += $(WORKAROUND_CFLAGS) $(EXTRA_CFLAGS)
ASFLAGS += $(WORKAROUND_ASFLAGS) $(EXTRA_ASFLAGS)
LDFLAGS += $(WORKAROUND_LDFLAGS) $(EXTRA_LDFLAGS)
-HOST_CFLAGS += $(WORKAROUND_CFLAGS) -O2 -g
+HOST_CFLAGS += -O2 -g
# Inhibit -Werror if NO_WERROR is specified on make command line
#
diff --git a/src/util/elf2efi.c b/src/util/elf2efi.c
index 2c5b9df8..bcd53c9a 100644
--- a/src/util/elf2efi.c
+++ b/src/util/elf2efi.c
@@ -458,6 +458,7 @@ static struct pe_section * process_section ( struct elf_file *elf,
struct pe_header *pe_header ) {
struct pe_section *new;
const char *name;
+ size_t name_len;
size_t section_memsz;
size_t section_filesz;
unsigned long code_start;
@@ -494,7 +495,10 @@ static struct pe_section * process_section ( struct elf_file *elf,
memset ( new, 0, sizeof ( *new ) + section_filesz );
/* Fill in section header details */
- strncpy ( ( char * ) new->hdr.Name, name, sizeof ( new->hdr.Name ) );
+ name_len = strlen ( name );
+ if ( name_len > sizeof ( new->hdr.Name ) )
+ name_len = sizeof ( new->hdr.Name );
+ memcpy ( new->hdr.Name, name, name_len );
new->hdr.Misc.VirtualSize = section_memsz;
new->hdr.VirtualAddress = shdr->sh_addr;
new->hdr.SizeOfRawData = section_filesz;