Skip to content

Commit c95daa9

Browse files
committed
Fix more issues with encodilng length
Should fix bug #77381, bug #77382, bug #77385, bug #77394.
1 parent 7a12dad commit c95daa9

File tree

6 files changed

+38
-14
lines changed

6 files changed

+38
-14
lines changed

ext/mbstring/oniguruma/enc/unicode.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10971,6 +10971,7 @@ onigenc_unicode_mbc_case_fold(OnigEncoding enc,
1097110971

1097210972
code = ONIGENC_MBC_TO_CODE(enc, p, end);
1097310973
len = enclen(enc, p);
10974+
if (*pp + len > end) len = end - *pp;
1097410975
*pp += len;
1097510976

1097610977
#ifdef USE_UNICODE_CASE_FOLD_TURKISH_AZERI

ext/mbstring/oniguruma/regcomp.c

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -469,13 +469,13 @@ compile_length_string_node(Node* node, regex_t* reg)
469469
ambig = NSTRING_IS_AMBIG(node);
470470

471471
p = prev = sn->s;
472-
prev_len = enclen(enc, p);
472+
SAFE_ENC_LEN(enc, p, sn->end, prev_len);
473473
p += prev_len;
474474
slen = 1;
475475
rlen = 0;
476476

477477
for (; p < sn->end; ) {
478-
len = enclen(enc, p);
478+
SAFE_ENC_LEN(enc, p, sn->end, len);
479479
if (len == prev_len) {
480480
slen++;
481481
}
@@ -518,13 +518,12 @@ compile_string_node(Node* node, regex_t* reg)
518518
ambig = NSTRING_IS_AMBIG(node);
519519

520520
p = prev = sn->s;
521-
prev_len = enclen(enc, p);
521+
SAFE_ENC_LEN(enc, p, end, prev_len);
522522
p += prev_len;
523523
slen = 1;
524524

525525
for (; p < end; ) {
526-
len = enclen(enc, p);
527-
if (p + len > end) len = end - p;
526+
SAFE_ENC_LEN(enc, p, end, len);
528527
if (len == prev_len) {
529528
slen++;
530529
}
@@ -3391,7 +3390,7 @@ expand_case_fold_string(Node* node, regex_t* reg)
33913390
goto err;
33923391
}
33933392

3394-
len = enclen(reg->enc, p);
3393+
SAFE_ENC_LEN(reg->enc, p, end, len);
33953394

33963395
if (n == 0) {
33973396
if (IS_NULL(snode)) {

ext/mbstring/oniguruma/regparse.c

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -246,12 +246,6 @@ strdup_with_null(OnigEncoding enc, UChar* s, UChar* end)
246246
}
247247
#endif
248248

249-
#if (defined (__GNUC__) && __GNUC__ > 2 ) && !defined(DARWIN) && !defined(__hpux) && !defined(_AIX)
250-
# define UNEXPECTED(condition) __builtin_expect(condition, 0)
251-
#else
252-
# define UNEXPECTED(condition) (condition)
253-
#endif
254-
255249
/* scan pattern methods */
256250
#define PEND_VALUE 0
257251

@@ -3589,7 +3583,9 @@ fetch_token(OnigToken* tok, UChar** src, UChar* end, ScanEnv* env)
35893583
tok->u.code = (OnigCodePoint )num;
35903584
}
35913585
else { /* string */
3592-
p = tok->backp + enclen(enc, tok->backp);
3586+
int len;
3587+
SAFE_ENC_LEN(enc, tok->backp, end, len);
3588+
p = tok->backp + len;
35933589
}
35943590
break;
35953591
}

ext/mbstring/oniguruma/regparse.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,4 +348,16 @@ extern int onig_print_names(FILE*, regex_t*);
348348
#endif
349349
#endif
350350

351+
#if (defined (__GNUC__) && __GNUC__ > 2 ) && !defined(DARWIN) && !defined(__hpux) && !defined(_AIX)
352+
# define UNEXPECTED(condition) __builtin_expect(condition, 0)
353+
#else
354+
# define UNEXPECTED(condition) (condition)
355+
#endif
356+
357+
#define SAFE_ENC_LEN(enc, p, end, res) do { \
358+
int __res = enclen(enc, p); \
359+
if (UNEXPECTED(p + __res > end)) __res = end - p; \
360+
res = __res; \
361+
} while(0);
362+
351363
#endif /* REGPARSE_H */

ext/mbstring/tests/bug77371.phpt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ Bug #77371 (heap buffer overflow in mb regex functions - compile_string_node)
44
<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
55
--FILE--
66
<?php
7-
var_dump(mb_ereg("()0\xfc00000\xfc00000\xfc00000\xfc",""))
7+
var_dump(mb_ereg("()0\xfc00000\xfc00000\xfc00000\xfc",""));
88
?>
99
--EXPECT--
1010
bool(false)

ext/mbstring/tests/bug77381.phpt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
--TEST--
2+
Bug #77381 (heap buffer overflow in multibyte match_at)
3+
--SKIPIF--
4+
<?php extension_loaded('mbstring') or die('skip mbstring not available'); ?>
5+
--FILE--
6+
<?php
7+
var_dump(mb_ereg("000||0\xfa","0"));
8+
var_dump(mb_ereg("(?i)000000000000000000000\xf0",""));
9+
var_dump(mb_ereg("0000\\"."\xf5","0"));
10+
var_dump(mb_ereg("(?i)FFF00000000000000000\xfd",""));
11+
?>
12+
--EXPECT--
13+
int(1)
14+
bool(false)
15+
bool(false)
16+
bool(false)

0 commit comments

Comments
 (0)