]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
utils: rework lxc_deslashify()
authorChristian Brauner <christian.brauner@ubuntu.com>
Sat, 29 Jul 2017 21:10:17 +0000 (23:10 +0200)
committerStéphane Graber <stgraber@ubuntu.com>
Tue, 15 Aug 2017 20:34:55 +0000 (16:34 -0400)
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
src/lxc/criu.c
src/lxc/utils.c
src/lxc/utils.h
src/tests/lxc-test-utils.c

index ab3177f3f067a8ec4b7bbaa015ff9d71fb410272..fc7d086c8198663d3932ce04f949bbba1f3b90ce 100644 (file)
@@ -263,7 +263,7 @@ static void exec_criu(struct criu_opts *opts)
 
        for (i = 0; i < cgroup_num_hierarchies(); i++) {
                char **controllers = NULL, *fullname;
-               char *path;
+               char *path, *tmp;
 
                if (!cgroup_get_hierarchies(i, &controllers)) {
                        ERROR("failed to get hierarchy %d", i);
@@ -296,11 +296,15 @@ static void exec_criu(struct criu_opts *opts)
                        }
                }
 
-               if (!lxc_deslashify(&path)) {
-                       ERROR("failed to deslashify %s", path);
+               tmp = lxc_deslashify(path);
+               if (!tmp) {
+                       ERROR("Failed to remove extraneous slashes from \"%s\"",
+                             path);
                        free(path);
                        goto err;
                }
+               free(path);
+               path = tmp;
 
                fullname = lxc_string_join(",", (const char **) controllers, false);
                if (!fullname) {
index f89c837d5bdc161d9efa029622b2c111d60c2424..2a027393276d5c5b5b71e4dc99a99606e3870626 100644 (file)
@@ -728,47 +728,46 @@ char **lxc_normalize_path(const char *path)
        return components;
 }
 
-bool lxc_deslashify(char **path)
+char *lxc_deslashify(const char *path)
 {
-       bool ret = false;
-       char *p;
+       char *dup, *p;
        char **parts = NULL;
        size_t n, len;
 
-       parts = lxc_normalize_path(*path);
-       if (!parts)
-               return false;
+       dup = strdup(path);
+       if (!dup)
+               return NULL;
+
+       parts = lxc_normalize_path(dup);
+       if (!parts) {
+               free(dup);
+               return NULL;
+       }
 
        /* We'll end up here if path == "///" or path == "". */
        if (!*parts) {
-               len = strlen(*path);
+               len = strlen(dup);
                if (!len) {
-                       ret = true;
-                       goto out;
+                       lxc_free_array((void **)parts, free);
+                       return dup;
                }
-               n = strcspn(*path, "/");
+               n = strcspn(dup, "/");
                if (n == len) {
+                       free(dup);
+                       lxc_free_array((void **)parts, free);
+
                        p = strdup("/");
                        if (!p)
-                               goto out;
-                       free(*path);
-                       *path = p;
-                       ret = true;
-                       goto out;
+                               return NULL;
+
+                       return p;
                }
        }
 
-       p = lxc_string_join("/", (const char **)parts, **path == '/');
-       if (!p)
-               goto out;
-
-       free(*path);
-       *path = p;
-       ret = true;
-
-out:
+       p = lxc_string_join("/", (const char **)parts, *dup == '/');
+       free(dup);
        lxc_free_array((void **)parts, free);
-       return ret;
+       return p;
 }
 
 char *lxc_append_paths(const char *first, const char *second)
index 3465e6a6f2461066d4648acd49144b46692e454a..990510e369bbb1fe44ffcf79b2d2173c684c3bb0 100644 (file)
@@ -273,7 +273,7 @@ extern char *lxc_string_join(const char *sep, const char **parts, bool use_as_pr
  */
 extern char **lxc_normalize_path(const char *path);
 /* remove multiple slashes from the path, e.g. ///foo//bar -> /foo/bar */
-extern bool lxc_deslashify(char **path);
+extern char *lxc_deslashify(const char *path);
 extern char *lxc_append_paths(const char *first, const char *second);
 /* Note: the following two functions use strtok(), so they will never
  *       consider an empty element, even if two delimiters are next to
index 01d8cd6eb67b4e96840521d63f495353d68bd3a0..aba7706abcb1d85823b5f47e366941066b6187e1 100644 (file)
 
 void test_lxc_deslashify(void)
 {
-       char *s = strdup("/A///B//C/D/E/");
-       if (!s)
+       char *s = "/A///B//C/D/E/";
+       char *t;
+
+       t = lxc_deslashify(s);
+       if (!t)
                exit(EXIT_FAILURE);
-       lxc_test_assert_abort(lxc_deslashify(&s));
-       lxc_test_assert_abort(strcmp(s, "/A/B/C/D/E") == 0);
-       free(s);
+       lxc_test_assert_abort(strcmp(t, "/A/B/C/D/E") == 0);
+       free(t);
 
-       s = strdup("/A");
-       if (!s)
+       s = "/A";
+
+       t = lxc_deslashify(s);
+       if (!t)
                exit(EXIT_FAILURE);
-       lxc_test_assert_abort(lxc_deslashify(&s));
-       lxc_test_assert_abort(strcmp(s, "/A") == 0);
-       free(s);
+       lxc_test_assert_abort(strcmp(t, "/A") == 0);
+       free(t);
 
-       s = strdup("");
-       if (!s)
+       s = "";
+       t = lxc_deslashify(s);
+       if (!t)
                exit(EXIT_FAILURE);
-       lxc_test_assert_abort(lxc_deslashify(&s));
-       lxc_test_assert_abort(strcmp(s, "") == 0);
-       free(s);
+       lxc_test_assert_abort(strcmp(t, "") == 0);
+       free(t);
+
+       s = "//";
 
-       s = strdup("//");
-       if (!s)
+       t = lxc_deslashify(s);
+       if (!t)
                exit(EXIT_FAILURE);
-       lxc_test_assert_abort(lxc_deslashify(&s));
-       lxc_test_assert_abort(strcmp(s, "/") == 0);
-       free(s);
+       lxc_test_assert_abort(strcmp(t, "/") == 0);
+       free(t);
 }
 
 /* /proc/int_as_str/ns/mnt\0 = (5 + 21 + 7 + 1) */