chase: carefully handle result of extracting parent directory

Should not change any behavior.
This commit is contained in:
Yu Watanabe
2023-07-29 21:58:30 +09:00
parent 1c13bdf342
commit 4de5b4e375
+18 -2
View File
@@ -292,9 +292,25 @@ int chaseat(int dir_fd, const char *path, ChaseFlags flags, char **ret_path, int
}
r = path_extract_directory(done, &parent);
if (r >= 0 || r == -EDESTADDRREQ)
if (r >= 0) {
assert(!need_absolute || path_is_absolute(parent));
free_and_replace(done, parent);
else if (IN_SET(r, -EINVAL, -EADDRNOTAVAIL)) {
} else if (r == -EDESTADDRREQ) {
/* 'done' contains filename only (i.e. no slash). */
assert(!need_absolute);
done = mfree(done);
} else if (r == -EADDRNOTAVAIL) {
/* 'done' is "/". This branch should be already handled in the above. */
assert(!FLAGS_SET(flags, CHASE_AT_RESOLVE_IN_ROOT));
assert_not_reached();
} else if (r == -EINVAL) {
/* 'done' is an empty string, ends with '..', or an invalid path. */
assert(!need_absolute);
assert(!FLAGS_SET(flags, CHASE_AT_RESOLVE_IN_ROOT));
if (!path_is_valid(done))
return -EINVAL;
/* If we're at the top of "dir_fd", start appending ".." to "done". */
if (!path_extend(&done, ".."))
return -ENOMEM;