@@ -587,6 +587,34 @@ typedef enum {
587587 ZEND_INI_PARSE_QUANTITY_UNSIGNED ,
588588} zend_ini_parse_quantity_signed_result_t ;
589589
590+ static const char * zend_ini_consume_quantity_prefix (const char * const digits , const char * const str_end ) {
591+ const char * digits_consumed = digits ;
592+ /* Ignore leading whitespace. */
593+ while (digits_consumed < str_end && zend_is_whitespace (* digits_consumed )) {++ digits_consumed ;}
594+ if (digits_consumed [0 ] == '+' || digits_consumed [0 ] == '-' ) {
595+ ++ digits_consumed ;
596+ }
597+
598+ if (digits_consumed [0 ] == '0' && !isdigit (digits_consumed [1 ])) {
599+ /* Value is just 0 */
600+ if ((digits_consumed + 1 ) == str_end ) {
601+ return digits ;
602+ }
603+
604+ switch (digits_consumed [1 ]) {
605+ case 'x' :
606+ case 'X' :
607+ case 'o' :
608+ case 'O' :
609+ case 'b' :
610+ case 'B' :
611+ digits_consumed += 2 ;
612+ break ;
613+ }
614+ }
615+ return digits_consumed ;
616+ }
617+
590618static zend_ulong zend_ini_parse_quantity_internal (zend_string * value , zend_ini_parse_quantity_signed_result_t signed_result , zend_string * * errstr ) /* {{{ */
591619{
592620 char * digits_end = NULL ;
@@ -674,6 +702,18 @@ static zend_ulong zend_ini_parse_quantity_internal(zend_string *value, zend_ini_
674702 smart_str_append_escaped (& invalid , ZSTR_VAL (value ), ZSTR_LEN (value ));
675703 smart_str_0 (& invalid );
676704
705+ * errstr = zend_strpprintf (0 , "Invalid quantity \"%s\": no digits after base prefix, interpreting as \"0\" for backwards compatibility" ,
706+ ZSTR_VAL (invalid .s ));
707+
708+ smart_str_free (& invalid );
709+ return 0 ;
710+ }
711+ if (UNEXPECTED (digits != zend_ini_consume_quantity_prefix (digits , str_end ))) {
712+ /* Escape the string to avoid null bytes and to make non-printable chars
713+ * visible */
714+ smart_str_append_escaped (& invalid , ZSTR_VAL (value ), ZSTR_LEN (value ));
715+ smart_str_0 (& invalid );
716+
677717 * errstr = zend_strpprintf (0 , "Invalid quantity \"%s\": no digits after base prefix, interpreting as \"0\" for backwards compatibility" ,
678718 ZSTR_VAL (invalid .s ));
679719
0 commit comments