Prevent overflow beyond the end of string in form_update_line()
Bug-Debian: https://github.com/tats/w3m/issues/75
This commit is contained in:
14
form.c
14
form.c
@@ -278,10 +278,10 @@ form_update_line(Line *line, char **str, int spos, int epos, int width,
|
||||
int newline, int password)
|
||||
{
|
||||
int c_len = 1, c_width = 1, w, i, len, pos;
|
||||
char *p, *buf;
|
||||
char *p, *buf, *q = *str + strlen(*str);
|
||||
Lineprop c_type, effect, *prop;
|
||||
|
||||
for (p = *str, w = 0, pos = 0; *p && w < width;) {
|
||||
for (p = *str, w = 0, pos = 0; p < q && w < width;) {
|
||||
c_type = get_mctype((unsigned char *)p);
|
||||
#ifdef USE_M17N
|
||||
c_len = get_mclen(p);
|
||||
@@ -326,7 +326,7 @@ form_update_line(Line *line, char **str, int spos, int epos, int width,
|
||||
bcopy((void *)line->propBuf, (void *)prop, spos * sizeof(Lineprop));
|
||||
|
||||
effect = CharEffect(line->propBuf[spos]);
|
||||
for (p = *str, w = 0, pos = spos; *p && w < width;) {
|
||||
for (p = *str, w = 0, pos = spos; p < q && w < width;) {
|
||||
c_type = get_mctype((unsigned char *)p);
|
||||
#ifdef USE_M17N
|
||||
c_len = get_mclen(p);
|
||||
@@ -347,7 +347,7 @@ form_update_line(Line *line, char **str, int spos, int epos, int width,
|
||||
if (w + c_width > width)
|
||||
break;
|
||||
#endif
|
||||
for (i = 0; i < c_width; i++) {
|
||||
for (i = 0; pos < len && i < c_width; i++) {
|
||||
buf[pos] = '*';
|
||||
prop[pos] = effect | PC_ASCII;
|
||||
pos++;
|
||||
@@ -373,7 +373,7 @@ form_update_line(Line *line, char **str, int spos, int epos, int width,
|
||||
pos++;
|
||||
#ifdef USE_M17N
|
||||
c_type = (c_type & ~PC_WCHAR1) | PC_WCHAR2;
|
||||
for (i = 1; i < c_len; i++) {
|
||||
for (i = 1; pos < len && p + i < q && i < c_len; i++) {
|
||||
buf[pos] = p[i];
|
||||
prop[pos] = effect | c_type;
|
||||
pos++;
|
||||
@@ -383,7 +383,7 @@ form_update_line(Line *line, char **str, int spos, int epos, int width,
|
||||
}
|
||||
p += c_len;
|
||||
}
|
||||
for (; w < width; w++) {
|
||||
for (; pos < len && w < width; w++) {
|
||||
buf[pos] = ' ';
|
||||
prop[pos] = effect | PC_ASCII;
|
||||
pos++;
|
||||
@@ -398,6 +398,8 @@ form_update_line(Line *line, char **str, int spos, int epos, int width,
|
||||
if (*p == '\n')
|
||||
p++;
|
||||
}
|
||||
if (p > q)
|
||||
p = q;
|
||||
*str = p;
|
||||
|
||||
bcopy((void *)&line->lineBuf[epos], (void *)&buf[pos],
|
||||
|
Reference in New Issue
Block a user