From a3c3386eacb9909298cdd0ae147d1a49f617defc Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 13 Mar 2023 13:09:46 +0100 Subject: [PATCH] dissect: make all paths we operation on absolute Let's avoid any ambiguities around paths, and make them absolute when accepting them, like we do in most our tools now. This makes us independent of the current working directory and allows us to change it without issues or pass around the paths elsewhere if need be. --- src/dissect/dissect.c | 62 ++++++++++++++++++++++++++++++++----------- 1 file changed, 47 insertions(+), 15 deletions(-) diff --git a/src/dissect/dissect.c b/src/dissect/dissect.c index 3d3a133a283..2658b2da60f 100644 --- a/src/dissect/dissect.c +++ b/src/dissect/dissect.c @@ -62,8 +62,8 @@ static enum { ACTION_COPY_TO, ACTION_DISCOVER, } arg_action = ACTION_DISSECT; -static const char *arg_image = NULL; -static const char *arg_path = NULL; +static char *arg_image = NULL; +static char *arg_path = NULL; static const char *arg_source = NULL; static const char *arg_target = NULL; static DissectImageFlags arg_flags = @@ -84,6 +84,8 @@ static bool arg_in_memory = false; static char **arg_argv = NULL; static char *arg_loop_ref = NULL; +STATIC_DESTRUCTOR_REGISTER(arg_image, freep); +STATIC_DESTRUCTOR_REGISTER(arg_path, freep); STATIC_DESTRUCTOR_REGISTER(arg_verity_settings, verity_settings_done); STATIC_DESTRUCTOR_REGISTER(arg_argv, strv_freep); STATIC_DESTRUCTOR_REGISTER(arg_loop_ref, freep); @@ -470,7 +472,10 @@ static int parse_argv(int argc, char *argv[]) { return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Expected an image file path as only argument."); - arg_image = argv[optind]; + r = parse_path_argument(argv[optind], /* suppress_root= */ false, &arg_image); + if (r < 0) + return r; + arg_flags |= DISSECT_IMAGE_READ_ONLY; break; @@ -479,8 +484,14 @@ static int parse_argv(int argc, char *argv[]) { return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Expected an image file path and mount point path as only arguments."); - arg_image = argv[optind]; - arg_path = argv[optind + 1]; + r = parse_path_argument(argv[optind], /* suppress_root= */ false, &arg_image); + if (r < 0) + return r; + + r = parse_path_argument(argv[optind+1], /* suppress_root= */ false, &arg_path); + if (r < 0) + return r; + arg_flags |= DISSECT_IMAGE_REQUIRE_ROOT; break; @@ -489,7 +500,9 @@ static int parse_argv(int argc, char *argv[]) { return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Expected a mount point path as only argument."); - arg_path = argv[optind]; + r = parse_path_argument(argv[optind], /* suppress_root= */ false, &arg_path); + if (r < 0) + return r; break; case ACTION_ATTACH: @@ -497,7 +510,9 @@ static int parse_argv(int argc, char *argv[]) { return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Expected an image file path as only argument."); - arg_image = argv[optind]; + r = parse_path_argument(argv[optind], /* suppress_root= */ false, &arg_image); + if (r < 0) + return r; break; case ACTION_DETACH: @@ -505,7 +520,9 @@ static int parse_argv(int argc, char *argv[]) { return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Expected an image file path or loopback device as only argument."); - arg_image = argv[optind]; + r = parse_path_argument(argv[optind], /* suppress_root= */ false, &arg_image); + if (r < 0) + return r; break; case ACTION_LIST: @@ -514,7 +531,10 @@ static int parse_argv(int argc, char *argv[]) { return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Expected an image file path as only argument."); - arg_image = argv[optind]; + r = parse_path_argument(argv[optind], /* suppress_root= */ false, &arg_image); + if (r < 0) + return r; + arg_flags |= DISSECT_IMAGE_READ_ONLY | DISSECT_IMAGE_REQUIRE_ROOT; break; @@ -523,7 +543,9 @@ static int parse_argv(int argc, char *argv[]) { return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Expected an image file path, a source path and an optional destination path as only arguments."); - arg_image = argv[optind]; + r = parse_path_argument(argv[optind], /* suppress_root= */ false, &arg_image); + if (r < 0) + return r; arg_source = argv[optind + 1]; arg_target = argc > optind + 2 ? argv[optind + 2] : "-" /* this means stdout */ ; @@ -535,7 +557,9 @@ static int parse_argv(int argc, char *argv[]) { return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Expected an image file path, an optional source path and a destination path as only arguments."); - arg_image = argv[optind]; + r = parse_path_argument(argv[optind], /* suppress_root= */ false, &arg_image); + if (r < 0) + return r; if (argc > optind + 2) { arg_source = argv[optind + 1]; @@ -553,7 +577,10 @@ static int parse_argv(int argc, char *argv[]) { return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "Expected an image file path and an optional command line."); - arg_image = argv[optind]; + r = parse_path_argument(argv[optind], /* suppress_root= */ false, &arg_image); + if (r < 0) + return r; + if (argc > optind + 1) { arg_argv = strv_copy(argv + optind + 1); if (!arg_argv) @@ -642,8 +669,13 @@ static int parse_argv_as_mount_helper(int argc, char *argv[]) { if (fake) return 0; - arg_image = argv[optind]; - arg_path = argv[optind+1]; + r = parse_path_argument(argv[optind], /* suppress_root= */ false, &arg_image); + if (r < 0) + return r; + + r = parse_path_argument(argv[optind+1], /* suppress_root= */ false, &arg_path); + if (r < 0) + return r; arg_flags |= DISSECT_IMAGE_REQUIRE_ROOT; arg_action = ACTION_MOUNT; @@ -908,7 +940,7 @@ static int action_dissect(DissectedImage *m, LoopDevice *d) { return table_log_add_error(r); if (p->partno < 0) /* no partition table, naked file system */ { - r = table_add_cell(t, NULL, TABLE_STRING, arg_image); + r = table_add_cell(t, NULL, TABLE_PATH_BASENAME, arg_image); if (r < 0) return table_log_add_error(r); -- 2.47.3