mirror of
https://git.FreeBSD.org/src.git
synced 2025-01-18 15:30:21 +00:00
Fix computation of the 'n' argument to mbrtowc (through XMBRTOWC) to avoid
reading past 'stop' in various places when converting multibyte characters. Reading too far caused truncation to not be detected when it should have been, eventually causing regexec() to loop infinitely in with certain combinations of patterns and strings in multibyte locales. PR: 74020 MFC after: 4 weeks
This commit is contained in:
parent
ed0cf68945
commit
bd9643b135
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=137959
@ -331,7 +331,7 @@ int eflags;
|
||||
NOTE("false alarm");
|
||||
/* recycle starting later */
|
||||
start = m->coldp + XMBRTOWC(NULL, m->coldp,
|
||||
m->endp - m->coldp, &m->mbs, 0);
|
||||
stop - m->coldp, &m->mbs, 0);
|
||||
assert(start <= stop);
|
||||
}
|
||||
|
||||
@ -807,7 +807,7 @@ sopno stopst;
|
||||
if (p == m->endp)
|
||||
c = OUT;
|
||||
else
|
||||
clen = XMBRTOWC(&c, p, m->endp - p, &m->mbs, BADCHAR);
|
||||
clen = XMBRTOWC(&c, p, stop - p, &m->mbs, BADCHAR);
|
||||
if (EQ(st, fresh))
|
||||
coldp = p;
|
||||
|
||||
@ -861,7 +861,7 @@ sopno stopst;
|
||||
assert(coldp != NULL);
|
||||
m->coldp = coldp;
|
||||
if (ISSET(st, stopst))
|
||||
return(p+XMBRTOWC(NULL, p, m->endp - p, &m->mbs, 0));
|
||||
return(p+XMBRTOWC(NULL, p, stop - p, &m->mbs, 0));
|
||||
else
|
||||
return(NULL);
|
||||
}
|
||||
@ -913,7 +913,7 @@ sopno stopst;
|
||||
c = OUT;
|
||||
clen = 0;
|
||||
} else
|
||||
clen = XMBRTOWC(&c, p, m->endp - p, &m->mbs, BADCHAR);
|
||||
clen = XMBRTOWC(&c, p, stop - p, &m->mbs, BADCHAR);
|
||||
|
||||
/* is there an EOL and/or BOL between lastc and c? */
|
||||
flagch = '\0';
|
||||
|
Loading…
Reference in New Issue
Block a user