Index: Zend/zend_strtod.c =================================================================== RCS file: /repository/ZendEngine2/zend_strtod.c,v retrieving revision 1.17.2.2.2.8 diff -u -p -d -r1.17.2.2.2.8 zend_strtod.c --- Zend/zend_strtod.c 19 Apr 2007 09:30:49 -0000 1.17.2.2.2.8 +++ Zend/zend_strtod.c 19 Apr 2007 19:00:57 -0000 @@ -2604,6 +2604,34 @@ ZEND_API double zend_hex_strtod(const ch return value; } +ZEND_API double zend_oct_strtod(const char *str, char **endptr) +{ + const char *s = str; + char c; + double value = 0; + int any = 0; + + /* skip leading zero */ + s++; + + while ((c = *s++)) { + if (c > '7') { + /* break and return the current value if the number is not well-formed + * that's what Linux strtol() does + */ + break; + } + value = value * 8 + c - '0'; + any = 1; + } + + if (endptr != NULL) { + *endptr = (char *)(any ? s - 1 : str); + } + + return value; +} + /* * Local variables: * tab-width: 4 Index: Zend/zend_strtod.h =================================================================== RCS file: /repository/ZendEngine2/zend_strtod.h,v retrieving revision 1.3.2.1.2.3 diff -u -p -d -r1.3.2.1.2.3 zend_strtod.h --- Zend/zend_strtod.h 1 Jan 2007 09:35:47 -0000 1.3.2.1.2.3 +++ Zend/zend_strtod.h 19 Apr 2007 19:00:57 -0000 @@ -29,6 +29,7 @@ ZEND_API void zend_freedtoa(char *s); ZEND_API char * zend_dtoa(double _d, int mode, int ndigits, int *decpt, int *sign, char **rve); ZEND_API double zend_strtod(const char *s00, char **se); ZEND_API double zend_hex_strtod(const char *str, char **endptr); +ZEND_API double zend_oct_strtod(const char *str, char **endptr); ZEND_API int zend_startup_strtod(void); ZEND_API int zend_shutdown_strtod(void); END_EXTERN_C() Index: Zend/zend_language_scanner.l =================================================================== RCS file: /repository/ZendEngine2/zend_language_scanner.l,v retrieving revision 1.131.2.11.2.9 diff -u -p -d -r1.131.2.11.2.9 zend_language_scanner.l --- Zend/zend_language_scanner.l 24 Feb 2007 02:17:23 -0000 1.131.2.11.2.9 +++ Zend/zend_language_scanner.l 19 Apr 2007 19:00:57 -0000 @@ -1247,7 +1247,11 @@ NEWLINE ("\r"|"\n"|"\r\n") errno = 0; zendlval->value.lval = strtol(yytext, NULL, 0); if (errno == ERANGE) { /* Overflow */ - zendlval->value.dval = zend_strtod(yytext, NULL); + if (yytext[0] == '0') { /* octal overflow */ + zendlval->value.dval = zend_oct_strtod(yytext, NULL); + } else { + zendlval->value.dval = zend_strtod(yytext, NULL); + } zendlval->type = IS_DOUBLE; return T_DNUMBER; }