summaryrefslogtreecommitdiffstats
path: root/parser.c
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 /parser.c
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.
Diffstat (limited to 'parser.c')
-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;
}