summaryrefslogtreecommitdiff
path: root/src/dissect
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2023-03-13 13:09:46 +0100
committerLennart Poettering <lennart@poettering.net>2023-03-14 23:04:18 +0100
commita3c3386eacb9909298cdd0ae147d1a49f617defc (patch)
tree9c8933baff1412309a6e25ec4b397fff1152f9ed /src/dissect
parentf0a96d195af99c5ecd84cc889ec899f1c4470840 (diff)
downloadsystemd-a3c3386eacb9909298cdd0ae147d1a49f617defc.tar.gz
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.
Diffstat (limited to 'src/dissect')
-rw-r--r--src/dissect/dissect.c62
1 files changed, 47 insertions, 15 deletions
diff --git a/src/dissect/dissect.c b/src/dissect/dissect.c
index 3d3a133a28..2658b2da60 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);