bug-tar
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bug-tar] [PATCH] Robustify OLDGNU_MAGIC header initialization


From: Dmitry V. Levin
Subject: [Bug-tar] [PATCH] Robustify OLDGNU_MAGIC header initialization
Date: Tue, 14 Jul 2009 18:20:46 +0400

* src/create.c (write_gnu_long_link, start_header): Initialize
header.magic and header.version separately, to avoid "always
overflow destination buffer" generated by gcc in fortify mode.

Signed-off-by: Dmitry V. Levin <address@hidden>

---
Strictly speaking, original code does the right thing unless gcc is fresh
enough and _FORTIFY_SOURCE is enabled.  However, gcc still does not
understand meaningful comments, and may treat buffer overflows as errors.

 tar/src/create.c |   17 +++++++++++++----
 1 files changed, 13 insertions(+), 4 deletions(-)

--- a/tar/src/create.c
+++ b/tar/src/create.c
@@ -577,7 +577,12 @@ write_gnu_long_link (struct tar_stat_info *st, const char 
*p, char type)
   GNAME_TO_CHARS (tmpname, header->header.gname);
   free (tmpname);
 
-  strcpy (header->header.magic, OLDGNU_MAGIC);
+  /* OLDGNU_MAGIC is string of 7 chars and trailing \0 */
+  strncpy (header->header.magic,
+           OLDGNU_MAGIC, sizeof(header->header.magic));
+  strncpy (header->header.version,
+           OLDGNU_MAGIC + sizeof(header->header.magic),
+           sizeof(header->header.version));
   header->header.typeflag = type;
   finish_header (st, header, -1);
 
@@ -907,9 +912,13 @@ start_header (struct tar_stat_info *st)
       break;
 
     case OLDGNU_FORMAT:
-    case GNU_FORMAT:   /*FIXME?*/
-      /* Overwrite header->header.magic and header.version in one blow.  */
-      strcpy (header->header.magic, OLDGNU_MAGIC);
+    case GNU_FORMAT:
+      /* OLDGNU_MAGIC is string of 7 chars and trailing \0 */
+      strncpy (header->header.magic, OLDGNU_MAGIC,
+               sizeof(header->header.magic));
+      strncpy (header->header.version,
+               OLDGNU_MAGIC + sizeof(header->header.magic),
+               sizeof(header->header.version));
       break;
 
     case POSIX_FORMAT:

-- 
ldv




reply via email to

[Prev in Thread] Current Thread [Next in Thread]