summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2019-02-15 07:49:01 -0800
committerKaz Kylheku <kaz@kylheku.com>2019-02-15 07:49:01 -0800
commita2a05e3b288ca6231cfb9a7a49bb147380412a48 (patch)
tree18ac1343300957ea4bb6bf68bd0bdd21c835fa66
parent23af871f37ca7a572311f6ec3d72f6e2afb271fd (diff)
downloadtxr-a2a05e3b288ca6231cfb9a7a49bb147380412a48.tar.gz
txr-a2a05e3b288ca6231cfb9a7a49bb147380412a48.tar.bz2
txr-a2a05e3b288ca6231cfb9a7a49bb147380412a48.zip
listener: fix buffer overflow reading external file.
When an external file is edited, and is longer than the listener's buffer allows, the buffer overflows, trashing the other fields in the linenoise structure, and memory beyond. * parser.c (lino_gets): Decrement nchar in the loop. Also, eliminate useless return case.
-rw-r--r--parser.c7
1 files changed, 1 insertions, 6 deletions
diff --git a/parser.c b/parser.c
index d0c4b7a9..0f5d5c99 100644
--- a/parser.c
+++ b/parser.c
@@ -1496,18 +1496,13 @@ static wchar_t *lino_gets(mem_t *stream_in, wchar_t *buf, size_t nchar)
if (nchar == 0)
return buf;
- while (nchar > 1) {
+ while (nchar-- > 1) {
val ch = get_char(stream);
if (!ch)
break;
*ptr++ = c_num(ch);
}
- if (ptr == buf) {
- *ptr++ = 0;
- return 0;
- }
-
*ptr++ = 0;
return buf;
}