From fffc6149fd355c68c8ffb060c45f5ae5713869df Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sun, 24 Jul 2022 16:18:03 -0700 Subject: 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. --- src/tar.c | 33 ++++++++++++++++++++++++--------- 1 file 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: -- cgit v1.2.1