[Bug 276632] LLVM std::filesystem::remove_all fails to handle dangling symlinks

From: <bugzilla-noreply_at_freebsd.org>
Date: Fri, 26 Jan 2024 02:22:11 UTC
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=276632

            Bug ID: 276632
           Summary: LLVM std::filesystem::remove_all fails to handle
                    dangling symlinks
           Product: Base System
           Version: CURRENT
          Hardware: Any
                OS: Any
            Status: New
          Severity: Affects Only Me
          Priority: ---
         Component: bin
          Assignee: bugs@FreeBSD.org
          Reporter: markj@FreeBSD.org

remove_all_impl() will attempt to remove a file specified by its path,
recursing if it encounters a directory.

It opens the file with O_CLOEXEC | O_RDONLY | O_DIRECTORY | O_NOFOLLOW, which
for a dangling symlink returns EMLINK on FreeBSD, contradicting POSIX (which
says it should return ELOOP in this scenario).  Bug 214633 notes this problem,
but fixing it would break compatibility.

remove_all_impl() however only handles ENOTDIR and ELOOP, so it incorrectly
returns an error in this situation on FreeBSD.  We should extend it to check
for EMLINK as well.

-- 
You are receiving this mail because:
You are the assignee for the bug.