* bug#27871: 26.0.50; Bad handling of unmounted directory @ 2017-07-29 21:06 Philipp 2017-09-23 10:19 ` Philipp Stephani 0 siblings, 1 reply; 15+ messages in thread From: Philipp @ 2017-07-29 21:06 UTC (permalink / raw) To: 27871 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. The second shell will now be in an unmounted directory. From that directory, start 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 ... file-truename("(unreachable)" (-1) (nil)) file-truename("(unreachable)/a" (-1) (nil)) file-truename("(unreachable)" (-1) (nil)) file-truename("(unreachable)/a" (-1) (nil)) file-truename("(unreachable)" (-1) (nil)) file-truename("(unreachable)/a" (-1) (nil)) file-truename("(unreachable)" (-1) (nil)) file-truename("(unreachable)/a" (-1) (nil)) file-truename("(unreachable)" (-1) (nil)) file-truename("(unreachable)/a" (-1) (nil)) file-truename("(unreachable)" (-1) (nil)) file-truename("(unreachable)/a" (-1) (nil)) file-truename("(unreachable)" (-1) (nil)) file-truename("(unreachable)/a" (-1) (nil)) file-truename("(unreachable)" (-1) (nil)) file-truename("(unreachable)/a" (-1) (nil)) file-truename("(unreachable)" (-1) (nil)) file-truename("(unreachable)/a" (-1) (nil)) file-truename("(unreachable)" (-1) (nil)) file-truename("(unreachable)/a" (-1) (nil)) file-truename("(unreachable)" (-1) (nil)) file-truename("(unreachable)/a" (-1) (nil)) file-truename("(unreachable)" (-1) (nil)) file-truename("(unreachable)/a" (-1) (nil)) file-truename("(unreachable)" (-1) (nil)) file-truename("(unreachable)/a" (-1) (nil)) file-truename("(unreachable)" (-1) (nil)) file-truename("(unreachable)/a" (-1) (nil)) file-truename("(unreachable)/a/(unreachable)" (-1) (nil)) file-truename("(unreachable)/a/(unreachable)/a" (-1) (nil)) file-truename("(unreachable)/a/(unreachable)/a/(unreachable)" (-1) (nil)) file-truename("(unreachable)/a/(unreachable)/a/(unreachable)/a" (-1) (nil)) file-truename("(unreachable)/a/(unreachable)/a/(unreachable)/a/(unreachable)" (-1) (nil)) file-truename("(unreachable)/a/(unreachable)/a/(unreachable)/a/(unreachable)/a" (-1) (nil)) file-truename("(unreachable)/a/(unreachable)/a/(unreachable)/a/(unreachable)/a/a") find-file-noselect("(unreachable)/a/(unreachable)/a/a") #f(compiled-function (displayable-buffers dir line column name) #<bytecode>)((nil) "(unreachable)/a/" (0) (0) "a") command-line-1(("-f" "toggle-debug-on-error" "a")) command-line() normal-top-level() It seems like the logic for `default-directory' and/or `file-truename' should be improved for unmounted filesystems. In GNU Emacs 26.0.50 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.10.8) of 2017-07-29 built on unknown Repository revision: 2c930d15f541761422a268cd2b5a7f5c11c9a00e Windowing system distributor 'The X.Org Foundation', version 11.0.11803000 System Description: Ubuntu 14.04.5 LTS Recent messages: For information about GNU Emacs and the GNU system, type C-h C-a. Configured using: 'configure --with-modules --without-pop --with-mailutils --enable-checking --enable-check-lisp-object-type --enable-gcc-warnings 'CFLAGS=-ggdb3 -O0'' Configured features: XPM JPEG TIFF GIF PNG SOUND GSETTINGS NOTIFY GNUTLS FREETYPE XFT ZLIB TOOLKIT_SCROLL_BARS GTK3 X11 MODULES Important settings: value of $LANG: en_US.UTF-8 value of $XMODIFIERS: @im=ibus locale-coding-system: utf-8-unix Major mode: Lisp Interaction Minor modes in effect: tooltip-mode: t global-eldoc-mode: t eldoc-mode: t electric-indent-mode: t mouse-wheel-mode: t tool-bar-mode: t menu-bar-mode: t file-name-shadow-mode: t global-font-lock-mode: t font-lock-mode: t blink-cursor-mode: t auto-composition-mode: t auto-encryption-mode: t auto-compression-mode: t line-number-mode: t transient-mark-mode: t Load-path shadows: None found. Features: (shadow sort mail-extr emacsbug message subr-x puny seq byte-opt gv bytecomp byte-compile cconv cl-loaddefs cl-lib dired dired-loaddefs format-spec rfc822 mml easymenu mml-sec password-cache epa derived epg epg-config gnus-util rmail rmail-loaddefs mm-decode mm-bodies mm-encode mail-parse rfc2231 mailabbrev gmm-utils mailheader sendmail rfc2047 rfc2045 ietf-drums mm-util mail-prsvr mail-utils time-date mule-util tooltip eldoc electric uniquify ediff-hook vc-hooks lisp-float-type mwheel term/x-win x-win term/common-win x-dnd tool-bar dnd fontset image regexp-opt fringe tabulated-list replace newcomment text-mode elisp-mode lisp-mode prog-mode register page menu-bar rfn-eshadow isearch timer select scroll-bar mouse jit-lock font-lock syntax facemenu font-core term/tty-colors frame cl-generic cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech european ethiopic indian cyrillic chinese composite charscript charprop case-table epa-hook jka-cmpr-hook help simple abbrev obarray minibuffer cl-preloaded nadvice loaddefs button faces cus-face macroexp files text-properties overlay sha1 md5 base64 format env code-pages mule custom widget hashtable-print-readable backquote inotify dynamic-setting system-font-setting font-render-setting move-toolbar gtk x-toolkit x multi-tty make-network-process emacs) Memory information: ((conses 16 94115 11926) (symbols 48 20077 1) (miscs 40 38 119) (strings 32 28435 1945) (string-bytes 1 754739) (vectors 16 13893) (vector-slots 8 487465 12899) (floats 8 48 97) (intervals 56 205 0) (buffers 992 11) (heap 1024 19129 984)) ^ permalink raw reply [flat|nested] 15+ messages in thread
* bug#27871: 26.0.50; Bad handling of unmounted directory 2017-07-29 21:06 bug#27871: 26.0.50; Bad handling of unmounted directory Philipp @ 2017-09-23 10:19 ` Philipp Stephani 2017-09-23 10:39 ` Eli Zaretskii 0 siblings, 1 reply; 15+ messages in thread From: Philipp Stephani @ 2017-09-23 10:19 UTC (permalink / raw) To: 27871 [-- Attachment #1.1: Type: text/plain, Size: 3131 bytes --] Philipp <p.stephani2@gmail.com> schrieb am Sa., 29. Juli 2017 um 23:08 Uhr: > > 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. The second > shell will now be in an unmounted directory. From that directory, start > 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 > ... > file-truename("(unreachable)" (-1) (nil)) > file-truename("(unreachable)/a" (-1) (nil)) > file-truename("(unreachable)" (-1) (nil)) > file-truename("(unreachable)/a" (-1) (nil)) > file-truename("(unreachable)" (-1) (nil)) > file-truename("(unreachable)/a" (-1) (nil)) > file-truename("(unreachable)" (-1) (nil)) > file-truename("(unreachable)/a" (-1) (nil)) > file-truename("(unreachable)" (-1) (nil)) > file-truename("(unreachable)/a" (-1) (nil)) > file-truename("(unreachable)" (-1) (nil)) > file-truename("(unreachable)/a" (-1) (nil)) > file-truename("(unreachable)" (-1) (nil)) > file-truename("(unreachable)/a" (-1) (nil)) > file-truename("(unreachable)" (-1) (nil)) > file-truename("(unreachable)/a" (-1) (nil)) > file-truename("(unreachable)" (-1) (nil)) > file-truename("(unreachable)/a" (-1) (nil)) > file-truename("(unreachable)" (-1) (nil)) > file-truename("(unreachable)/a" (-1) (nil)) > file-truename("(unreachable)" (-1) (nil)) > file-truename("(unreachable)/a" (-1) (nil)) > file-truename("(unreachable)" (-1) (nil)) > file-truename("(unreachable)/a" (-1) (nil)) > file-truename("(unreachable)" (-1) (nil)) > file-truename("(unreachable)/a" (-1) (nil)) > file-truename("(unreachable)" (-1) (nil)) > file-truename("(unreachable)/a" (-1) (nil)) > file-truename("(unreachable)/a/(unreachable)" (-1) (nil)) > file-truename("(unreachable)/a/(unreachable)/a" (-1) (nil)) > file-truename("(unreachable)/a/(unreachable)/a/(unreachable)" (-1) (nil)) > file-truename("(unreachable)/a/(unreachable)/a/(unreachable)/a" (-1) > (nil)) > > file-truename("(unreachable)/a/(unreachable)/a/(unreachable)/a/(unreachable)" > (-1) (nil)) > > file-truename("(unreachable)/a/(unreachable)/a/(unreachable)/a/(unreachable)/a" > (-1) (nil)) > > file-truename("(unreachable)/a/(unreachable)/a/(unreachable)/a/(unreachable)/a/a") > find-file-noselect("(unreachable)/a/(unreachable)/a/a") > #f(compiled-function (displayable-buffers dir line column name) > #<bytecode>)((nil) "(unreachable)/a/" (0) (0) "a") > command-line-1(("-f" "toggle-debug-on-error" "a")) > command-line() > normal-top-level() > > It seems like the logic for `default-directory' and/or `file-truename' > should be improved for unmounted filesystems. > > Here's a patch. With the patch, the output is Error getting directory: Transport endpoint is not connected Warning (initialization): Error setting default-directory Ignoring relative file name (a) due to nil default-directory [-- Attachment #1.2: Type: text/html, Size: 4143 bytes --] [-- Attachment #2: 0001-Treat-unreachable-current-directory-as-error.txt --] [-- Type: text/plain, Size: 2118 bytes --] From b3541b3bc936bbb8e9950d1aed14d2571e03c1fe Mon Sep 17 00:00:00 2001 From: Philipp Stephani <phst@google.com> Date: Sat, 23 Sep 2017 12:13:39 +0200 Subject: [PATCH] Treat unreachable current directory as error Linux prefixes an unreachable (e.g. unmounted) current directory with the special string "(unreachable)", cf. Bug#27871. Treat such directories as error because they wouldn't work anyway. * src/sysdep.c (emacs_get_current_dir_name_1): Renamed from emacs_get_current_dir_name. (emacs_get_current_dir_name): Check for prefix "(unreachable)". --- src/sysdep.c | 29 +++++++++++++++++++++++++---- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/src/sysdep.c b/src/sysdep.c index 1e6e0d011b..6c76f16242 100644 --- a/src/sysdep.c +++ b/src/sysdep.c @@ -220,10 +220,8 @@ init_standard_fds (void) force_open (STDERR_FILENO, O_RDONLY); } -/* Return the current working directory. The result should be freed - with 'free'. Return NULL on errors. */ -char * -emacs_get_current_dir_name (void) +static char * +emacs_get_current_dir_name_1 (void) { # if HAVE_GET_CURRENT_DIR_NAME && !BROKEN_GET_CURRENT_DIR_NAME # ifdef HYBRID_MALLOC @@ -283,6 +281,29 @@ emacs_get_current_dir_name (void) return buf; } +/* Return the current working directory. The result should be freed + with 'free'. Return NULL on errors. */ +char * +emacs_get_current_dir_name (void) +{ + char *dir = emacs_get_current_dir_name_1 (); + if (dir == NULL) + return NULL; + /* On Linux, getcwd and get_current_dir_name return a string + starting with "(unreachable)" if the current directory doesn't + exist, e.g. because it was unmounted. Treat that as an error. + See https://debbugs.gnu.org/cgi/bugreport.cgi?bug=27871. */ + const char *prefix = "(unreachable)"; + size_t dir_len = strlen (dir); + size_t prefix_len = strlen (prefix); + if (dir_len >= prefix_len && strncmp (dir, prefix, prefix_len) == 0) + { + errno = ENOTCONN; + return NULL; + } + return dir; +} + \f /* Discard pending input on all input descriptors. */ -- 2.14.1.821.g8fa685d3b7-goog ^ permalink raw reply related [flat|nested] 15+ messages in thread
* bug#27871: 26.0.50; Bad handling of unmounted directory 2017-09-23 10:19 ` Philipp Stephani @ 2017-09-23 10:39 ` Eli Zaretskii 2017-09-23 11:30 ` Andreas Schwab 0 siblings, 1 reply; 15+ messages in thread From: Eli Zaretskii @ 2017-09-23 10:39 UTC (permalink / raw) To: Philipp Stephani; +Cc: 27871 > From: Philipp Stephani <p.stephani2@gmail.com> > Date: Sat, 23 Sep 2017 10:19:19 +0000 > > Here's a patch. With the patch, the output is > > Error getting directory: Transport endpoint is not connected > Warning (initialization): Error setting default-directory > Ignoring relative file name (a) due to nil default-directory Thanks. > +/* Return the current working directory. The result should be freed > + with 'free'. Return NULL on errors. */ > +char * > +emacs_get_current_dir_name (void) > +{ > + char *dir = emacs_get_current_dir_name_1 (); > + if (dir == NULL) > + return NULL; > + /* On Linux, getcwd and get_current_dir_name return a string > + starting with "(unreachable)" if the current directory doesn't > + exist, e.g. because it was unmounted. Treat that as an error. > + See https://debbugs.gnu.org/cgi/bugreport.cgi?bug=27871. */ > + const char *prefix = "(unreachable)"; > + size_t dir_len = strlen (dir); > + size_t prefix_len = strlen (prefix); > + if (dir_len >= prefix_len && strncmp (dir, prefix, prefix_len) == 0) > + { > + errno = ENOTCONN; > + return NULL; What if there's a directory called literally "(unreachable)SOMETHING"? This isn't disallowed on GNU/Linux, is it? We should probably stat the result if we see this prefix, before we declare it a failure, IMO. ^ permalink raw reply [flat|nested] 15+ messages in thread
* bug#27871: 26.0.50; Bad handling of unmounted directory 2017-09-23 10:39 ` Eli Zaretskii @ 2017-09-23 11:30 ` Andreas Schwab 2017-09-23 11:33 ` Philipp Stephani 0 siblings, 1 reply; 15+ messages in thread From: Andreas Schwab @ 2017-09-23 11:30 UTC (permalink / raw) To: Eli Zaretskii; +Cc: Philipp Stephani, 27871 On Sep 23 2017, Eli Zaretskii <eliz@gnu.org> wrote: >> +/* Return the current working directory. The result should be freed >> + with 'free'. Return NULL on errors. */ >> +char * >> +emacs_get_current_dir_name (void) >> +{ >> + char *dir = emacs_get_current_dir_name_1 (); >> + if (dir == NULL) >> + return NULL; >> + /* On Linux, getcwd and get_current_dir_name return a string >> + starting with "(unreachable)" if the current directory doesn't >> + exist, e.g. because it was unmounted. Treat that as an error. >> + See https://debbugs.gnu.org/cgi/bugreport.cgi?bug=27871. */ >> + const char *prefix = "(unreachable)"; >> + size_t dir_len = strlen (dir); >> + size_t prefix_len = strlen (prefix); >> + if (dir_len >= prefix_len && strncmp (dir, prefix, prefix_len) == 0) >> + { >> + errno = ENOTCONN; >> + return NULL; > > What if there's a directory called literally "(unreachable)SOMETHING"? An absolute file name cannot start with "(unreachable)". Andreas. -- Andreas Schwab, schwab@linux-m68k.org GPG Key fingerprint = 58CA 54C7 6D53 942B 1756 01D3 44D5 214B 8276 4ED5 "And now for something completely different." ^ permalink raw reply [flat|nested] 15+ messages in thread
* bug#27871: 26.0.50; Bad handling of unmounted directory 2017-09-23 11:30 ` Andreas Schwab @ 2017-09-23 11:33 ` Philipp Stephani 2017-09-23 11:38 ` Eli Zaretskii 0 siblings, 1 reply; 15+ messages in thread From: Philipp Stephani @ 2017-09-23 11:33 UTC (permalink / raw) To: Andreas Schwab, Eli Zaretskii; +Cc: 27871 [-- Attachment #1: Type: text/plain, Size: 1348 bytes --] Andreas Schwab <schwab@linux-m68k.org> schrieb am Sa., 23. Sep. 2017 um 13:30 Uhr: > On Sep 23 2017, Eli Zaretskii <eliz@gnu.org> wrote: > > >> +/* Return the current working directory. The result should be freed > >> + with 'free'. Return NULL on errors. */ > >> +char * > >> +emacs_get_current_dir_name (void) > >> +{ > >> + char *dir = emacs_get_current_dir_name_1 (); > >> + if (dir == NULL) > >> + return NULL; > >> + /* On Linux, getcwd and get_current_dir_name return a string > >> + starting with "(unreachable)" if the current directory doesn't > >> + exist, e.g. because it was unmounted. Treat that as an error. > >> + See https://debbugs.gnu.org/cgi/bugreport.cgi?bug=27871. */ > >> + const char *prefix = "(unreachable)"; > >> + size_t dir_len = strlen (dir); > >> + size_t prefix_len = strlen (prefix); > >> + if (dir_len >= prefix_len && strncmp (dir, prefix, prefix_len) == 0) > >> + { > >> + errno = ENOTCONN; > >> + return NULL; > > > > What if there's a directory called literally "(unreachable)SOMETHING"? > > An absolute file name cannot start with "(unreachable)". > > Yes, and getcwd and friends only return absolute filenames, and we only use $PWD if it's absolute, so anything except '/' or a drive letter can't be a prefix in the success case. I'll add a comment to that effect. [-- Attachment #2: Type: text/html, Size: 2097 bytes --] ^ permalink raw reply [flat|nested] 15+ messages in thread
* bug#27871: 26.0.50; Bad handling of unmounted directory 2017-09-23 11:33 ` Philipp Stephani @ 2017-09-23 11:38 ` Eli Zaretskii 2017-09-23 11:41 ` Eli Zaretskii 0 siblings, 1 reply; 15+ messages in thread From: Eli Zaretskii @ 2017-09-23 11:38 UTC (permalink / raw) To: Philipp Stephani; +Cc: schwab, 27871 > From: Philipp Stephani <p.stephani2@gmail.com> > Date: Sat, 23 Sep 2017 11:33:13 +0000 > Cc: 27871@debbugs.gnu.org > > > What if there's a directory called literally "(unreachable)SOMETHING"? > > An absolute file name cannot start with "(unreachable)". > > Yes, and getcwd and friends only return absolute filenames, and we only use $PWD if it's absolute, so > anything except '/' or a drive letter can't be a prefix in the success case. I'll add a comment to that effect. Then why not just check that the first character is something other than '/'? ^ permalink raw reply [flat|nested] 15+ messages in thread
* bug#27871: 26.0.50; Bad handling of unmounted directory 2017-09-23 11:38 ` Eli Zaretskii @ 2017-09-23 11:41 ` Eli Zaretskii 2017-09-30 18:49 ` Philipp Stephani 0 siblings, 1 reply; 15+ messages in thread From: Eli Zaretskii @ 2017-09-23 11:41 UTC (permalink / raw) To: p.stephani2, schwab; +Cc: 27871 > 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)? ^ permalink raw reply [flat|nested] 15+ messages in thread
* bug#27871: 26.0.50; Bad handling of unmounted directory 2017-09-23 11:41 ` Eli Zaretskii @ 2017-09-30 18:49 ` Philipp Stephani 2017-09-30 18:50 ` bug#27871: [PATCH] Treat unreachable current directory as error Philipp Stephani [not found] ` <20170930185006.54096-1-phst@google.com> 0 siblings, 2 replies; 15+ messages in thread From: Philipp Stephani @ 2017-09-30 18:49 UTC (permalink / raw) To: Eli Zaretskii, schwab; +Cc: 27871 [-- Attachment #1: Type: text/plain, Size: 400 bytes --] Eli Zaretskii <eliz@gnu.org> schrieb am Sa., 23. Sep. 2017 um 13:41 Uhr: > > 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)? > Sounds reasonable, I'll send a new patch. [-- Attachment #2: Type: text/html, Size: 889 bytes --] ^ permalink raw reply [flat|nested] 15+ messages in thread
* bug#27871: [PATCH] Treat unreachable current directory as error 2017-09-30 18:49 ` Philipp Stephani @ 2017-09-30 18:50 ` Philipp Stephani [not found] ` <20170930185006.54096-1-phst@google.com> 1 sibling, 0 replies; 15+ messages in thread From: Philipp Stephani @ 2017-09-30 18:50 UTC (permalink / raw) To: emacs-devel, 27871; +Cc: Philipp Stephani Linux prefixes an unreachable (e.g. unmounted) current directory with the special string "(unreachable)", cf. Bug#27871. Treat such directories as error because they wouldn't work anyway. * src/sysdep.c (emacs_get_current_dir_name_1): Renamed from emacs_get_current_dir_name. (emacs_get_current_dir_name): Check for prefix "(unreachable)". --- src/sysdep.c | 27 +++++++++++++++++++++++---- 1 file changed, 23 insertions(+), 4 deletions(-) diff --git a/src/sysdep.c b/src/sysdep.c index 1e6e0d011b..efc0396c93 100644 --- a/src/sysdep.c +++ b/src/sysdep.c @@ -220,10 +220,8 @@ init_standard_fds (void) force_open (STDERR_FILENO, O_RDONLY); } -/* Return the current working directory. The result should be freed - with 'free'. Return NULL on errors. */ -char * -emacs_get_current_dir_name (void) +static char * +emacs_get_current_dir_name_1 (void) { # if HAVE_GET_CURRENT_DIR_NAME && !BROKEN_GET_CURRENT_DIR_NAME # ifdef HYBRID_MALLOC @@ -283,6 +281,27 @@ emacs_get_current_dir_name (void) return buf; } +/* Return the current working directory. The result should be freed + with 'free'. Return NULL on errors. */ +char * +emacs_get_current_dir_name (void) +{ + char *dir = emacs_get_current_dir_name_1 (); + if (dir == NULL) + return NULL; + /* On Linux, getcwd and get_current_dir_name return a string + starting with "(unreachable)" if the current directory doesn't + exist, e.g. because it was unmounted. Treat that as an error. + See https://debbugs.gnu.org/cgi/bugreport.cgi?bug=27871. */ + if (!file_name_absolute_p (dir)) + { + free (dir); + errno = ENOTCONN; + return NULL; + } + return dir; +} + \f /* Discard pending input on all input descriptors. */ -- 2.14.1 ^ permalink raw reply related [flat|nested] 15+ messages in thread
[parent not found: <20170930185006.54096-1-phst@google.com>]
* bug#27871: [PATCH] Treat unreachable current directory as error [not found] ` <20170930185006.54096-1-phst@google.com> @ 2017-10-01 0:00 ` Paul Eggert 2017-10-05 10:13 ` Eli Zaretskii 2017-10-07 8:49 ` Philipp Stephani 0 siblings, 2 replies; 15+ messages in thread From: Paul Eggert @ 2017-10-01 0:00 UTC (permalink / raw) To: Philipp Stephani, 27871; +Cc: Philipp Stephani [-- Attachment #1: Type: text/plain, Size: 469 bytes --] Philipp Stephani wrote: > + if (!file_name_absolute_p (dir)) That doesn't look right here, since leading '~' counts as absolute to file_name_absolute_p, which is not what is wanted here. > + errno = ENOTCONN; Why ENOTCONN? Shouldn't it be ENOENT? The failure has nothing to do with socket connections. Also, I'd feel a bit better if we apply the workaround only to the function that has the problem. How about the attached patch instead? [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: 0001-Fix-bug-with-unmounted-directory-on-GNU-Linux.patch --] [-- Type: text/x-patch; name="0001-Fix-bug-with-unmounted-directory-on-GNU-Linux.patch", Size: 1077 bytes --] From a1f839b0c60fb345944ee39626e8645402c1f060 Mon Sep 17 00:00:00 2001 From: Paul Eggert <eggert@cs.ucla.edu> Date: Sat, 30 Sep 2017 16:53:54 -0700 Subject: [PATCH] Fix bug with unmounted directory on GNU/Linux * src/sysdep.c (emacs_get_current_dir_name): Do not use get_current_dir_name result unless it is absolute (Bug#27871). --- src/sysdep.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/sysdep.c b/src/sysdep.c index 1e6e0d011b..a3526c3740 100644 --- a/src/sysdep.c +++ b/src/sysdep.c @@ -232,7 +232,18 @@ emacs_get_current_dir_name (void) bool use_libc = true; # endif if (use_libc) - return get_current_dir_name (); + { + /* GNU/Linux get_current_dir_name can return a string starting + with "(unreachable)" (Bug#27871). */ + char *wd = get_current_dir_name (); + if (wd && ! (IS_DIRECTORY_SEP (*wd) || (*wd && IS_DEVICE_SEP (wd[1])))) + { + free (wd); + errno = ENOENT; + return NULL; + } + return wd; + } # endif char *buf; -- 2.13.5 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* bug#27871: [PATCH] Treat unreachable current directory as error 2017-10-01 0:00 ` Paul Eggert @ 2017-10-05 10:13 ` Eli Zaretskii 2017-10-05 23:06 ` Paul Eggert 2017-10-07 8:49 ` Philipp Stephani 1 sibling, 1 reply; 15+ messages in thread From: Eli Zaretskii @ 2017-10-05 10:13 UTC (permalink / raw) To: Paul Eggert; +Cc: phst, p.stephani2, 27871 > From: Paul Eggert <eggert@cs.ucla.edu> > Date: Sat, 30 Sep 2017 17:00:06 -0700 > Cc: Philipp Stephani <phst@google.com> > > How about the attached patch instead? Thanks, this LGTM. I think we want this on the release branch. ^ permalink raw reply [flat|nested] 15+ messages in thread
* bug#27871: [PATCH] Treat unreachable current directory as error 2017-10-05 10:13 ` Eli Zaretskii @ 2017-10-05 23:06 ` Paul Eggert 0 siblings, 0 replies; 15+ messages in thread From: Paul Eggert @ 2017-10-05 23:06 UTC (permalink / raw) To: Eli Zaretskii; +Cc: phst, p.stephani2, 27871-done On 10/05/2017 03:13 AM, Eli Zaretskii wrote: > Thanks, this LGTM. I think we want this on the release branch. OK, thanks, installed, and closing this bug report. ^ permalink raw reply [flat|nested] 15+ messages in thread
* bug#27871: [PATCH] Treat unreachable current directory as error 2017-10-01 0:00 ` Paul Eggert 2017-10-05 10:13 ` Eli Zaretskii @ 2017-10-07 8:49 ` Philipp Stephani 2017-10-08 6:04 ` Paul Eggert 1 sibling, 1 reply; 15+ messages in thread From: Philipp Stephani @ 2017-10-07 8:49 UTC (permalink / raw) To: Paul Eggert, 27871; +Cc: Philipp Stephani [-- Attachment #1: Type: text/plain, Size: 925 bytes --] Paul Eggert <eggert@cs.ucla.edu> schrieb am So., 1. Okt. 2017 um 02:00 Uhr: > Philipp Stephani wrote: > > > + if (!file_name_absolute_p (dir)) > > That doesn't look right here, since leading '~' counts as absolute to > file_name_absolute_p, which is not what is wanted here. > That shouldn't matter because getcwd never returns a string starting with ~. > > > + errno = ENOTCONN; > > Why ENOTCONN? Shouldn't it be ENOENT? The failure has nothing to do with > socket > connections. > I think ENOTCONN is the error returned by stat(".") if the current directory doesn't exist. But I don't care much about the exact error number, any nonzero value should do the job. > > Also, I'd feel a bit better if we apply the workaround only to the > function that > has the problem. > > All of the current directory functions exhibit this behavior, including getwd and getcwd, so you need to make sure they are also covered. [-- Attachment #2: Type: text/html, Size: 1588 bytes --] ^ permalink raw reply [flat|nested] 15+ messages in thread
* bug#27871: [PATCH] Treat unreachable current directory as error 2017-10-07 8:49 ` Philipp Stephani @ 2017-10-08 6:04 ` Paul Eggert 2017-10-08 14:56 ` Philipp Stephani 0 siblings, 1 reply; 15+ messages in thread From: Paul Eggert @ 2017-10-08 6:04 UTC (permalink / raw) To: Philipp Stephani, 27871; +Cc: Philipp Stephani [-- Attachment #1: Type: text/plain, Size: 530 bytes --] Philipp Stephani wrote: > All of the current directory functions exhibit this behavior, including > getwd and getcwd, so you need to make sure they are also covered. Thanks for letting us know. I installed the 2nd attached patch, which addresses this by making the patch behave more like what you originally proposed, while still avoiding the need to use file_name_absolute_p (which is about Emacs file names, not OS names). Also, I noticed a related memory leak and fixed that by installing the 1st attached patch. [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #2: 0001-src-xsmfns.c-x_session_initialize-Fix-memory-leak.patch --] [-- Type: text/x-patch; name="0001-src-xsmfns.c-x_session_initialize-Fix-memory-leak.patch", Size: 933 bytes --] From 2202952b8307f3a6407820280e94e4d979b7a122 Mon Sep 17 00:00:00 2001 From: Paul Eggert <eggert@cs.ucla.edu> Date: Sat, 7 Oct 2017 22:48:49 -0700 Subject: [PATCH 1/2] * src/xsmfns.c (x_session_initialize): Fix memory leak. --- src/xsmfns.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/xsmfns.c b/src/xsmfns.c index 2cb4f3e..fb0d01b 100644 --- a/src/xsmfns.c +++ b/src/xsmfns.c @@ -401,12 +401,14 @@ x_session_initialize (struct x_display_info *dpyinfo) ptrdiff_t name_len = 0; /* libSM seems to crash if pwd is missing - see bug#18851. */ - if (! emacs_get_current_dir_name ()) + char *pwd = emacs_get_current_dir_name (); + if (!pwd) { fprintf (stderr, "Disabling session management due to pwd error: %s\n", emacs_strerror (errno)); return; } + xfree (pwd); ice_fd = -1; doing_interact = false; -- 2.7.4 [-- Warning: decoded text below may be mangled, UTF-8 assumed --] [-- Attachment #3: 0002-Improve-test-for-unreachable-dirs.patch --] [-- Type: text/x-patch; name="0002-Improve-test-for-unreachable-dirs.patch", Size: 2460 bytes --] From 7c2c117c91eeef5e7bd70c98cc7e201007016b1e Mon Sep 17 00:00:00 2001 From: Paul Eggert <eggert@cs.ucla.edu> Date: Sat, 7 Oct 2017 22:56:29 -0700 Subject: [PATCH 2/2] Improve test for unreachable dirs * src/sysdep.c (get_current_dir_name_or_unreachable): New function, with most of the old contents of emacs_get_current_dir_name. (emacs_get_current_dir_name): Use it. Use a simpler test for unreachable directory strings, and also apply it to getcwd etc. (Bug#27871) --- src/sysdep.c | 39 ++++++++++++++++++++++++++------------- 1 file changed, 26 insertions(+), 13 deletions(-) diff --git a/src/sysdep.c b/src/sysdep.c index 8291a60..c348492 100644 --- a/src/sysdep.c +++ b/src/sysdep.c @@ -221,9 +221,12 @@ init_standard_fds (void) } /* Return the current working directory. The result should be freed - with 'free'. Return NULL on errors. */ -char * -emacs_get_current_dir_name (void) + with 'free'. Return NULL (setting errno) on errors. If the + current directory is unreachable, return either NULL or a string + beginning with '('. */ + +static char * +get_current_dir_name_or_unreachable (void) { # if HAVE_GET_CURRENT_DIR_NAME && !BROKEN_GET_CURRENT_DIR_NAME # ifdef HYBRID_MALLOC @@ -233,16 +236,9 @@ emacs_get_current_dir_name (void) # endif if (use_libc) { - /* GNU/Linux get_current_dir_name can return a string starting - with "(unreachable)" (Bug#27871). */ - char *wd = get_current_dir_name (); - if (wd && ! (IS_DIRECTORY_SEP (*wd) || (*wd && IS_DEVICE_SEP (wd[1])))) - { - free (wd); - errno = ENOENT; - return NULL; - } - return wd; + /* For an unreachable directory, this returns a string that starts + with "(unreachable)"; see Bug#27871. */ + return get_current_dir_name (); } # endif @@ -294,6 +290,23 @@ emacs_get_current_dir_name (void) return buf; } +/* Return the current working directory. The result should be freed + with 'free'. Return NULL (setting errno) on errors; an unreachable + directory (e.g., its name starts with '(') counts as an error. */ + +char * +emacs_get_current_dir_name (void) +{ + char *dir = get_current_dir_name_or_unreachable (); + if (dir && *dir == '(') + { + free (dir); + errno = ENOENT; + return NULL; + } + return dir; +} + \f /* Discard pending input on all input descriptors. */ -- 2.7.4 ^ permalink raw reply related [flat|nested] 15+ messages in thread
* bug#27871: [PATCH] Treat unreachable current directory as error 2017-10-08 6:04 ` Paul Eggert @ 2017-10-08 14:56 ` Philipp Stephani 0 siblings, 0 replies; 15+ messages in thread From: Philipp Stephani @ 2017-10-08 14:56 UTC (permalink / raw) To: Paul Eggert, 27871; +Cc: Philipp Stephani [-- Attachment #1: Type: text/plain, Size: 659 bytes --] Paul Eggert <eggert@cs.ucla.edu> schrieb am So., 8. Okt. 2017 um 08:06 Uhr: > Philipp Stephani wrote: > > All of the current directory functions exhibit this behavior, including > > getwd and getcwd, so you need to make sure they are also covered. > > Thanks for letting us know. I installed the 2nd attached patch, which > addresses > this by making the patch behave more like what you originally proposed, > while > still avoiding the need to use file_name_absolute_p (which is about Emacs > file > names, not OS names). > That should work, thanks. FTR, this behavior is documented in the Linux manpage: http://man7.org/linux/man-pages/man2/getcwd.2.html [-- Attachment #2: Type: text/html, Size: 1020 bytes --] ^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2017-10-08 14:56 UTC | newest] Thread overview: 15+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2017-07-29 21:06 bug#27871: 26.0.50; Bad handling of unmounted directory Philipp 2017-09-23 10:19 ` Philipp Stephani 2017-09-23 10:39 ` Eli Zaretskii 2017-09-23 11:30 ` Andreas Schwab 2017-09-23 11:33 ` Philipp Stephani 2017-09-23 11:38 ` Eli Zaretskii 2017-09-23 11:41 ` Eli Zaretskii 2017-09-30 18:49 ` Philipp Stephani 2017-09-30 18:50 ` bug#27871: [PATCH] Treat unreachable current directory as error Philipp Stephani [not found] ` <20170930185006.54096-1-phst@google.com> 2017-10-01 0:00 ` Paul Eggert 2017-10-05 10:13 ` Eli Zaretskii 2017-10-05 23:06 ` Paul Eggert 2017-10-07 8:49 ` Philipp Stephani 2017-10-08 6:04 ` Paul Eggert 2017-10-08 14:56 ` Philipp Stephani
Code repositories for project(s) associated with this public inbox https://git.savannah.gnu.org/cgit/emacs.git This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).