Previously, njs_utf8_next() might over-read up to 1 byte
beyond the string memory. Whereas njs_utf8_prev() might
over-read unlimited number of bytes before the string.
}
while (i-- > to) {
- pos = njs_utf8_prev(p);
+ pos = njs_utf8_prev(p, string_prop.start);
/* This cannot fail. */
(void) njs_string_new(vm, &character, pos, p - pos , 1);
p = njs_string_utf8_offset(string.start, end, index);
- for (; p >= string.start; p = njs_utf8_prev(p)) {
+ for (; p >= string.start; p = njs_utf8_prev(p, string.start)) {
if ((p + s.size) <= end && memcmp(p, s.start, s.size) == 0) {
goto done;
}
break;
}
- prev = njs_utf8_prev(prev);
+ prev = njs_utf8_prev(prev, start);
p = prev;
cp = njs_utf8_decode(&ctx, &p, end);
if ((c & 0x80) != 0) {
+ if (njs_slow_path(p >= end)) {
+ return p;
+ }
+
do {
c = *p;
njs_inline const u_char *
-njs_utf8_prev(const u_char *p)
+njs_utf8_prev(const u_char *p, const u_char *start)
{
u_char c;
do {
p--;
+
+ if (njs_slow_path(p < start)) {
+ break;
+ }
+
c = *p;
} while ((c & 0xC0) == 0x80);