From b3541b3bc936bbb8e9950d1aed14d2571e03c1fe Mon Sep 17 00:00:00 2001 From: Philipp Stephani 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; +} + /* Discard pending input on all input descriptors. */ -- 2.14.1.821.g8fa685d3b7-goog