diff --git a/src/basic/chase.c b/src/basic/chase.c index 17e5dd72b43..c2a914521a0 100644 --- a/src/basic/chase.c +++ b/src/basic/chase.c @@ -571,14 +571,13 @@ int chase_and_open(const char *path, const char *root, ChaseFlags chase_flags, i if (isempty(q)) q = "."; - r = path_extract_filename(q, &fname); - if (r < 0 && r != -EADDRNOTAVAIL) - return r; + if (!FLAGS_SET(chase_flags, CHASE_PARENT)) { + r = path_extract_filename(q, &fname); + if (r < 0 && r != -EADDRNOTAVAIL) + return r; + } - if (FLAGS_SET(chase_flags, CHASE_PARENT) || r == -EADDRNOTAVAIL) - r = fd_reopen(path_fd, open_flags); - else - r = xopenat(path_fd, fname, open_flags|O_NOFOLLOW, mode); + r = xopenat(path_fd, strempty(fname), open_flags|O_NOFOLLOW, mode); if (r < 0) return r; @@ -773,14 +772,13 @@ int chase_and_openat(int dir_fd, const char *path, ChaseFlags chase_flags, int o if (r < 0) return r; - r = path_extract_filename(p, &fname); - if (r < 0 && r != -EADDRNOTAVAIL) - return r; + if (!FLAGS_SET(chase_flags, CHASE_PARENT)) { + r = path_extract_filename(p, &fname); + if (r < 0 && r != -EADDRNOTAVAIL) + return r; + } - if (FLAGS_SET(chase_flags, CHASE_PARENT) || r == -EADDRNOTAVAIL) - r = fd_reopen(path_fd, open_flags); - else - r = xopenat(path_fd, fname, open_flags|O_NOFOLLOW, mode); + r = xopenat(path_fd, strempty(fname), open_flags|O_NOFOLLOW, mode); if (r < 0) return r;