mirror of
https://github.com/systemd/systemd.git
synced 2024-12-25 01:34:28 +03:00
chase: make the result absolute when a symlink is absolute
As the path may be outside of the specified dir_fd.
This commit is contained in:
parent
c0552b359c
commit
24be89ebd8
@ -374,6 +374,11 @@ int chaseat(int dir_fd, const char *path, ChaseFlags flags, char **ret_path, int
|
||||
unsafe_transition(&st_child, &st))
|
||||
return log_unsafe_transition(child, fd, path, flags);
|
||||
|
||||
/* When CHASE_AT_RESOLVE_IN_ROOT is not set, now the chased path may be
|
||||
* outside of the specified dir_fd. Let's make the result absolute. */
|
||||
if (!FLAGS_SET(flags, CHASE_AT_RESOLVE_IN_ROOT))
|
||||
need_absolute = true;
|
||||
|
||||
r = free_and_strdup(&done, need_absolute ? "/" : NULL);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
@ -457,7 +457,16 @@ TEST(chaseat) {
|
||||
|
||||
fd = safe_close(fd);
|
||||
|
||||
/* If the file descriptor does not point to the root directory, the result will be relative. */
|
||||
/* If the file descriptor does not point to the root directory, the result will be relative
|
||||
* unless the result is outside of the specified file descriptor. */
|
||||
|
||||
assert_se(chaseat(tfd, "abc", 0, &result, NULL) >= 0);
|
||||
assert_se(streq(result, "/usr"));
|
||||
result = mfree(result);
|
||||
|
||||
assert_se(chaseat(tfd, "/abc", 0, &result, NULL) >= 0);
|
||||
assert_se(streq(result, "/usr"));
|
||||
result = mfree(result);
|
||||
|
||||
assert_se(chaseat(tfd, "abc", CHASE_AT_RESOLVE_IN_ROOT, NULL, NULL) == -ENOENT);
|
||||
assert_se(chaseat(tfd, "/abc", CHASE_AT_RESOLVE_IN_ROOT, NULL, NULL) == -ENOENT);
|
||||
|
Loading…
Reference in New Issue
Block a user