commit e86dc0381cf65ce62294aae4a0b6ef8282953b5b
parent 5fa5ccff43c4b41265518ff0212f130dc877b475
Author: Benno Schulenberg <bensberg@justemail.net>
Date: Sat, 20 Feb 2016 12:16:43 +0000
Avoiding a memory leak when tabbing on a string that doesn't occur in the
history. This fixes Savannah bug #47124 reported by Mike Frysinger.
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@5653 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
Diffstat:
4 files changed, 11 insertions(+), 7 deletions(-)
diff --git a/ChangeLog b/ChangeLog
@@ -1,3 +1,8 @@
+2016-02-20 Benno Schulenberg <bensberg@justemail.net>
+ * src/search.c (get_history_completion): Avoid leaking memory
+ when tabbing on a string that does not occur in the history.
+ This fixes Savannah bug #47124 reported by Mike Frysinger.
+
2016-02-18 Benno Schulenberg <bensberg@justemail.net>
* src/search.c (do_replace_loop), src/text.c (do_int_spell_fix),
src/winio.c (edit_refresh): Fix Savannah bug #47127 the proper way.
diff --git a/src/prompt.c b/src/prompt.c
@@ -616,9 +616,8 @@ functionptrtype get_prompt_string(int *actual, bool allow_tabs,
complete_len = strlen(answer);
if (complete_len > 0) {
- answer = mallocstrcpy(answer,
- get_history_completion(history_list,
- answer, complete_len));
+ answer = get_history_completion(history_list,
+ answer, complete_len);
statusbar_x = strlen(answer);
}
} else
diff --git a/src/proto.h b/src/proto.h
@@ -623,7 +623,7 @@ void do_gotolinecolumn_void(void);
bool find_bracket_match(bool reverse, const char *bracket_set);
void do_find_bracket(void);
#ifndef DISABLE_TABCOMP
-char *get_history_completion(filestruct **h, const char *s, size_t len);
+char *get_history_completion(filestruct **h, char *s, size_t len);
#endif
#endif
#ifndef DISABLE_HISTORIES
diff --git a/src/search.c b/src/search.c
@@ -1351,7 +1351,7 @@ void get_history_older_void(void)
* looking at only the first len characters of s, and return that
* string. If there isn't one, or if len is 0, don't move h and return
* s. */
-char *get_history_completion(filestruct **h, const char *s, size_t len)
+char *get_history_completion(filestruct **h, char *s, size_t len)
{
assert(s != NULL);
@@ -1380,7 +1380,7 @@ char *get_history_completion(filestruct **h, const char *s, size_t len)
if (p != NULL) {
*h = p;
- return (*h)->data;
+ return mallocstrcpy(s, (*h)->data);
}
/* Search the history list from the top to the current position
@@ -1392,7 +1392,7 @@ char *get_history_completion(filestruct **h, const char *s, size_t len)
if (p != NULL) {
*h = p;
- return (*h)->data;
+ return mallocstrcpy(s, (*h)->data);
}
}