From: Daan De Meyer Date: Mon, 11 May 2026 17:34:01 +0000 (+0200) Subject: chase: Use ELOOP for CHASE_PROHIBIT_SYMLINKS error X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=452214c09ba3dea05dd214a1cea315333903266f;p=thirdparty%2Fsystemd.git chase: Use ELOOP for CHASE_PROHIBIT_SYMLINKS error Matches the behavior of openat2() with RESOLVE_NO_SYMLINKS which makes introducing support for openat2() easier. --- diff --git a/src/basic/chase.c b/src/basic/chase.c index 50ab4e3c474..b8fcbcb4e5f 100644 --- a/src/basic/chase.c +++ b/src/basic/chase.c @@ -139,11 +139,11 @@ static int log_prohibited_symlink(int fd, ChaseFlags flags) { assert(fd >= 0); if (!FLAGS_SET(flags, CHASE_WARN)) - return -EREMCHG; + return -ELOOP; (void) fd_get_path(fd, &n1); - return log_warning_errno(SYNTHETIC_ERRNO(EREMCHG), + return log_warning_errno(SYNTHETIC_ERRNO(ELOOP), "Detected symlink where no symlink is allowed at '%s', refusing.", strna(n1)); } diff --git a/src/core/mount.c b/src/core/mount.c index 967274b950b..c57f6e8a667 100644 --- a/src/core/mount.c +++ b/src/core/mount.c @@ -1171,7 +1171,7 @@ static void mount_enter_mounting(Mount *m) { * couldn't support that reasonably: the mounts in /proc/self/mountinfo would not be recognizable to * us anymore. */ fd = chase_and_open_parent(m->where, /* root= */ NULL, CHASE_PROHIBIT_SYMLINKS|CHASE_MKDIR_0755|CHASE_TRIGGER_AUTOFS, &fn); - if (fd == -EREMCHG) { + if (fd == -ELOOP) { r = unit_log_noncanonical_mount_path(UNIT(m), m->where); goto fail; } diff --git a/src/test/test-chase.c b/src/test/test-chase.c index ed07ac5cef6..23ceef53285 100644 --- a/src/test/test-chase.c +++ b/src/test/test-chase.c @@ -403,12 +403,12 @@ TEST(chase) { /* Test CHASE_PROHIBIT_SYMLINKS */ - ASSERT_ERROR(chase("top/dot", temp, CHASE_PREFIX_ROOT|CHASE_PROHIBIT_SYMLINKS, NULL, NULL), EREMCHG); - ASSERT_ERROR(chase("top/dot", temp, CHASE_PREFIX_ROOT|CHASE_PROHIBIT_SYMLINKS|CHASE_WARN, NULL, NULL), EREMCHG); - ASSERT_ERROR(chase("top/dotdot", temp, CHASE_PREFIX_ROOT|CHASE_PROHIBIT_SYMLINKS, NULL, NULL), EREMCHG); - ASSERT_ERROR(chase("top/dotdot", temp, CHASE_PREFIX_ROOT|CHASE_PROHIBIT_SYMLINKS|CHASE_WARN, NULL, NULL), EREMCHG); - ASSERT_ERROR(chase("top/dot/dot", temp, CHASE_PREFIX_ROOT|CHASE_PROHIBIT_SYMLINKS, NULL, NULL), EREMCHG); - ASSERT_ERROR(chase("top/dot/dot", temp, CHASE_PREFIX_ROOT|CHASE_PROHIBIT_SYMLINKS|CHASE_WARN, NULL, NULL), EREMCHG); + ASSERT_ERROR(chase("top/dot", temp, CHASE_PREFIX_ROOT|CHASE_PROHIBIT_SYMLINKS, NULL, NULL), ELOOP); + ASSERT_ERROR(chase("top/dot", temp, CHASE_PREFIX_ROOT|CHASE_PROHIBIT_SYMLINKS|CHASE_WARN, NULL, NULL), ELOOP); + ASSERT_ERROR(chase("top/dotdot", temp, CHASE_PREFIX_ROOT|CHASE_PROHIBIT_SYMLINKS, NULL, NULL), ELOOP); + ASSERT_ERROR(chase("top/dotdot", temp, CHASE_PREFIX_ROOT|CHASE_PROHIBIT_SYMLINKS|CHASE_WARN, NULL, NULL), ELOOP); + ASSERT_ERROR(chase("top/dot/dot", temp, CHASE_PREFIX_ROOT|CHASE_PROHIBIT_SYMLINKS, NULL, NULL), ELOOP); + ASSERT_ERROR(chase("top/dot/dot", temp, CHASE_PREFIX_ROOT|CHASE_PROHIBIT_SYMLINKS|CHASE_WARN, NULL, NULL), ELOOP); cleanup: ASSERT_OK(rm_rf(temp, REMOVE_ROOT|REMOVE_PHYSICAL));