@@ -434,6 +434,7 @@ PHP_FUNCTION(grapheme_substr)
434
434
grapheme_substr_ascii ((char * )str , str_len , start , length , ZEND_NUM_ARGS (), (char * * ) & sub_str , & sub_str_len );
435
435
436
436
if ( NULL == sub_str ) {
437
+ intl_error_set ( NULL , U_ILLEGAL_ARGUMENT_ERROR , "grapheme_substr: invalid parameters" , 1 TSRMLS_CC );
437
438
RETURN_FALSE ;
438
439
}
439
440
@@ -530,6 +531,15 @@ PHP_FUNCTION(grapheme_substr)
530
531
RETURN_STRINGL (((char * )sub_str ), sub_str_len , 0 );
531
532
}
532
533
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
+
533
543
/* find the end point of the string to return */
534
544
535
545
if ( length < 0 ) {
@@ -554,25 +564,31 @@ PHP_FUNCTION(grapheme_substr)
554
564
length += iter_val ;
555
565
}
556
566
567
+ ubrk_close (bi );
568
+
557
569
if ( UBRK_DONE == sub_str_end_pos ) {
558
570
if (length < 0 ) {
559
-
560
571
intl_error_set ( NULL , U_ILLEGAL_ARGUMENT_ERROR , "grapheme_substr: length not contained in string" , 1 TSRMLS_CC );
561
572
562
573
efree (ustr );
563
- ubrk_close (bi );
564
574
RETURN_FALSE ;
565
575
} else {
566
576
sub_str_end_pos = ustr_len ;
567
577
}
568
578
}
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
+ }
569
586
570
587
sub_str = NULL ;
571
588
status = U_ZERO_ERROR ;
572
589
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 );
573
590
574
591
efree ( ustr );
575
- ubrk_close ( bi );
576
592
577
593
if ( U_FAILURE ( status ) ) {
578
594
/* Set global error code. */
0 commit comments