commit 41f08534d96cd414f2a0fb366632e0fe26f73e12
parent f8ed6bb09913135c5930dac7b9541136ea60fd17
Author: Benno Schulenberg <bensberg@justemail.net>
Date: Fri, 29 Jan 2016 16:58:02 +0000
Plugging a couple of memory leaks.
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@5598 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
Diffstat:
2 files changed, 24 insertions(+), 7 deletions(-)
diff --git a/ChangeLog b/ChangeLog
@@ -4,6 +4,7 @@
* src/nano.c (main): For second or later files on the command line,
only check the position history when option 'positionlog' is set.
This fixes a bug that was unconsciously reported by Mike Frysinger.
+ * src/files.c (do_lockfile): Plug a couple of memory leaks.
2016-01-26 Benno Schulenberg <bensberg@justemail.net>
* src/files.c (update_poshistory): Do not add directories to the
diff --git a/src/files.c b/src/files.c
@@ -306,7 +306,7 @@ int do_lockfile(const char *filename)
char *lockfilename = charalloc(locknamesize);
static char lockprog[11], lockuser[17];
struct stat fileinfo;
- int lockfd, lockpid;
+ int lockfd, lockpid, retval = -1;
snprintf(lockfilename, locknamesize, "%s/%s%s%s", dirname(namecopy1),
locking_prefix, basename(namecopy2), locking_suffix);
@@ -318,14 +318,16 @@ int do_lockfile(const char *filename)
if (stat(lockfilename, &fileinfo) != -1) {
ssize_t readtot = 0;
ssize_t readamt = 0;
- char *lockbuf = charalloc(8192);
- char *promptstr = charalloc(128);
+ char *lockbuf, *promptstr;
int ans;
+
if ((lockfd = open(lockfilename, O_RDONLY)) < 0) {
statusbar(_("Error opening lock file %s: %s"),
lockfilename, strerror(errno));
- return -1;
+ goto free_the_name;
}
+
+ lockbuf = charalloc(8192);
do {
readamt = read(lockfd, &lockbuf[readtot], BUFSIZ);
readtot += readamt;
@@ -334,26 +336,40 @@ int do_lockfile(const char *filename)
if (readtot < 48) {
statusbar(_("Error reading lock file %s: Not enough data read"),
lockfilename);
- return -1;
+ free(lockbuf);
+ goto free_the_name;
}
+
strncpy(lockprog, &lockbuf[2], 10);
lockpid = (unsigned char)lockbuf[25] * 256 + (unsigned char)lockbuf[24];
strncpy(lockuser, &lockbuf[28], 16);
+ free(lockbuf);
+
#ifdef DEBUG
fprintf(stderr, "lockpid = %d\n", lockpid);
fprintf(stderr, "program name which created this lock file should be %s\n", lockprog);
fprintf(stderr, "user which created this lock file should be %s\n", lockuser);
#endif
+ promptstr = charalloc(128);
/* TRANSLATORS: The second %s is the name of the user, the third that of the editor. */
sprintf(promptstr, _("File %s is being edited (by %s with %s, PID %d); continue?"),
filename, lockuser, lockprog, lockpid);
ans = do_yesno_prompt(FALSE, promptstr);
+ free(promptstr);
+
if (ans < 1) {
blank_statusbar();
- return -1;
+ goto free_the_name;
}
}
- return write_lockfile(lockfilename, filename, FALSE);
+
+ retval = write_lockfile(lockfilename, filename, FALSE);
+
+ free_the_name:
+ if (retval < 1)
+ free(lockfilename);
+
+ return retval;
}
#endif /* !NANO_TINY */