@@ -1820,25 +1820,32 @@ NEWLINE ("\r"|"\n"|"\r\n")
1820
1820
zend_bool is_octal = lnum[0 ] == ' 0' ;
1821
1821
zend_bool contains_underscores = (memchr (lnum, ' _' , len) != NULL );
1822
1822
1823
+ if (contains_underscores) {
1824
+ lnum = estrndup (lnum, len);
1825
+ strip_underscores (lnum, &len);
1826
+ }
1827
+
1823
1828
/* Digits 8 and 9 are illegal in octal literals. */
1824
1829
if (is_octal) {
1825
1830
size_t i;
1826
1831
for (i = 0 ; i < len; i++) {
1827
1832
if (lnum[i] == ' 8' || lnum[i] == ' 9' ) {
1828
1833
zend_throw_exception (zend_ce_parse_error, " Invalid numeric literal" , 0 );
1829
- ZVAL_UNDEF (zendlval);
1830
1834
if (PARSER_MODE ()) {
1835
+ if (contains_underscores) {
1836
+ efree (lnum);
1837
+ }
1838
+ ZVAL_UNDEF (zendlval);
1831
1839
RETURN_TOKEN (T_ERROR);
1832
1840
}
1833
- RETURN_TOKEN_WITH_VAL (T_LNUMBER);
1841
+
1842
+ /* Continue in order to determine if this is T_LNUMBER or T_DNUMBER. */
1843
+ len = i;
1844
+ break ;
1834
1845
}
1835
1846
}
1836
1847
}
1837
1848
1838
- if (contains_underscores) {
1839
- lnum = estrndup (lnum, len);
1840
- strip_underscores (lnum, &len);
1841
- }
1842
1849
1843
1850
if (len < MAX_LENGTH_OF_LONG - 1 ) { /* Won't overflow */
1844
1851
errno = 0 ;
@@ -1850,7 +1857,7 @@ NEWLINE ("\r"|"\n"|"\r\n")
1850
1857
ZVAL_LONG (zendlval, ZEND_STRTOL (lnum, &end, 0 ));
1851
1858
if (errno == ERANGE) { /* Overflow */
1852
1859
errno = 0 ;
1853
- if (lnum[ 0 ] == ' 0 ' ) { /* octal overflow */
1860
+ if (is_octal ) { /* octal overflow */
1854
1861
ZVAL_DOUBLE (zendlval, zend_oct_strtod (lnum, (const char **)&end));
1855
1862
} else {
1856
1863
ZVAL_DOUBLE (zendlval, zend_strtod (lnum, (const char **)&end));
0 commit comments