Download raw body.
fix 2 leaks in word.c
While reviewing word.c I noticed two memory leaks triggered by
transposing words with M-t.
First, in grabword(), the old *word buffer is never freed before
asprintf() overwrites the pointer on each iteration. This leaks every
previously allocated buffer except the last one.
Second, in transposeword(), word2 is set to NULL before it is freed,
making the free(word2) at the end of the function a no-op.
Both leaks are confirmed by valgrind, they trigger on every successful
M-t invocation, no OOM required.
--- a/word.c
+++ b/word.c
@@ -206,14 +206,20 @@
int c;
while (inword() == TRUE) {
+ char *newword;
c = lgetc(curwp->w_dotp, curwp->w_doto);
if (*word == NULL) {
- if (asprintf(word, "%c", c) == -1)
+ if (asprintf(&newword, "%c", c) == -1)
return (errno);
} else {
- if (asprintf(word, "%s%c", *word, c) == -1)
+ if (asprintf(&newword, "%s%c", *word, c) == -1) {
+ free(*word);
+ *word = NULL;
return (errno);
+ }
+ free(*word);
}
+ *word = newword;
(void)forwdel(FFRAND, 1);
}
if (*word == NULL)
--- a/word.c
+++ b/word.c
@@ -176,6 +176,7 @@
curwp->w_dotline = tmp2_w_dotline;
curwp->w_dotp = tmp2_w_dotp;
+ free(word2);
word2 = NULL;
}
curwp->w_doto = tmp2_w_doto;
fix 2 leaks in word.c