* 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 <[email protected]> --- 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
