]> git.wh0rd.org Git - nano.git/commitdiff
- files.c:do_browser() - Fix goto directory operating dir check and tilde expansion...
authorChris Allegretta <chrisa@asty.org>
Thu, 30 Jan 2003 00:57:33 +0000 (00:57 +0000)
committerChris Allegretta <chrisa@asty.org>
Thu, 30 Jan 2003 00:57:33 +0000 (00:57 +0000)
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@1409 35c25a1d-7b9e-4130-9fde-d3aeb78583b8

ChangeLog
files.c
nano.h

index dddd7f88f4cfa45166eadcf9e22b76d903e68c05..99205561914bbe4ee9134830668a5cefef11c0e5 100644 (file)
--- 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 7c46929ec317ad22360b7888cd903e7100c4f396..79f5ac678fbc8aab7c1cd79456b8b1f0032780c6 100644 (file)
--- 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 92b462cd3c5ad5e143eafae81bc9df14ec75de4b..c85743e07fc0a6d4bf4b608ed272219cfddebe91 100644 (file)
--- 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 ... */