]> git.ipfire.org Git - thirdparty/tar.git/commitdiff
Avoid unlikely crash when xasprintf returns 0
authorPaul Eggert <eggert@cs.ucla.edu>
Sun, 24 Jul 2022 23:18:03 +0000 (16:18 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Mon, 25 Jul 2022 16:44:00 +0000 (09:44 -0700)
Problem caught by GCC 12.
* src/tar.c (easprintf): New static function, which never returns
a null pointer.  All uses of xasprintf replaced by uses of this
function.

src/tar.c

index d4b87eb45d0e383d20abfa27dc2f3a4596a5cef5..d48984680a8091601fd841f62b8604e384588c2a 100644 (file)
--- a/src/tar.c
+++ b/src/tar.c
@@ -845,10 +845,25 @@ static enum atime_preserve const atime_preserve_types[] =
 ARGMATCH_VERIFY (atime_preserve_args, atime_preserve_types);
 
 \f
+static char * ATTRIBUTE_FORMAT ((printf, 1, 2))
+easprintf (char const *format, ...)
+{
+  va_list args;
+
+  va_start (args, format);
+  char *result = xvasprintf (format, args);
+  int err = errno;
+  va_end (args);
+
+  if (!result)
+    FATAL_ERROR ((0, err, "vasprintf"));
+  return result;
+}
+
 static char *
 format_default_settings (void)
 {
-  return xasprintf (
+  return easprintf (
            "--format=%s -f%s -b%d --quoting-style=%s --rmt-command=%s"
 #ifdef REMOTE_SHELL
            " --rsh-command=%s"
@@ -1130,35 +1145,35 @@ tar_help_filter (int key, const char *text, void *input)
       break;
 
     case 'j':
-      s = xasprintf (_("filter the archive through %s"), BZIP2_PROGRAM);
+      s = easprintf (_("filter the archive through %s"), BZIP2_PROGRAM);
       break;
 
     case 'z':
-      s = xasprintf (_("filter the archive through %s"), GZIP_PROGRAM);
+      s = easprintf (_("filter the archive through %s"), GZIP_PROGRAM);
       break;
 
     case 'Z':
-      s = xasprintf (_("filter the archive through %s"), COMPRESS_PROGRAM);
+      s = easprintf (_("filter the archive through %s"), COMPRESS_PROGRAM);
       break;
 
     case LZIP_OPTION:
-      s = xasprintf (_("filter the archive through %s"), LZIP_PROGRAM);
+      s = easprintf (_("filter the archive through %s"), LZIP_PROGRAM);
       break;
 
     case LZMA_OPTION:
-      s = xasprintf (_("filter the archive through %s"), LZMA_PROGRAM);
+      s = easprintf (_("filter the archive through %s"), LZMA_PROGRAM);
       break;
 
     case LZOP_OPTION:
-      s = xasprintf (_("filter the archive through %s"), LZOP_PROGRAM);
+      s = easprintf (_("filter the archive through %s"), LZOP_PROGRAM);
       break;
 
     case 'J':
-      s = xasprintf (_("filter the archive through %s"), XZ_PROGRAM);
+      s = easprintf (_("filter the archive through %s"), XZ_PROGRAM);
       break;
 
     case ZSTD_OPTION:
-      s = xasprintf (_("filter the archive through %s"), ZSTD_PROGRAM);
+      s = easprintf (_("filter the archive through %s"), ZSTD_PROGRAM);
       break;
 
     case ARGP_KEY_HELP_EXTRA: