commit f80a59c7cc9f6b97d6005e23afe19387efe0564a
parent 858d9d90cbf0d9e2f9e02d4a9252e21d62eaa08c
Author: Chris Allegretta <chrisa@asty.org>
Date: Thu, 30 Jan 2003 00:57:33 +0000
- 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
Diffstat:
3 files changed, 22 insertions(+), 18 deletions(-)
diff --git 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
@@ -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
@@ -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 ... */