Skip to content

Commit e3105f5

Browse files
committed
Fix reference handling of grapheme_extract()
Closes GH-18471.
1 parent e3cac07 commit e3105f5

File tree

2 files changed

+25
-11
lines changed

2 files changed

+25
-11
lines changed

ext/intl/grapheme/grapheme_string.c

+6-11
Original file line numberDiff line numberDiff line change
@@ -711,15 +711,10 @@ PHP_FUNCTION(grapheme_extract)
711711
}
712712

713713
if ( NULL != next ) {
714-
if ( !Z_ISREF_P(next) ) {
715-
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR,
716-
"grapheme_extract: 'next' was not passed by reference", 0 );
717-
RETURN_FALSE;
718-
} else {
719-
ZVAL_DEREF(next);
720-
/* initialize next */
721-
zval_ptr_dtor(next);
722-
ZVAL_LONG(next, lstart);
714+
ZEND_ASSERT(Z_ISREF_P(next));
715+
ZEND_TRY_ASSIGN_REF_LONG(next, lstart);
716+
if (UNEXPECTED(EG(exception))) {
717+
RETURN_THROWS();
723718
}
724719
}
725720

@@ -776,7 +771,7 @@ PHP_FUNCTION(grapheme_extract)
776771
if ( -1 != grapheme_ascii_check((unsigned char *)pstr, MIN(size + 1, str_len)) ) {
777772
size_t nsize = MIN(size, str_len);
778773
if ( NULL != next ) {
779-
ZVAL_LONG(next, start+nsize);
774+
ZEND_TRY_ASSIGN_REF_LONG(next, start + nsize);
780775
}
781776
RETURN_STRINGL(pstr, nsize);
782777
}
@@ -810,7 +805,7 @@ PHP_FUNCTION(grapheme_extract)
810805
ubrk_close(bi);
811806

812807
if ( NULL != next ) {
813-
ZVAL_LONG(next, start+ret_pos);
808+
ZEND_TRY_ASSIGN_REF_LONG(next, start + ret_pos);
814809
}
815810

816811
RETURN_STRINGL(((char *)pstr), ret_pos);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
--TEST--
2+
grapheme_extract() references handling
3+
--EXTENSIONS--
4+
intl
5+
--FILE--
6+
<?php
7+
class Test {
8+
public string $prop = "a";
9+
}
10+
$test = new Test;
11+
$next =& $test->prop;
12+
grapheme_extract("test", 4, next: $next);
13+
var_dump($test);
14+
?>
15+
--EXPECT--
16+
object(Test)#1 (1) {
17+
["prop"]=>
18+
&string(1) "4"
19+
}

0 commit comments

Comments
 (0)