dwarf.c: string_fortify.h strncpy error

Message ID YM1G/He72apsT8kn@squeak.grove.modra.org
State New
Headers show
Series
  • dwarf.c: string_fortify.h strncpy error
Related show

Commit Message

Alan Modra via Binutils June 19, 2021, 1:23 a.m.
In function ‘strncpy’,
    inlined from ‘display_debug_lines_decoded’ at /home/alan/src/binutils-gdb/binutils/dwarf.c:5434:5,
    inlined from ‘display_debug_lines’ at /home/alan/src/binutils-gdb/binutils/dwarf.c:5567:21:
/usr/include/bits/string_fortified.h:95:10: error: ‘__builtin_strncpy’ specified bound 36 equals destination size [-Werror=stringop-truncation]

No need for strncpy here, the string being copied always fits the
destination buffer.

	* dwarf.c (display_debug_lines_decoded): Use memcpy rather than
	strncpy when trimming file name length to MAX_FILENAME_LENGTH.
	Don't make an unnecessary copy when length is good.


-- 
Alan Modra
Australia Development Lab, IBM

Patch

diff --git a/binutils/dwarf.c b/binutils/dwarf.c
index ebc7b023e3b..a57f0dab6b2 100644
--- a/binutils/dwarf.c
+++ b/binutils/dwarf.c
@@ -5426,31 +5426,22 @@  display_debug_lines_decoded (struct dwarf_section *  section,
 		fileName = _("<unknown>");
 
 	      fileNameLength = strlen (fileName);
-
-	      if ((fileNameLength > MAX_FILENAME_LENGTH) && (!do_wide))
+	      newFileName = fileName;
+	      if (fileNameLength > MAX_FILENAME_LENGTH && !do_wide)
 		{
 		  newFileName = (char *) xmalloc (MAX_FILENAME_LENGTH + 1);
 		  /* Truncate file name */
-		  strncpy (newFileName,
-			   fileName + fileNameLength - MAX_FILENAME_LENGTH,
-			   MAX_FILENAME_LENGTH + 1);
-		  /* FIXME: This is to pacify gcc-10 which can warn that the
-		     strncpy above might leave a non-NUL terminated string
-		     in newFileName.  It won't, but gcc's analysis doesn't
-		     quite go far enough to discover this.  */
+		  memcpy (newFileName,
+			  fileName + fileNameLength - MAX_FILENAME_LENGTH,
+			  MAX_FILENAME_LENGTH);
 		  newFileName[MAX_FILENAME_LENGTH] = 0;
 		}
-	      else
-		{
-		  newFileName = (char *) xmalloc (fileNameLength + 1);
-		  strncpy (newFileName, fileName, fileNameLength + 1);
-		}
 
 	      /* A row with end_seq set to true has a meaningful address, but
 		 the other information in the same row is not significant.
 		 In such a row, print line as "-", and don't print
 		 view/is_stmt.  */
-	      if (!do_wide || (fileNameLength <= MAX_FILENAME_LENGTH))
+	      if (!do_wide || fileNameLength <= MAX_FILENAME_LENGTH)
 		{
 		  if (linfo.li_max_ops_per_insn == 1)
 		    {
@@ -5525,7 +5516,8 @@  display_debug_lines_decoded (struct dwarf_section *  section,
 		  putchar ('\n');
 		}
 
-	      free (newFileName);
+	      if (newFileName != fileName)
+		free (newFileName);
 	    }
 	}