diff options
author | Paul Eggert <eggert@cs.ucla.edu> | 2022-07-24 16:18:03 -0700 |
---|---|---|
committer | Paul Eggert <eggert@cs.ucla.edu> | 2022-07-25 09:44:00 -0700 |
commit | fffc6149fd355c68c8ffb060c45f5ae5713869df (patch) | |
tree | 17934ab9dc9d53e67f5b3fa4634159efcaedbabb | |
parent | 8ed180b03ccba9c0b056f1e6b24642f89782bfd3 (diff) | |
download | tar-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.c | 33 |
1 files changed, 24 insertions, 9 deletions
@@ -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: |