commit aa09abe198c62e387949a5713eac60652bcbe677
parent 5aa1df37d1b8ba4cba8f7b1838c8409fdff59e37
Author: Benno Schulenberg <bensberg@justemail.net>
Date: Sun, 12 Jun 2016 11:13:45 +0200
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.
Diffstat:
2 files changed, 12 insertions(+), 18 deletions(-)
diff --git 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
@@ -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