]> git.wh0rd.org Git - nano.git/commitdiff
add various portability and potential segfault fixes involving getcwd()
authorDavid Lawrence Ramsey <pooka109@gmail.com>
Sat, 26 Mar 2005 04:42:28 +0000 (04:42 +0000)
committerDavid Lawrence Ramsey <pooka109@gmail.com>
Sat, 26 Mar 2005 04:42:28 +0000 (04:42 +0000)
calls

git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@2428 35c25a1d-7b9e-4130-9fde-d3aeb78583b8

ChangeLog
src/files.c
src/nano.h
src/utils.c

index 68933b3bc17b547bda0ed513d7378e67d3080376..943fc55a85b475ea4b79c0721cdfaf1e46010cd8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -12,8 +12,18 @@ CVS code -
   cut_to_eol()
        - Fix inaccurate comment. (DLR)
 - files.c:
+  get_full_path()
+       - Rework handling of the results of getcwd() in order to avoid
+         segfaults if they fail, and to remove uses of the nonportable
+         GNU extension where passing a size of 0 will get a string as
+         long as we need. (DLR)
   do_browser()
        - Rename variable lineno to fileline to avoid confusion. (DLR)
+  do_browse_from()
+       - Rework handling of the results of getcwd() in order to avoid
+         segfaults if they fail, and to remove uses of the nonportable
+         GNU extension where passing a size of 0 will get a string as
+         long as we need. (DLR)
 - nano.c:
   help_init()
        - When calculating allocsize, take multibyte characters into
@@ -39,6 +49,11 @@ CVS code -
        - Instead of breaking a line at a space and readding the space
          afterwards, just break the line after the space, as it's more
          efficient. (DLR)
+- nano.h:
+       - Define PATH_MAX as 4096 if it isn't defined, as passing a size
+         of 0 to get a string as long as we need is a nonportable GNU
+         extension, and hence it won't work on non-GNU systems that
+         don't define PATH_MAX. (DLR)
 - utils.c:
   regexec_safe()
        - Rename to safe_regexec() for consistency. (DLR)
index 7be70ec9d28154a76eb94a1ca1f489337d93d20a..ff2ade33328458f2a5ec7361151c23569c3b4e4e 100644 (file)
@@ -983,15 +983,8 @@ char *get_full_path(const char *origpath)
        return NULL;
 
     /* Get the current directory. */
-#if PATH_MAX != -1
     d_here = charalloc(PATH_MAX + 1);
-#else
-    d_here = NULL;
-#endif
     d_here = getcwd(d_here, PATH_MAX + 1);
-#if PATH_MAX != -1
-    align(&d_here);
-#endif
 
     if (d_here != NULL) {
        const char *last_slash;
@@ -999,6 +992,8 @@ char *get_full_path(const char *origpath)
        bool path_only;
        struct stat fileinfo;
 
+       align(&d_here);
+
        /* If the current directory isn't "/", tack a slash onto the end
         * of it. */
        if (strcmp(d_here, "/") != 0) {
@@ -1055,26 +1050,24 @@ char *get_full_path(const char *origpath)
            } else {
                /* Get the full path and save it in d_there. */
                free(d_there);
-#if PATH_MAX != -1
+
                d_there = charalloc(PATH_MAX + 1);
-#else
-               d_there = NULL;
-#endif
                d_there = getcwd(d_there, PATH_MAX + 1);
-#if PATH_MAX != -1
-               align(&d_there);
-#endif
 
-               if (d_there == NULL)
+               if (d_there != NULL) {
+                   align(&d_there);
+
+                   if (strcmp(d_there, "/") != 0) {
+                       /* Make sure d_there ends in a slash. */
+                       d_there = charealloc(d_there,
+                               strlen(d_there) + 2);
+                       strcat(d_there, "/");
+                   }
+               } else
                    /* If we couldn't get the full path, set path_only
                     * to TRUE so that we clean up correctly, free all
                     * allocated memory, and return NULL. */
                    path_only = TRUE;
-               else if (strcmp(d_there, "/") != 0) {
-                   /* Make sure d_there ends in a slash. */
-                   d_there = charealloc(d_there, strlen(d_there) + 2);
-                   strcat(d_there, "/");
-               }
 
                /* Finally, go back to the path specified in d_here,
                 * where we were before. */
@@ -1090,7 +1083,7 @@ char *get_full_path(const char *origpath)
         * d_there_file contains the filename portion of the answer.  If
         * this is the case, tack d_there_file onto the end of
         * d_there, so that d_there contains the complete answer. */
-       if (!path_only && d_there) {
+       if (!path_only && d_there != NULL) {
            d_there = charealloc(d_there, strlen(d_there) +
                strlen(d_there_file) + 1);
            strcat(d_there, d_there_file);
@@ -2764,7 +2757,7 @@ char *do_browse_from(const char *inpath)
     struct stat st;
     char *path;
        /* This holds the tilde-expanded version of inpath. */
-    DIR *dir;
+    DIR *dir = NULL;
 
     assert(inpath != NULL);
 
@@ -2780,15 +2773,12 @@ char *do_browse_from(const char *inpath)
        striponedir(path);
        if (stat(path, &st) == -1 || !S_ISDIR(st.st_mode)) {
            free(path);
-#if PATH_MAX != -1
+
            path = charalloc(PATH_MAX + 1);
-#else
-           path = NULL;
-#endif
            path = getcwd(path, PATH_MAX + 1);
-#if PATH_MAX != -1
-           align(&path);
-#endif
+
+           if (path != NULL)
+               align(&path);
        }
     }
 
@@ -2802,7 +2792,9 @@ char *do_browse_from(const char *inpath)
     }
 #endif
 
-    dir = opendir(path);
+    if (path != NULL)
+       dir = opendir(path);
+
     if (dir == NULL) {
        beep();
        free(path);
index 28d5249a0d7a8a16976f23edae7d6ea7b20ba807..5fc3d616fda7c522d6f2082ee588b7784cd2258d 100644 (file)
@@ -55,7 +55,7 @@
 /* Set a default value for PATH_MAX, so we can use it in lines like
  * "path = getcwd(NULL, PATH_MAX + 1);". */
 #ifndef PATH_MAX
-#define PATH_MAX -1
+#define PATH_MAX 4096
 #endif
 
 #ifdef USE_SLANG
index ce21eced7912642496df2ea9db2e5a29e7423b97..af0055eafa10734eb79b102c0405c91ea1d1170c 100644 (file)
@@ -110,6 +110,7 @@ bool parse_num(const char *str, ssize_t *val)
 void align(char **strp)
 {
     assert(strp != NULL);
+
     if (*strp != NULL)
        *strp = charealloc(*strp, strlen(*strp) + 1);
 }