Skip to content

Commit 2b9d2bc

Browse files
committed
Merge branch 'PHP-8.2'
* PHP-8.2: Fix undefined behaviour in string uppercasing and lowercasing
2 parents 86f6c56 + bf487bd commit 2b9d2bc

File tree

1 file changed

+4
-4
lines changed

1 file changed

+4
-4
lines changed

Zend/zend_operators.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2893,7 +2893,7 @@ ZEND_API zend_string* ZEND_FASTCALL zend_string_tolower_ex(zend_string *str, boo
28932893
if (BLOCKCONV_FOUND()) {
28942894
zend_string *res = zend_string_alloc(length, persistent);
28952895
memcpy(ZSTR_VAL(res), ZSTR_VAL(str), p - (unsigned char *) ZSTR_VAL(str));
2896-
unsigned char *q = p + (ZSTR_VAL(res) - ZSTR_VAL(str));
2896+
unsigned char *q = (unsigned char*) ZSTR_VAL(res) + (p - (unsigned char*) ZSTR_VAL(str));
28972897

28982898
/* Lowercase the chunk we already compared. */
28992899
BLOCKCONV_INIT_DELTA('a' - 'A');
@@ -2915,7 +2915,7 @@ ZEND_API zend_string* ZEND_FASTCALL zend_string_tolower_ex(zend_string *str, boo
29152915
zend_string *res = zend_string_alloc(length, persistent);
29162916
memcpy(ZSTR_VAL(res), ZSTR_VAL(str), p - (unsigned char*) ZSTR_VAL(str));
29172917

2918-
unsigned char *q = p + (ZSTR_VAL(res) - ZSTR_VAL(str));
2918+
unsigned char *q = (unsigned char*) ZSTR_VAL(res) + (p - (unsigned char*) ZSTR_VAL(str));
29192919
while (p < end) {
29202920
*q++ = zend_tolower_ascii(*p++);
29212921
}
@@ -2942,7 +2942,7 @@ ZEND_API zend_string* ZEND_FASTCALL zend_string_toupper_ex(zend_string *str, boo
29422942
if (BLOCKCONV_FOUND()) {
29432943
zend_string *res = zend_string_alloc(length, persistent);
29442944
memcpy(ZSTR_VAL(res), ZSTR_VAL(str), p - (unsigned char *) ZSTR_VAL(str));
2945-
unsigned char *q = p + (ZSTR_VAL(res) - ZSTR_VAL(str));
2945+
unsigned char *q = (unsigned char *) ZSTR_VAL(res) + (p - (unsigned char *) ZSTR_VAL(str));
29462946

29472947
/* Uppercase the chunk we already compared. */
29482948
BLOCKCONV_INIT_DELTA('A' - 'a');
@@ -2964,7 +2964,7 @@ ZEND_API zend_string* ZEND_FASTCALL zend_string_toupper_ex(zend_string *str, boo
29642964
zend_string *res = zend_string_alloc(length, persistent);
29652965
memcpy(ZSTR_VAL(res), ZSTR_VAL(str), p - (unsigned char*) ZSTR_VAL(str));
29662966

2967-
unsigned char *q = p + (ZSTR_VAL(res) - ZSTR_VAL(str));
2967+
unsigned char *q = (unsigned char *) ZSTR_VAL(res) + (p - (unsigned char *) ZSTR_VAL(str));
29682968
while (p < end) {
29692969
*q++ = zend_toupper_ascii(*p++);
29702970
}

0 commit comments

Comments
 (0)