aboutsummaryrefslogtreecommitdiffstats
path: root/file.c
diff options
context:
space:
mode:
authorTatsuya Kinoshita <tats@debian.org>2016-12-13 13:44:08 +0000
committerTatsuya Kinoshita <tats@debian.org>2016-12-13 14:04:18 +0000
commite79d0ec2a00369a6af24007a1f2bb5e876e2c847 (patch)
tree3e6c57736c73e0c874a51958e124a73f5e2a222f /file.c
parentPrevent overflow beyond the end of string in textfieldrep() (diff)
downloadw3m-e79d0ec2a00369a6af24007a1f2bb5e876e2c847.tar.gz
w3m-e79d0ec2a00369a6af24007a1f2bb5e876e2c847.zip
Prevent overflow beyond the end of string in proc_mchar()
Bug-Debian: https://github.com/tats/w3m/issues/80 cf. https://github.com/tats/w3m/issues/59
Diffstat (limited to '')
-rw-r--r--file.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/file.c b/file.c
index 7d227da..efee0c6 100644
--- a/file.c
+++ b/file.c
@@ -2603,19 +2603,20 @@ static void
proc_mchar(struct readbuffer *obuf, int pre_mode,
int width, char **str, Lineprop mode)
{
- size_t len;
+ int len, slen;
check_breakpoint(obuf, pre_mode, *str);
obuf->pos += width;
- Strcat_charp_n(obuf->line, *str, get_mclen(*str));
+ len = get_mclen(*str);
+ slen = (int)strlen(*str);
+ if (len > slen && slen > 0)
+ len = slen;
+ Strcat_charp_n(obuf->line, *str, len);
if (width > 0) {
set_prevchar(obuf->prevchar, *str, 1);
if (**str != ' ')
obuf->prev_ctype = mode;
}
- len = get_mclen(*str);
- if (len > strlen(*str))
- len = strlen(*str);
(*str) += len;
obuf->flag |= RB_NFLUSHED;
}