Skip to content

Commit

Permalink
xz: Refactor suffix test with raw format.
Browse files Browse the repository at this point in the history
The previous version set opt_stdout, but this caused an issue with
copying an input file to standard out when decompressing an unknown file
type. The following needs to result in an error:

    echo foo | xz -df

since -c, --stdout is not used. This fixes the previous error by not
setting opt_stdout.
  • Loading branch information
JiaT75 committed Nov 15, 2023
1 parent 837ea40 commit f481523
Showing 1 changed file with 13 additions and 25 deletions.
38 changes: 13 additions & 25 deletions src/xz/args.c
Original file line number Diff line number Diff line change
Expand Up @@ -834,34 +834,22 @@ args_parse(args_info *args, int argc, char **argv)
args->arg_count = (unsigned int)(argc - optind);
}

// If all of the filenames provided are "-" (more than one "-"
// could be specified) or no filenames are provided, then we are
// only going to be writing to standard out. However if --files or
// --files0 is used, then we will not be writing to standard out.
if (!opt_stdout && args->files_name == NULL) {
uint32_t i;

for (i = 0; i < args->arg_count; i++) {
const char *name = args->arg_names[i];

// getopt_long() will not give us an empty string
// as an argument name here so we don't need to
// check if name[0] is a NULL terminator.
if (name[0] != '-' && name[1] != '\0')
break;
}

// Set opt_stdout if the loop did not exit early.
opt_stdout = i == args->arg_count;
}

// If raw format is used and a custom suffix is not provided,
// then only stdout mode can be used when compressing or decompressing.
// then only stdout mode can be used when compressing or
// decompressing.
if (opt_format == FORMAT_RAW && !suffix_is_set() && !opt_stdout
&& (opt_mode == MODE_COMPRESS
|| opt_mode == MODE_DECOMPRESS))
message_fatal(_("With --format=raw, --suffix=.SUF is "
"required unless writing to stdout"));
|| opt_mode == MODE_DECOMPRESS)) {
// If all of the filenames provided are "-" (more than one
// "-" could be specified) or no filenames are provided,
// then we are only going to be writing to standard out.
for (unsigned int i = 0; i < args->arg_count; i++) {
if (strcmp(args->arg_names[i], "-") != 0)
message_fatal(_("With --format=raw, "
"--suffix=.SUF is required "
"unless writing to stdout"));
}
}

return;
}
Expand Down

0 comments on commit f481523

Please sign in to comment.