summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2022-07-24 16:18:03 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2022-07-25 09:44:00 -0700
commitfffc6149fd355c68c8ffb060c45f5ae5713869df (patch)
tree17934ab9dc9d53e67f5b3fa4634159efcaedbabb
parent8ed180b03ccba9c0b056f1e6b24642f89782bfd3 (diff)
downloadtar-fffc6149fd355c68c8ffb060c45f5ae5713869df.tar.gz
Avoid unlikely crash when xasprintf returns 0
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.
-rw-r--r--src/tar.c33
1 files changed, 24 insertions, 9 deletions
diff --git a/src/tar.c b/src/tar.c
index d4b87eb4..d4898468 100644
--- 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);
+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: