From d9549b3d288a9cb053ab5198f3bc2d277b72600f Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Thu, 18 Feb 2021 22:05:48 +0100 Subject: gensquashfs: always construct input path during option processing Signed-off-by: David Oberhollenzer --- bin/gensquashfs/mkfs.c | 38 ++++---------------------------------- bin/gensquashfs/mkfs.h | 5 ++++- bin/gensquashfs/options.c | 23 ++++++++++++++++++++++- 3 files changed, 30 insertions(+), 36 deletions(-) diff --git a/bin/gensquashfs/mkfs.c b/bin/gensquashfs/mkfs.c index 4120242..2885d84 100644 --- a/bin/gensquashfs/mkfs.c +++ b/bin/gensquashfs/mkfs.c @@ -6,39 +6,6 @@ */ #include "mkfs.h" -static int set_working_dir(options_t *opt) -{ - const char *ptr; - char *path; - - if (opt->packdir != NULL) { - if (chdir(opt->packdir)) { - perror(opt->packdir); - return -1; - } - return 0; - } - - ptr = strrchr(opt->infile, '/'); - if (ptr == NULL) - return 0; - - path = strndup(opt->infile, ptr - opt->infile); - if (path == NULL) { - perror("constructing input directory path"); - return -1; - } - - if (chdir(path)) { - perror(path); - free(path); - return -1; - } - - free(path); - return 0; -} - static int pack_files(sqfs_block_processor_t *data, fstree_t *fs, options_t *opt) { @@ -52,8 +19,10 @@ static int pack_files(sqfs_block_processor_t *data, fstree_t *fs, int flags; int ret; - if (set_working_dir(opt)) + if (opt->packdir != NULL && chdir(opt->packdir) != 0) { + perror(opt->packdir); return -1; + } for (fi = fs->files; fi != NULL; fi = fi->next) { if (fi->input_file == NULL) { @@ -224,5 +193,6 @@ out: sqfs_writer_cleanup(&sqfs, status); if (sehnd != NULL) selinux_close_context_file(sehnd); + free(opt.packdir); return status; } diff --git a/bin/gensquashfs/mkfs.h b/bin/gensquashfs/mkfs.h index e1e4e1b..c43c10a 100644 --- a/bin/gensquashfs/mkfs.h +++ b/bin/gensquashfs/mkfs.h @@ -42,10 +42,13 @@ typedef struct { sqfs_writer_cfg_t cfg; unsigned int dirscan_flags; const char *infile; - const char *packdir; const char *selinux; bool no_tail_packing; + /* copied from command line or constructed from infile argument + if not specified. Must be free'd. */ + char *packdir; + unsigned int force_uid_value; unsigned int force_gid_value; bool force_uid; diff --git a/bin/gensquashfs/options.c b/bin/gensquashfs/options.c index 9153265..ec2263c 100644 --- a/bin/gensquashfs/options.c +++ b/bin/gensquashfs/options.c @@ -267,7 +267,12 @@ void process_command_line(options_t *opt, int argc, char **argv) opt->infile = optarg; break; case 'D': - opt->packdir = optarg; + free(opt->packdir); + opt->packdir = strdup(optarg); + if (opt->packdir == NULL) { + perror(optarg); + exit(EXIT_FAILURE); + } break; #ifdef WITH_SELINUX case 's': @@ -316,8 +321,24 @@ void process_command_line(options_t *opt, int argc, char **argv) fputs("Unknown extra arguments specified.\n", stderr); goto fail_arg; } + + /* construct packdir if not specified */ + if (opt->packdir == NULL && opt->infile != NULL) { + const char *split = strrchr(opt->infile, '/'); + + if (split != NULL) { + opt->packdir = strndup(opt->infile, + split - opt->infile); + + if (opt->packdir == NULL) { + perror("constructing input directory path"); + exit(EXIT_FAILURE); + } + } + } return; fail_arg: fputs("Try `gensquashfs --help' for more information.\n", stderr); + free(opt->packdir); exit(EXIT_FAILURE); } -- cgit v1.2.3