From f80a59c7cc9f6b97d6005e23afe19387efe0564a Mon Sep 17 00:00:00 2001 From: Chris Allegretta Date: Thu, 30 Jan 2003 00:57:33 +0000 Subject: [PATCH] - files.c:do_browser() - Fix goto directory operating dir check and tilde expansion (David Benbennick) git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1409 35c25a1d-7b9e-4130-9fde-d3aeb78583b8 --- ChangeLog | 2 ++ files.c | 37 +++++++++++++++++++------------------ nano.h | 1 + 3 files changed, 22 insertions(+), 18 deletions(-) diff --git a/ChangeLog b/ChangeLog index dddd7f88..99205561 100644 --- a/ChangeLog +++ b/ChangeLog @@ -35,6 +35,8 @@ CVS Code - do_browser() - Fix incorrect path check for check_operating_dir() (David Benbennick). + - Fix goto directory operating dir check and tilde expansion + (David Benbennick). open_file() - Fix FD leak with file load error (David Benbennick). save_history() diff --git a/files.c b/files.c index 7c46929e..79f5ac67 100644 --- a/files.c +++ b/files.c @@ -2515,6 +2515,8 @@ char *do_browser(const char *inpath) /* Loop invariant: Microsoft sucks. */ do { DIR *test_dir; + char *new_path; + /* Used by the Go To Directory prompt. */ blank_statusbar_refresh(); @@ -2694,37 +2696,36 @@ char *do_browser(const char *inpath) bottombars(browser_list); curs_set(0); -#ifndef DISABLE_OPERATINGDIR - if (operating_dir != NULL) { - if (check_operating_dir(answer, 0)) { - statusbar(_("Can't go outside of %s in restricted mode"), operating_dir); - break; - } - } -#endif - if (j < 0) { statusbar(_("Goto Cancelled")); break; } - if (answer[0] != '/') { - char *saveanswer = mallocstrcpy(NULL, answer); + new_path = real_dir_from_tilde(answer); - answer = nrealloc(answer, strlen(path) + strlen(saveanswer) + 2); - sprintf(answer, "%s/%s", path, saveanswer); - free(saveanswer); + if (new_path[0] != '/') { + new_path = charealloc(new_path, strlen(path) + strlen(answer) + 2); + sprintf(new_path, "%s/%s", path, answer); } - if ((test_dir = opendir(answer)) == NULL) { +#ifndef DISABLE_OPERATINGDIR + if (check_operating_dir(new_path, FALSE)) { + statusbar(_("Can't go outside of %s in restricted mode"), operating_dir); + free(new_path); + break; + } +#endif + + if (!readable_dir(new_path)) { /* We can't open this dir for some reason. Complain */ statusbar(_("Can't open \"%s\": %s"), answer, strerror(errno)); + free(new_path); break; - } - closedir(test_dir); + } /* Start over again with the new path value */ - path = mallocstrcpy(path, answer); + free(path); + path = new_path; return do_browser(path); /* Stuff we want to abort the browser */ diff --git a/nano.h b/nano.h index 92b462cd..c85743e0 100644 --- a/nano.h +++ b/nano.h @@ -34,6 +34,7 @@ /* Define charalloc as a macro rather than duplicating code */ #define charalloc(howmuch) (char *)nmalloc((howmuch) * sizeof(char)) +#define charealloc(ptr, howmuch) (char *)nrealloc(ptr, (howmuch) * sizeof(char)) #ifndef NANO_SMALL /* For the backup file copy ... */