diff --git a/src/basic/fs-util.h b/src/basic/fs-util.h index eb031a0ccde..b2c01079901 100644 --- a/src/basic/fs-util.h +++ b/src/basic/fs-util.h @@ -172,3 +172,12 @@ static inline int at_flags_normalize_nofollow(int flags) { flags |= AT_SYMLINK_NOFOLLOW; return flags; } + +static inline int at_flags_normalize_follow(int flags) { + if (FLAGS_SET(flags, AT_SYMLINK_NOFOLLOW)) { + assert(!FLAGS_SET(flags, AT_SYMLINK_FOLLOW)); + flags &= ~AT_SYMLINK_NOFOLLOW; + } else + flags |= AT_SYMLINK_FOLLOW; + return flags; +} diff --git a/src/basic/stat-util.c b/src/basic/stat-util.c index 2181ee2df51..10bd7c0fe17 100644 --- a/src/basic/stat-util.c +++ b/src/basic/stat-util.c @@ -298,7 +298,7 @@ int inode_same_at(int fda, const char *filea, int fdb, const char *fileb, int fl flags |= AT_EMPTY_PATH; } - int ntha_flags = (flags & AT_EMPTY_PATH) | (FLAGS_SET(flags, AT_SYMLINK_NOFOLLOW) ? 0 : AT_SYMLINK_FOLLOW); + int ntha_flags = at_flags_normalize_follow(flags) & (AT_EMPTY_PATH|AT_SYMLINK_FOLLOW); _cleanup_free_ struct file_handle *ha = NULL, *hb = NULL; int mntida = -1, mntidb = -1; diff --git a/src/basic/xattr-util.c b/src/basic/xattr-util.c index d2daf87ec91..896d85bf5cc 100644 --- a/src/basic/xattr-util.c +++ b/src/basic/xattr-util.c @@ -175,7 +175,7 @@ int fd_getcrtime_at( * most sense. */ if (statx(fd, strempty(path), - (flags & ~AT_SYMLINK_FOLLOW)|(FLAGS_SET(flags, AT_SYMLINK_FOLLOW) ? 0 : AT_SYMLINK_NOFOLLOW)|AT_STATX_DONT_SYNC, + at_flags_normalize_nofollow(flags)|AT_STATX_DONT_SYNC, STATX_BTIME, &sx) >= 0 && (sx.stx_mask & STATX_BTIME) &&