From 0ee7729666b865a3768804b40a42df8444b63611 Mon Sep 17 00:00:00 2001 From: Benno Schulenberg Date: Fri, 15 Jan 2016 13:17:44 +0000 Subject: [PATCH] Freeing the full filename in all cases. 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 -> memory leak Patch by Mike Frysinger. git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@5563 35c25a1d-7b9e-4130-9fde-d3aeb78583b8 --- ChangeLog | 3 +++ src/files.c | 9 +++++++-- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 4524b33b..cde542e9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,6 @@ +2016-01-15 Mike Frysinger + * src/files.c (open_file): Free the full filename in all cases. + 2016-01-14 Benno Schulenberg * doc/nanorc.sample.in: Remove a reference to an obsolete file. Reported by Mike Frysinger. diff --git a/src/files.c b/src/files.c index 2daeaf91..ab0b2ccc 100644 --- a/src/files.c +++ b/src/files.c @@ -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; -- 2.39.5