diff --git a/ChangeLog b/ChangeLog index 4524b33b48e8207dc2fc91db70c6dd7d0e31e98e..cde542e90bfb6e975bb892dd7dc748d1664ae81c 100644 --- 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 index 2daeaf91e9869a5a1b60cfac93270fda3a0a81b3..ab0b2cccd9230a093980e1d71224349117336e36 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;