From 200546f1a33bd4e6d81d5bdef8d26836a7504bdb Mon Sep 17 00:00:00 2001 From: Tom de Vries Date: Wed, 26 Jul 2023 17:06:23 +0200 Subject: [PATCH] [gdb/build] Fix Wstringop-truncation in coff_getfilename When building gdb with -O2 -fsanitize-threads, I ran into a Werror=stringop-truncation. The problem is here in coff_getfilename in coffread.c: ... strncpy (buffer, aux_entry->x_file.x_n.x_fname, FILNMLEN); buffer[FILNMLEN] = '\0'; ... The constant FILNMLEN is expected to designate the size of aux_entry->x_file.x_n.x_fname, but that's no longer the case since commit 60ebc257517 ("Fixes a buffer overflow when compiling assembler for the MinGW targets."). Fix this by using "sizeof (aux_entry->x_file.x_n.x_fname)" instead. Likewise in xcoffread.c. Tested on x86_64-linux. Approved-By: Tom Tromey PR build/30669 Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30669 --- gdb/coffread.c | 5 +++-- gdb/xcoffread.c | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/gdb/coffread.c b/gdb/coffread.c index 33fb2ba1fca..6ec341c61c2 100644 --- a/gdb/coffread.c +++ b/gdb/coffread.c @@ -1371,8 +1371,9 @@ coff_getfilename (union internal_auxent *aux_entry) } else { - strncpy (buffer, aux_entry->x_file.x_n.x_fname, FILNMLEN); - buffer[FILNMLEN] = '\0'; + size_t x_fname_len = sizeof (aux_entry->x_file.x_n.x_fname); + strncpy (buffer, aux_entry->x_file.x_n.x_fname, x_fname_len); + buffer[x_fname_len] = '\0'; } result = buffer; diff --git a/gdb/xcoffread.c b/gdb/xcoffread.c index 1538d1c823d..8930cf1bc35 100644 --- a/gdb/xcoffread.c +++ b/gdb/xcoffread.c @@ -1598,8 +1598,9 @@ coff_getfilename (union internal_auxent *aux_entry, struct objfile *objfile) + aux_entry->x_file.x_n.x_n.x_offset)); else { - strncpy (buffer, aux_entry->x_file.x_n.x_fname, FILNMLEN); - buffer[FILNMLEN] = '\0'; + size_t x_fname_len = sizeof (aux_entry->x_file.x_n.x_fname); + strncpy (buffer, aux_entry->x_file.x_n.x_fname, x_fname_len); + buffer[x_fname_len] = '\0'; } return (buffer); } -- 2.30.2