nano

nano with my custom patches
git clone git://bsandro.tech/nano
Log | Files | Refs | README | LICENSE

commit 0ee7729666b865a3768804b40a42df8444b63611
parent 63370954bd79d1d24f4060f1eeb2e383dbc3d040
Author: Benno Schulenberg <bensberg@justemail.net>
Date:   Fri, 15 Jan 2016 13:17:44 +0000

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
<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

Diffstat:
MChangeLog | 3+++
Msrc/files.c | 9+++++++--
2 files changed, 10 insertions(+), 2 deletions(-)

diff --git 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. diff --git 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;