mirror of
https://github.com/systemd/systemd.git
synced 2025-01-31 05:47:30 +03:00
tree-wide: add path_simplify_alloc() and use it
path_simplify_full()/path_simplify() are changed to allow a NULL path, for which a NULL is returned. Generally, callers have already asserted before that the argument is nonnull. This way path_simplify_full()/path_simplify() and path_simplify_alloc() behave consistently. In sd-device.c, logging in device_set_syspath() is intentionally dropped: other branches don't log. In mount-tool.c, logging in parse_argv() is changed to log the user-specified value, not the simplified string. In an error message, we should show the actual argument we got, not some transformed version.
This commit is contained in:
parent
7902df1263
commit
660087dc9c
@ -947,6 +947,7 @@ int cg_is_empty_recursive(const char *controller, const char *path) {
|
|||||||
|
|
||||||
int cg_split_spec(const char *spec, char **ret_controller, char **ret_path) {
|
int cg_split_spec(const char *spec, char **ret_controller, char **ret_path) {
|
||||||
_cleanup_free_ char *controller = NULL, *path = NULL;
|
_cleanup_free_ char *controller = NULL, *path = NULL;
|
||||||
|
int r;
|
||||||
|
|
||||||
assert(spec);
|
assert(spec);
|
||||||
|
|
||||||
@ -955,11 +956,9 @@ int cg_split_spec(const char *spec, char **ret_controller, char **ret_path) {
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (ret_path) {
|
if (ret_path) {
|
||||||
path = strdup(spec);
|
r = path_simplify_alloc(spec, &path);
|
||||||
if (!path)
|
if (r < 0)
|
||||||
return -ENOMEM;
|
return r;
|
||||||
|
|
||||||
path_simplify(path);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -1006,22 +1005,14 @@ int cg_split_spec(const char *spec, char **ret_controller, char **ret_path) {
|
|||||||
|
|
||||||
int cg_mangle_path(const char *path, char **result) {
|
int cg_mangle_path(const char *path, char **result) {
|
||||||
_cleanup_free_ char *c = NULL, *p = NULL;
|
_cleanup_free_ char *c = NULL, *p = NULL;
|
||||||
char *t;
|
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
assert(path);
|
assert(path);
|
||||||
assert(result);
|
assert(result);
|
||||||
|
|
||||||
/* First, check if it already is a filesystem path */
|
/* First, check if it already is a filesystem path */
|
||||||
if (path_startswith(path, "/sys/fs/cgroup")) {
|
if (path_startswith(path, "/sys/fs/cgroup"))
|
||||||
|
return path_simplify_alloc(path, result);
|
||||||
t = strdup(path);
|
|
||||||
if (!t)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
*result = path_simplify(t);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Otherwise, treat it as cg spec */
|
/* Otherwise, treat it as cg spec */
|
||||||
r = cg_split_spec(path, &c, &p);
|
r = cg_split_spec(path, &c, &p);
|
||||||
|
@ -1110,6 +1110,7 @@ int search_and_fopen(
|
|||||||
char **ret_path) {
|
char **ret_path) {
|
||||||
|
|
||||||
_cleanup_strv_free_ char **copy = NULL;
|
_cleanup_strv_free_ char **copy = NULL;
|
||||||
|
int r;
|
||||||
|
|
||||||
assert(filename);
|
assert(filename);
|
||||||
assert(mode);
|
assert(mode);
|
||||||
@ -1123,13 +1124,9 @@ int search_and_fopen(
|
|||||||
return -errno;
|
return -errno;
|
||||||
|
|
||||||
if (ret_path) {
|
if (ret_path) {
|
||||||
char *p;
|
r = path_simplify_alloc(filename, ret_path);
|
||||||
|
if (r < 0)
|
||||||
p = strdup(filename);
|
return r;
|
||||||
if (!p)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
*ret_path = path_simplify(p);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
*ret = TAKE_PTR(f);
|
*ret = TAKE_PTR(f);
|
||||||
@ -1152,6 +1149,7 @@ int search_and_fopen_nulstr(
|
|||||||
char **ret_path) {
|
char **ret_path) {
|
||||||
|
|
||||||
_cleanup_strv_free_ char **s = NULL;
|
_cleanup_strv_free_ char **s = NULL;
|
||||||
|
int r;
|
||||||
|
|
||||||
if (path_is_absolute(filename)) {
|
if (path_is_absolute(filename)) {
|
||||||
_cleanup_fclose_ FILE *f = NULL;
|
_cleanup_fclose_ FILE *f = NULL;
|
||||||
@ -1161,13 +1159,9 @@ int search_and_fopen_nulstr(
|
|||||||
return -errno;
|
return -errno;
|
||||||
|
|
||||||
if (ret_path) {
|
if (ret_path) {
|
||||||
char *p;
|
r = path_simplify_alloc(filename, ret_path);
|
||||||
|
if (r < 0)
|
||||||
p = strdup(filename);
|
return r;
|
||||||
if (!p)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
*ret_path = path_simplify(p);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
*ret = TAKE_PTR(f);
|
*ret = TAKE_PTR(f);
|
||||||
|
@ -132,11 +132,9 @@ int path_make_relative(const char *from, const char *to, char **ret) {
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
} else {
|
} else {
|
||||||
/* 'to' is inside of 'from'. */
|
/* 'to' is inside of 'from'. */
|
||||||
result = strdup(t);
|
r = path_simplify_alloc(t, &result);
|
||||||
if (!result)
|
if (r < 0)
|
||||||
return -ENOMEM;
|
return r;
|
||||||
|
|
||||||
path_simplify(result);
|
|
||||||
|
|
||||||
if (!path_is_valid(result))
|
if (!path_is_valid(result))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@ -346,7 +344,7 @@ char** path_strv_resolve_uniq(char **l, const char *root) {
|
|||||||
|
|
||||||
char* path_simplify_full(char *path, PathSimplifyFlags flags) {
|
char* path_simplify_full(char *path, PathSimplifyFlags flags) {
|
||||||
bool add_slash = false, keep_trailing_slash, absolute, beginning = true;
|
bool add_slash = false, keep_trailing_slash, absolute, beginning = true;
|
||||||
char *f = ASSERT_PTR(path);
|
char *f = path;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
/* Removes redundant inner and trailing slashes. Also removes unnecessary dots.
|
/* Removes redundant inner and trailing slashes. Also removes unnecessary dots.
|
||||||
|
@ -85,6 +85,22 @@ static inline char* path_simplify(char *path) {
|
|||||||
return path_simplify_full(path, 0);
|
return path_simplify_full(path, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int path_simplify_alloc(const char *path, char **ret) {
|
||||||
|
assert(ret);
|
||||||
|
|
||||||
|
if (!path) {
|
||||||
|
*ret = NULL;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
char *t = strdup(path);
|
||||||
|
if (!t)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
*ret = path_simplify(t);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static inline bool path_equal_ptr(const char *a, const char *b) {
|
static inline bool path_equal_ptr(const char *a, const char *b) {
|
||||||
return !!a == !!b && (!a || path_equal(a, b));
|
return !!a == !!b && (!a || path_equal(a, b));
|
||||||
}
|
}
|
||||||
|
@ -389,15 +389,14 @@ int unit_name_unescape(const char *f, char **ret) {
|
|||||||
int unit_name_path_escape(const char *f, char **ret) {
|
int unit_name_path_escape(const char *f, char **ret) {
|
||||||
_cleanup_free_ char *p = NULL;
|
_cleanup_free_ char *p = NULL;
|
||||||
char *s;
|
char *s;
|
||||||
|
int r;
|
||||||
|
|
||||||
assert(f);
|
assert(f);
|
||||||
assert(ret);
|
assert(ret);
|
||||||
|
|
||||||
p = strdup(f);
|
r = path_simplify_alloc(f, &p);
|
||||||
if (!p)
|
if (r < 0)
|
||||||
return -ENOMEM;
|
return r;
|
||||||
|
|
||||||
path_simplify(p);
|
|
||||||
|
|
||||||
if (empty_or_root(p))
|
if (empty_or_root(p))
|
||||||
s = strdup("-");
|
s = strdup("-");
|
||||||
|
@ -589,7 +589,6 @@ int getgroups_alloc(gid_t** gids) {
|
|||||||
int get_home_dir(char **ret) {
|
int get_home_dir(char **ret) {
|
||||||
struct passwd *p;
|
struct passwd *p;
|
||||||
const char *e;
|
const char *e;
|
||||||
char *h;
|
|
||||||
uid_t u;
|
uid_t u;
|
||||||
|
|
||||||
assert(ret);
|
assert(ret);
|
||||||
@ -622,18 +621,12 @@ int get_home_dir(char **ret) {
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
found:
|
found:
|
||||||
h = strdup(e);
|
return path_simplify_alloc(e, ret);
|
||||||
if (!h)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
*ret = path_simplify(h);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int get_shell(char **ret) {
|
int get_shell(char **ret) {
|
||||||
struct passwd *p;
|
struct passwd *p;
|
||||||
const char *e;
|
const char *e;
|
||||||
char *s;
|
|
||||||
uid_t u;
|
uid_t u;
|
||||||
|
|
||||||
assert(ret);
|
assert(ret);
|
||||||
@ -665,12 +658,7 @@ int get_shell(char **ret) {
|
|||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
found:
|
found:
|
||||||
s = strdup(e);
|
return path_simplify_alloc(e, ret);
|
||||||
if (!s)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
*ret = path_simplify(s);
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int reset_uid_gid(void) {
|
int reset_uid_gid(void) {
|
||||||
|
@ -98,11 +98,9 @@ static int bus_path_set_transient_property(
|
|||||||
if (!UNIT_WRITE_FLAGS_NOOP(flags)) {
|
if (!UNIT_WRITE_FLAGS_NOOP(flags)) {
|
||||||
_cleanup_free_ char *k = NULL;
|
_cleanup_free_ char *k = NULL;
|
||||||
|
|
||||||
k = strdup(path);
|
r = path_simplify_alloc(path, &k);
|
||||||
if (!k)
|
if (r < 0)
|
||||||
return -ENOMEM;
|
return r;
|
||||||
|
|
||||||
path_simplify(k);
|
|
||||||
|
|
||||||
PathSpec *s = new(PathSpec, 1);
|
PathSpec *s = new(PathSpec, 1);
|
||||||
if (!s)
|
if (!s)
|
||||||
|
@ -383,11 +383,9 @@ static int bus_socket_set_transient_property(
|
|||||||
if (!path_is_absolute(a) || !path_is_valid(a))
|
if (!path_is_absolute(a) || !path_is_valid(a))
|
||||||
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid socket path: %s", a);
|
return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid socket path: %s", a);
|
||||||
|
|
||||||
p->path = strdup(a);
|
r = path_simplify_alloc(a, &p->path);
|
||||||
if (!p->path)
|
if (r < 0)
|
||||||
return log_oom();
|
return r;
|
||||||
|
|
||||||
path_simplify(p->path);
|
|
||||||
|
|
||||||
} else if (streq(t, "Netlink")) {
|
} else if (streq(t, "Netlink")) {
|
||||||
r = socket_address_parse_netlink(&p->address, a);
|
r = socket_address_parse_netlink(&p->address, a);
|
||||||
|
@ -232,11 +232,9 @@ int device_set_syspath(sd_device *device, const char *_syspath, bool verify) {
|
|||||||
"sd-device: Syspath '%s' is not a subdirectory of /sys",
|
"sd-device: Syspath '%s' is not a subdirectory of /sys",
|
||||||
_syspath);
|
_syspath);
|
||||||
|
|
||||||
syspath = strdup(_syspath);
|
r = path_simplify_alloc(_syspath, &syspath);
|
||||||
if (!syspath)
|
if (r < 0)
|
||||||
return log_oom_debug();
|
return r;
|
||||||
|
|
||||||
path_simplify(syspath);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
assert_se(devpath = startswith(syspath, "/sys"));
|
assert_se(devpath = startswith(syspath, "/sys"));
|
||||||
|
@ -83,30 +83,26 @@ STATIC_DESTRUCTOR_REGISTER(arg_property, strv_freep);
|
|||||||
STATIC_DESTRUCTOR_REGISTER(arg_automount_property, strv_freep);
|
STATIC_DESTRUCTOR_REGISTER(arg_automount_property, strv_freep);
|
||||||
|
|
||||||
static int parse_where(const char *input, char **ret_where) {
|
static int parse_where(const char *input, char **ret_where) {
|
||||||
_cleanup_free_ char *where = NULL;
|
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
assert(input);
|
assert(input);
|
||||||
assert(ret_where);
|
assert(ret_where);
|
||||||
|
|
||||||
if (arg_transport == BUS_TRANSPORT_LOCAL) {
|
if (arg_transport == BUS_TRANSPORT_LOCAL) {
|
||||||
r = chase(input, NULL, CHASE_NONEXISTENT, &where, NULL);
|
r = chase(input, NULL, CHASE_NONEXISTENT, ret_where, NULL);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return log_error_errno(r, "Failed to make path %s absolute: %m", input);
|
return log_error_errno(r, "Failed to make path %s absolute: %m", input);
|
||||||
} else {
|
} else {
|
||||||
where = strdup(input);
|
if (!path_is_absolute(input))
|
||||||
if (!where)
|
|
||||||
return log_oom();
|
|
||||||
|
|
||||||
path_simplify(where);
|
|
||||||
|
|
||||||
if (!path_is_absolute(where))
|
|
||||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||||
"Path must be absolute when operating remotely: %s",
|
"Path must be absolute when operating remotely: %s",
|
||||||
where);
|
input);
|
||||||
|
|
||||||
|
r = path_simplify_alloc(input, ret_where);
|
||||||
|
if (r < 0)
|
||||||
|
return log_error_errno(r, "Failed to simplify path %s: %m", input);
|
||||||
}
|
}
|
||||||
|
|
||||||
*ret_where = TAKE_PTR(where);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -441,17 +437,16 @@ static int parse_argv(int argc, char *argv[]) {
|
|||||||
r = chase(u, NULL, 0, &arg_mount_what, NULL);
|
r = chase(u, NULL, 0, &arg_mount_what, NULL);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
return log_error_errno(r, "Failed to make path %s absolute: %m", u);
|
return log_error_errno(r, "Failed to make path %s absolute: %m", u);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
arg_mount_what = strdup(argv[optind]);
|
if (!path_is_absolute(argv[optind]))
|
||||||
if (!arg_mount_what)
|
|
||||||
return log_oom();
|
|
||||||
|
|
||||||
path_simplify(arg_mount_what);
|
|
||||||
|
|
||||||
if (!path_is_absolute(arg_mount_what))
|
|
||||||
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
|
||||||
"Path must be absolute when operating remotely: %s",
|
"Path must be absolute when operating remotely: %s",
|
||||||
arg_mount_what);
|
argv[optind]);
|
||||||
|
|
||||||
|
r = path_simplify_alloc(argv[optind], &arg_mount_what);
|
||||||
|
if (r < 0)
|
||||||
|
return log_error_errno(r, "Failed to simplify path: %m");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1054,11 +1049,9 @@ static int action_umount(
|
|||||||
for (int i = optind; i < argc; i++) {
|
for (int i = optind; i < argc; i++) {
|
||||||
_cleanup_free_ char *p = NULL;
|
_cleanup_free_ char *p = NULL;
|
||||||
|
|
||||||
p = strdup(argv[i]);
|
r = path_simplify_alloc(argv[i], &p);
|
||||||
if (!p)
|
if (r < 0)
|
||||||
return log_oom();
|
return r;
|
||||||
|
|
||||||
path_simplify(p);
|
|
||||||
|
|
||||||
r = stop_mounts(bus, p);
|
r = stop_mounts(bus, p);
|
||||||
if (r < 0)
|
if (r < 0)
|
||||||
|
@ -838,6 +838,7 @@ static int portable_changes_add(
|
|||||||
|
|
||||||
_cleanup_free_ char *p = NULL, *s = NULL;
|
_cleanup_free_ char *p = NULL, *s = NULL;
|
||||||
PortableChange *c;
|
PortableChange *c;
|
||||||
|
int r;
|
||||||
|
|
||||||
assert(path);
|
assert(path);
|
||||||
assert(!changes == !n_changes);
|
assert(!changes == !n_changes);
|
||||||
@ -855,19 +856,13 @@ static int portable_changes_add(
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
*changes = c;
|
*changes = c;
|
||||||
|
|
||||||
p = strdup(path);
|
r = path_simplify_alloc(path, &p);
|
||||||
if (!p)
|
if (r < 0)
|
||||||
return -ENOMEM;
|
return r;
|
||||||
|
|
||||||
path_simplify(p);
|
r = path_simplify_alloc(source, &s);
|
||||||
|
if (r < 0)
|
||||||
if (source) {
|
return r;
|
||||||
s = strdup(source);
|
|
||||||
if (!s)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
path_simplify(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
c[(*n_changes)++] = (PortableChange) {
|
c[(*n_changes)++] = (PortableChange) {
|
||||||
.type_or_errno = type_or_errno,
|
.type_or_errno = type_or_errno,
|
||||||
|
@ -285,6 +285,7 @@ InstallChangeType install_changes_add(
|
|||||||
|
|
||||||
_cleanup_free_ char *p = NULL, *s = NULL;
|
_cleanup_free_ char *p = NULL, *s = NULL;
|
||||||
InstallChange *c;
|
InstallChange *c;
|
||||||
|
int r;
|
||||||
|
|
||||||
assert(!changes == !n_changes);
|
assert(!changes == !n_changes);
|
||||||
assert(INSTALL_CHANGE_TYPE_VALID(type));
|
assert(INSTALL_CHANGE_TYPE_VALID(type));
|
||||||
@ -303,21 +304,13 @@ InstallChangeType install_changes_add(
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
*changes = c;
|
*changes = c;
|
||||||
|
|
||||||
if (path) {
|
r = path_simplify_alloc(path, &p);
|
||||||
p = strdup(path);
|
if (r < 0)
|
||||||
if (!p)
|
return r;
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
path_simplify(p);
|
r = path_simplify_alloc(source, &s);
|
||||||
}
|
if (r < 0)
|
||||||
|
return r;
|
||||||
if (source) {
|
|
||||||
s = strdup(source);
|
|
||||||
if (!s)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
path_simplify(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
c[(*n_changes)++] = (InstallChange) {
|
c[(*n_changes)++] = (InstallChange) {
|
||||||
.type = type,
|
.type = type,
|
||||||
|
@ -331,15 +331,14 @@ static int stack_directory_get_name(const char *slink, char **ret) {
|
|||||||
_cleanup_free_ char *s = NULL, *dirname = NULL;
|
_cleanup_free_ char *s = NULL, *dirname = NULL;
|
||||||
char name_enc[NAME_MAX+1];
|
char name_enc[NAME_MAX+1];
|
||||||
const char *name;
|
const char *name;
|
||||||
|
int r;
|
||||||
|
|
||||||
assert(slink);
|
assert(slink);
|
||||||
assert(ret);
|
assert(ret);
|
||||||
|
|
||||||
s = strdup(slink);
|
r = path_simplify_alloc(slink, &s);
|
||||||
if (!s)
|
if (r < 0)
|
||||||
return -ENOMEM;
|
return r;
|
||||||
|
|
||||||
path_simplify(s);
|
|
||||||
|
|
||||||
if (!path_is_normalized(s))
|
if (!path_is_normalized(s))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user