Skip to content

Commit 30227f7

Browse files
committed
Merge branch 'PHP-5.5'
* PHP-5.5: Fix bug #62759: Buggy grapheme_substr() on edge case
2 parents 46c4692 + 9872835 commit 30227f7

File tree

2 files changed

+43
-3
lines changed

2 files changed

+43
-3
lines changed

ext/intl/grapheme/grapheme_string.c

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,7 @@ PHP_FUNCTION(grapheme_substr)
434434
grapheme_substr_ascii((char *)str, str_len, start, length, ZEND_NUM_ARGS(), (char **) &sub_str, &sub_str_len);
435435

436436
if ( NULL == sub_str ) {
437+
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "grapheme_substr: invalid parameters", 1 TSRMLS_CC );
437438
RETURN_FALSE;
438439
}
439440

@@ -530,6 +531,15 @@ PHP_FUNCTION(grapheme_substr)
530531
RETURN_STRINGL(((char *)sub_str), sub_str_len, 0);
531532
}
532533

534+
if(length == 0) {
535+
/* empty length - we've validated start, we can return "" now */
536+
if (ustr) {
537+
efree(ustr);
538+
}
539+
ubrk_close(bi);
540+
RETURN_EMPTY_STRING();
541+
}
542+
533543
/* find the end point of the string to return */
534544

535545
if ( length < 0 ) {
@@ -554,25 +564,31 @@ PHP_FUNCTION(grapheme_substr)
554564
length += iter_val;
555565
}
556566

567+
ubrk_close(bi);
568+
557569
if ( UBRK_DONE == sub_str_end_pos) {
558570
if(length < 0) {
559-
560571
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "grapheme_substr: length not contained in string", 1 TSRMLS_CC );
561572

562573
efree(ustr);
563-
ubrk_close(bi);
564574
RETURN_FALSE;
565575
} else {
566576
sub_str_end_pos = ustr_len;
567577
}
568578
}
579+
580+
if(sub_str_start_pos > sub_str_end_pos) {
581+
intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, "grapheme_substr: length is beyond start", 1 TSRMLS_CC );
582+
583+
efree(ustr);
584+
RETURN_FALSE;
585+
}
569586

570587
sub_str = NULL;
571588
status = U_ZERO_ERROR;
572589
intl_convert_utf16_to_utf8((char **)&sub_str, &sub_str_len, ustr + sub_str_start_pos, ( sub_str_end_pos - sub_str_start_pos ), &status);
573590

574591
efree( ustr );
575-
ubrk_close( bi );
576592

577593
if ( U_FAILURE( status ) ) {
578594
/* Set global error code. */

ext/intl/tests/bug62759.phpt

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
--TEST--
2+
Bug #62759: Buggy grapheme_substr() on edge case
3+
--SKIPIF--
4+
<?php if( !extension_loaded( 'intl' ) ) print 'skip'; ?>
5+
--FILE--
6+
<?php
7+
var_dump(substr('deja', 1, -4));
8+
var_dump(substr('deja', -1, 0));
9+
var_dump(grapheme_substr('deja', 1, -4));
10+
var_dump(intl_get_error_message());
11+
var_dump(grapheme_substr('deja', -1, 0));
12+
var_dump(grapheme_substr('déjà', 1, -4));
13+
var_dump(intl_get_error_message());
14+
var_dump(grapheme_substr('déjà', -1, 0));
15+
?>
16+
--EXPECT--
17+
bool(false)
18+
string(0) ""
19+
bool(false)
20+
string(61) "grapheme_substr: invalid parameters: U_ILLEGAL_ARGUMENT_ERROR"
21+
string(0) ""
22+
bool(false)
23+
string(65) "grapheme_substr: length is beyond start: U_ILLEGAL_ARGUMENT_ERROR"
24+
string(0) ""

0 commit comments

Comments
 (0)