]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
chase: Use ELOOP for CHASE_PROHIBIT_SYMLINKS error
authorDaan De Meyer <daan@amutable.com>
Mon, 11 May 2026 17:34:01 +0000 (19:34 +0200)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Tue, 12 May 2026 12:43:39 +0000 (14:43 +0200)
Matches the behavior of openat2() with RESOLVE_NO_SYMLINKS
which makes introducing support for openat2() easier.

src/basic/chase.c
src/core/mount.c
src/test/test-chase.c

index 50ab4e3c47495ccd0e38b3401cc0d3c61c90ecaa..b8fcbcb4e5fa8a02e7938579fc43e82a255ae23f 100644 (file)
@@ -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));
 }
index 967274b950b6756070f9a75f9d3964d44af37dd8..c57f6e8a667cfcd65e509a290fa3adf1363939c5 100644 (file)
@@ -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;
         }
index ed07ac5cef68df2df7302956a0733bf0e1950546..23ceef53285e752ad190b081d731480d5526617e 100644 (file)
@@ -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));