From: Lennart Poettering Date: Fri, 23 May 2025 04:45:40 +0000 (+0200) Subject: path-util: invert PATH_STARTSWITH_ACCEPT_DOT_DOT flag X-Git-Tag: v258-rc1~512^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fpull%2F37572%2Fhead;p=thirdparty%2Fsystemd.git path-util: invert PATH_STARTSWITH_ACCEPT_DOT_DOT flag As requested: https://github.com/systemd/systemd/pull/37572#pullrequestreview-2861928094 --- diff --git a/src/basic/cgroup-util.c b/src/basic/cgroup-util.c index b68cab68a09..e11a6a3e492 100644 --- a/src/basic/cgroup-util.c +++ b/src/basic/cgroup-util.c @@ -976,7 +976,7 @@ int cg_shift_path(const char *cgroup, const char *root, const char **ret_shifted root = rt; } - *ret_shifted = path_startswith_full(cgroup, root, PATH_STARTSWITH_RETURN_LEADING_SLASH) ?: cgroup; + *ret_shifted = path_startswith_full(cgroup, root, PATH_STARTSWITH_RETURN_LEADING_SLASH|PATH_STARTSWITH_REFUSE_DOT_DOT) ?: cgroup; return 0; } diff --git a/src/basic/fs-util.c b/src/basic/fs-util.c index fd2312b543b..5b83c78b24d 100644 --- a/src/basic/fs-util.c +++ b/src/basic/fs-util.c @@ -67,7 +67,7 @@ int rmdir_parents(const char *path, const char *stop) { assert(*slash == '/'); *slash = '\0'; - if (path_startswith_full(stop, p, /* flags= */ 0)) + if (path_startswith_full(stop, p, PATH_STARTSWITH_REFUSE_DOT_DOT)) return 0; if (rmdir(p) < 0 && errno != ENOENT) diff --git a/src/basic/mkdir.c b/src/basic/mkdir.c index 9c04942bd13..fc2d36b33d5 100644 --- a/src/basic/mkdir.c +++ b/src/basic/mkdir.c @@ -151,7 +151,7 @@ int mkdir_parents_internal(const char *prefix, const char *path, mode_t mode, ui assert(_mkdirat != mkdirat); if (prefix) { - p = path_startswith_full(path, prefix, /* flags= */ 0); + p = path_startswith_full(path, prefix, PATH_STARTSWITH_REFUSE_DOT_DOT); if (!p) return -EINVAL; diff --git a/src/basic/path-util.c b/src/basic/path-util.c index 5dd9b589f6a..2fd568743ae 100644 --- a/src/basic/path-util.c +++ b/src/basic/path-util.c @@ -456,11 +456,11 @@ char* path_startswith_full(const char *original_path, const char *prefix, PathSt const char *p, *q; int m, n; - m = path_find_first_component(&path, FLAGS_SET(flags, PATH_STARTSWITH_ACCEPT_DOT_DOT), &p); + m = path_find_first_component(&path, !FLAGS_SET(flags, PATH_STARTSWITH_REFUSE_DOT_DOT), &p); if (m < 0) return NULL; - n = path_find_first_component(&prefix, FLAGS_SET(flags, PATH_STARTSWITH_ACCEPT_DOT_DOT), &q); + n = path_find_first_component(&prefix, !FLAGS_SET(flags, PATH_STARTSWITH_REFUSE_DOT_DOT), &q); if (n < 0) return NULL; diff --git a/src/basic/path-util.h b/src/basic/path-util.h index 172248577ee..fabb0eac88c 100644 --- a/src/basic/path-util.h +++ b/src/basic/path-util.h @@ -45,13 +45,13 @@ int path_make_relative(const char *from, const char *to, char **ret); int path_make_relative_parent(const char *from_child, const char *to, char **ret); typedef enum PathStartWithFlags { - PATH_STARTSWITH_ACCEPT_DOT_DOT = 1U << 0, + PATH_STARTSWITH_REFUSE_DOT_DOT = 1U << 0, PATH_STARTSWITH_RETURN_LEADING_SLASH = 1U << 1, } PathStartWithFlags; char* path_startswith_full(const char *path, const char *prefix, PathStartWithFlags flags) _pure_; static inline char* path_startswith(const char *path, const char *prefix) { - return path_startswith_full(path, prefix, PATH_STARTSWITH_ACCEPT_DOT_DOT); + return path_startswith_full(path, prefix, 0); } int path_compare(const char *a, const char *b) _pure_; diff --git a/src/core/cgroup.c b/src/core/cgroup.c index e9dade8eb34..ed5d0f975dd 100644 --- a/src/core/cgroup.c +++ b/src/core/cgroup.c @@ -2811,7 +2811,7 @@ static int unit_prune_cgroup_via_bus(Unit *u) { const char *pp = path_startswith_full( crt->cgroup_path, u->manager->cgroup_root, - PATH_STARTSWITH_RETURN_LEADING_SLASH); + PATH_STARTSWITH_RETURN_LEADING_SLASH|PATH_STARTSWITH_REFUSE_DOT_DOT); if (!pp) return -EINVAL;