From aa09abe198c62e387949a5713eac60652bcbe677 Mon Sep 17 00:00:00 2001 From: Benno Schulenberg Date: Sun, 12 Jun 2016 11:13:45 +0200 Subject: [PATCH] files: when the requested operating directory cannot be set, fail Specifying an operating directory should either lead to a successfull confinement, or nano should fail to start. (Also: save the terminal settings as soon as possible, so that an early die() will not restore uninitialized values.) This fixes the first part of https://savannah.gnu.org/bugs/?47798 properly. --- src/files.c | 12 +++--------- src/nano.c | 18 +++++++++--------- 2 files changed, 12 insertions(+), 18 deletions(-) diff --git a/src/files.c b/src/files.c index 566b9c8c..dbd6e654 100644 --- a/src/files.c +++ b/src/files.c @@ -1563,15 +1563,9 @@ void init_operating_dir(void) full_operating_dir = get_full_path(operating_dir); - /* If get_full_path() failed or the operating directory is - * inaccessible, unset operating_dir. */ - if (full_operating_dir == NULL || chdir(full_operating_dir) == -1) { - statusline(ALERT, _("Not a valid directory: %s"), operating_dir); - free(full_operating_dir); - full_operating_dir = NULL; - free(operating_dir); - operating_dir = NULL; - } + /* If the operating directory is inaccessible, fail. */ + if (full_operating_dir == NULL || chdir(full_operating_dir) == -1) + die("Invalid operating directory\n"); } /* Check to see if we're inside the operating directory. Return FALSE diff --git a/src/nano.c b/src/nano.c index 5c1b78a0..8bbe7415 100644 --- a/src/nano.c +++ b/src/nano.c @@ -2037,6 +2037,9 @@ int main(int argc, char **argv) }; #endif + /* Back up the terminal settings so that they can be restored. */ + tcgetattr(0, &oldterm); + #ifdef ENABLE_UTF8 { /* If the locale set exists and uses UTF-8, we should use @@ -2423,6 +2426,12 @@ int main(int argc, char **argv) init_backup_dir(); #endif +#ifndef DISABLE_OPERATINGDIR + /* Set up the operating directory. This entails chdir()ing there, + * so that file reads and writes will be based there. */ + init_operating_dir(); +#endif + #ifndef DISABLE_JUSTIFY /* If punct wasn't specified, set its default value. */ if (punct == NULL) @@ -2504,9 +2513,6 @@ int main(int argc, char **argv) if (tabsize == -1) tabsize = WIDTH_OF_TAB; - /* Back up the old terminal settings so that they can be restored. */ - tcgetattr(0, &oldterm); - /* Initialize curses mode. If this fails, get out. */ if (initscr() == NULL) exit(1); @@ -2554,12 +2560,6 @@ int main(int argc, char **argv) controlright = key_defined(keyvalue); #endif -#ifndef DISABLE_OPERATINGDIR - /* Set up the operating directory. This entails chdir()ing there, - * so that file reads and writes will be based there. */ - init_operating_dir(); -#endif - #ifdef DEBUG fprintf(stderr, "Main: open file\n"); #endif