]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
dissect: make all paths we operation on absolute
authorLennart Poettering <lennart@poettering.net>
Mon, 13 Mar 2023 12:09:46 +0000 (13:09 +0100)
committerLennart Poettering <lennart@poettering.net>
Tue, 14 Mar 2023 22:04:18 +0000 (23:04 +0100)
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

index 3d3a133a283b61f0a05b82a5ab05931e86303cb4..2658b2da60f16929b3bcaa1fa8321136eefee306 100644 (file)
@@ -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);