]> git.wh0rd.org Git - nano.git/commitdiff
Freeing the full filename in all cases.
authorBenno Schulenberg <bensberg@justemail.net>
Fri, 15 Jan 2016 13:17:44 +0000 (13:17 +0000)
committerBenno Schulenberg <bensberg@justemail.net>
Fri, 15 Jan 2016 13:17:44 +0000 (13:17 +0000)
There's a bunch of return cases where we don't free the new full filename
which leads to leaks when writing out new files.  One way to reproduce:
$ rm -f foo
$ nano foo
<hit enter>
<ctrl+o to save>
<ctrl+x to exit>
-> memory leak

Patch by Mike Frysinger.

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

ChangeLog
src/files.c

index 4524b33b48e8207dc2fc91db70c6dd7d0e31e98e..cde542e90bfb6e975bb892dd7dc748d1664ae81c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,6 @@
+2016-01-15  Mike Frysinger  <vapier@gentoo.org>
+       * src/files.c (open_file): Free the full filename in all cases.
+
 2016-01-14  Benno Schulenberg  <bensberg@justemail.net>
        * doc/nanorc.sample.in: Remove a reference to an obsolete file.
        Reported by Mike Frysinger.
index 2daeaf91e9869a5a1b60cfac93270fda3a0a81b3..ab0b2cccd9230a093980e1d71224349117336e36 100644 (file)
@@ -922,15 +922,17 @@ int open_file(const char *filename, bool newfie, bool quiet, FILE **f)
      * permissions, just try the relative one. */
     if (full_filename == NULL || (stat(full_filename, &fileinfo) == -1 &&
                stat(filename, &fileinfo2) != -1))
-       full_filename = mallocstrcpy(NULL, filename);
+       full_filename = mallocstrcpy(full_filename, filename);
 
     if (stat(full_filename, &fileinfo) == -1) {
+       /* All cases below return. */
+       free(full_filename);
+
        /* Well, maybe we can open the file even if the OS says it's
         * not there. */
        if ((fd = open(filename, O_RDONLY)) != -1) {
            if (!quiet)
                statusbar(_("Reading File"));
-           free(full_filename);
            return 0;
        }
 
@@ -944,6 +946,8 @@ int open_file(const char *filename, bool newfie, bool quiet, FILE **f)
        return -1;
     } else if (S_ISDIR(fileinfo.st_mode) || S_ISCHR(fileinfo.st_mode) ||
                S_ISBLK(fileinfo.st_mode)) {
+       free(full_filename);
+
        /* Don't open directories, character files, or block files.
         * Sorry, /dev/sndstat! */
        statusbar(S_ISDIR(fileinfo.st_mode) ?
@@ -952,6 +956,7 @@ int open_file(const char *filename, bool newfie, bool quiet, FILE **f)
        beep();
        return -1;
     } else if ((fd = open(full_filename, O_RDONLY)) == -1) {
+       free(full_filename);
        statusbar(_("Error reading %s: %s"), filename, strerror(errno));
        beep();
        return -1;