From unknown Wed Jun 25 10:55:48 2025 X-Loop: help-debbugs@gnu.org Subject: bug#27871: 26.0.50; Bad handling of unmounted directory Resent-From: Philipp
Create a FUSE mount point, e.g.
cd /tmp
mkdir a a/a b
touch a/a/a
bindfs -f a b
While bindfs(1) is running, cd to the mounted directory in a second
shell:
cd /tmp/b/a
Now kill bindfs, e.g. by hitting ^C in the first shell.=C2=A0 The second
shell will now be in an unmounted directory.=C2=A0 From that directory, sta= rt
Emacs:
$ emacs -Q -batch a
Apparent cycle of symbolic links for (unreachable)
or, with stack trace
$ emacs -Q -batch -f toggle-debug-on-error a
Debug on Error enabled globally
...
=C2=A0 file-truename("(unreachable)" (-1) (nil))
=C2=A0 file-truename("(unreachable)/a" (-1) (nil))
=C2=A0 file-truename("(unreachable)" (-1) (nil))
=C2=A0 file-truename("(unreachable)/a" (-1) (nil))
=C2=A0 file-truename("(unreachable)" (-1) (nil))
=C2=A0 file-truename("(unreachable)/a" (-1) (nil))
=C2=A0 file-truename("(unreachable)" (-1) (nil))
=C2=A0 file-truename("(unreachable)/a" (-1) (nil))
=C2=A0 file-truename("(unreachable)" (-1) (nil))
=C2=A0 file-truename("(unreachable)/a" (-1) (nil))
=C2=A0 file-truename("(unreachable)" (-1) (nil))
=C2=A0 file-truename("(unreachable)/a" (-1) (nil))
=C2=A0 file-truename("(unreachable)" (-1) (nil))
=C2=A0 file-truename("(unreachable)/a" (-1) (nil))
=C2=A0 file-truename("(unreachable)" (-1) (nil))
=C2=A0 file-truename("(unreachable)/a" (-1) (nil))
=C2=A0 file-truename("(unreachable)" (-1) (nil))
=C2=A0 file-truename("(unreachable)/a" (-1) (nil))
=C2=A0 file-truename("(unreachable)" (-1) (nil))
=C2=A0 file-truename("(unreachable)/a" (-1) (nil))
=C2=A0 file-truename("(unreachable)" (-1) (nil))
=C2=A0 file-truename("(unreachable)/a" (-1) (nil))
=C2=A0 file-truename("(unreachable)" (-1) (nil))
=C2=A0 file-truename("(unreachable)/a" (-1) (nil))
=C2=A0 file-truename("(unreachable)" (-1) (nil))
=C2=A0 file-truename("(unreachable)/a" (-1) (nil))
=C2=A0 file-truename("(unreachable)" (-1) (nil))
=C2=A0 file-truename("(unreachable)/a" (-1) (nil))
=C2=A0 file-truename("(unreachable)/a/(unreachable)" (-1) (nil))<= br> =C2=A0 file-truename("(unreachable)/a/(unreachable)/a" (-1) (nil)= )
=C2=A0 file-truename("(unreachable)/a/(unreachable)/a/(unreachable)&qu= ot; (-1) (nil))
=C2=A0 file-truename("(unreachable)/a/(unreachable)/a/(unreachable)/a&= quot; (-1) (nil))
=C2=A0 file-truename("(unreachable)/a/(unreachable)/a/(unreachable)/a/= (unreachable)" (-1) (nil))
=C2=A0 file-truename("(unreachable)/a/(unreachable)/a/(unreachable)/a/= (unreachable)/a" (-1) (nil))
=C2=A0 file-truename("(unreachable)/a/(unreachable)/a/(unreachable)/a/= (unreachable)/a/a")
=C2=A0 find-file-noselect("(unreachable)/a/(unreachable)/a/a")
=C2=A0 #f(compiled-function (displayable-buffers dir line column name) #<= ;bytecode>)((nil) "(unreachable)/a/" (0) (0) "a")
=C2=A0 command-line-1(("-f" "toggle-debug-on-error" &qu= ot;a"))
=C2=A0 command-line()
=C2=A0 normal-top-level()
It seems like the logic for `default-directory' and/or `file-truename= 39;
should be improved for unmounted filesystems.
> From: Eli Zaretskii <eliz@gnu.org>
> Cc: schwab@= linux-m68k.org, 27871@debbugs.gnu.org
>
> Then why not just check that the first character is something other
> than '/'?
Or, more general, that the result fails file_name_absolute_p (which
would be more portable)?