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 15:21:15 -0800
commitb76c5760919b33fe15d9350a23ccaebcc905397c (patch)
tree18ac1343300957ea4bb6bf68bd0bdd21c835fa66
parenta632605cdf74fe0ad72c3a234e0cbf748f25bcff (diff)
downloadtxr-b76c5760919b33fe15d9350a23ccaebcc905397c.tar.gz
txr-b76c5760919b33fe15d9350a23ccaebcc905397c.tar.bz2
txr-b76c5760919b33fe15d9350a23ccaebcc905397c.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;
}