Aloha,
Well we have waited long enough for a fix for re2c, but Johannes and I
(based on Scott's advice) have now decided that we can live with the
current hack that simply reverts to PHP 5.2 behavior (slower parsing,
only relevant for people not using a byte code cache) when re2c fails
to handle things. Derick is looking into this issue, so we might have
a fix in time.
As such I am only aware of the following critical issues:
- apply the integer parsing patch and fix the relevant tests (Please,
for the love of god, someone take care of this already) - random crashes in certain large scripts (Derick and hopefully
Dmitry are looking into that) - missing phar CLI tool on windows (Greg are you looking into this?)
- missing firebird and gmp extensions on windows (Pierre how are
things looking here?) - Upgrading README and general documentation updating (Philip how are
things looking there?)
There are some other todo's on the wiki:
http://wiki.php.net/todo/php53#rc3
- Fix static build of extension on windows when static is the default
and –enable-snapshot-build is used (Pierre) -
opendir()
fails on Windows directories with parent directory
unaccessible (Pierre) - very important for APC, about caching (stat cache or other) on win/
fcgi (Pierre) - Add
E_DEPRECATED
if session.bug_compat_42/warn is On (already
removed in HEAD) (Kalle) - update short_open_tag descriptions in php.ini-* as per this (Philip)
Would be nice obviously to get those fixed too.
We will release RC3 Thursday next week aka June 11th.
We will go into commit freeze on the evening of the 8th. However
please try to get things in by the 5th as we are hoping that RC3 could
become the golden stable release for 5.3.0. Lets not have some
seemingly harmless commit break things. It will result in either the
release date for RC3 slipping or having to do an RC4, both resulting
in a delayed final release.
regards,
Lukas Kahwe Smith
mls@pooteeweet.org
hi Lukas,
- missing firebird and gmp extensions on windows (Pierre how are things
looking here?)
GMP is present now, using MIPR instead of libgmp (no licensing issue).
I won't do anything more about firebird, I know that some people are
trying to get it build but I'm not too optimistic about the results.
- Fix static build of extension on windows when static is the default and
–enable-snapshot-build is used (Pierre)opendir()
fails on Windows directories with parent directory unaccessible
(Pierre)
This specific bug may not be fixed at this stage. However we have a
regression problem with the ACL patch added after RC2, we should be
ready with a fix in time as well.
Cheers,
Pierre
Lukas Kahwe Smith wrote:
Aloha,
Well we have waited long enough for a fix for re2c, but Johannes and I
(based on Scott's advice) have now decided that we can live with the
current hack that simply reverts to PHP 5.2 behavior (slower parsing,
only relevant for people not using a byte code cache) when re2c fails to
handle things. Derick is looking into this issue, so we might have a fix
in time.
I've been holding on to this patch until Derick can take a look at re2c to see if that would be a preferred fix, however here is my patch to make yyfill() realloc for the end-of-buffer scanning. This also fixes the ini scanner in the same fashion, and adds some length arguments for parsing functions.
diff --git a/Zend/zend_globals.h b/Zend/zend_globals.h
index efda001..833617f 100644
--- a/Zend/zend_globals.h
+++ b/Zend/zend_globals.h
@@ -271,6 +271,9 @@ struct _zend_ini_scanner_globals {
unsigned char *yy_limit;
int yy_state;
zend_stack state_stack;
-
unsigned char *buf;
-
unsigned char *buf_limit;
-
size_t buf_offset;
char *filename;
int lineno;
@@ -291,7 +294,10 @@ struct _zend_php_scanner_globals {
unsigned char *yy_limit;
int yy_state;
zend_stack state_stack;
-
unsigned char *buf;
-
unsigned char *buf_limit;
-
size_t buf_offset;
-
#ifdef ZEND_MULTIBYTE
/* original (unfiltered) script */
unsigned char *script_org;
diff --git a/Zend/zend_ini.h b/Zend/zend_ini.h
index 23e89da..6985924 100644
--- a/Zend/zend_ini.h
+++ b/Zend/zend_ini.h
@@ -197,7 +197,7 @@ END_EXTERN_C()
typedef void (*zend_ini_parser_cb_t)(zval *arg1, zval *arg2, zval *arg3, int callback_type, void *arg TSRMLS_DC);
BEGIN_EXTERN_C()
ZEND_API int zend_parse_ini_file(zend_file_handle *fh, zend_bool unbuffered_errors, int scanner_mode, zend_ini_parser_cb_t ini_parser_cb, void *arg TSRMLS_DC);
-ZEND_API int zend_parse_ini_string(char *str, zend_bool unbuffered_errors, int scanner_mode, zend_ini_parser_cb_t ini_parser_cb, void *arg TSRMLS_DC);
+ZEND_API int zend_parse_ini_string(char *str, int len, zend_bool unbuffered_errors, int scanner_mode, zend_ini_parser_cb_t ini_parser_cb, void *arg TSRMLS_DC);
END_EXTERN_C()/* INI entries */
diff --git a/Zend/zend_ini_parser.y b/Zend/zend_ini_parser.y
index 42e292e..c237581 100644
--- a/Zend/zend_ini_parser.y
+++ b/Zend/zend_ini_parser.y
@@ -218,7 +218,7 @@ ZEND_API int zend_parse_ini_file(zend_file_handle *fh, zend_bool unbuffered_erro/* {{{ zend_parse_ini_string()
*/
-ZEND_API int zend_parse_ini_string(char *str, zend_bool unbuffered_errors, int scanner_mode, zend_ini_parser_cb_t ini_parser_cb, void *arg TSRMLS_DC)
+ZEND_API int zend_parse_ini_string(char *str, int len, zend_bool unbuffered_errors, int scanner_mode, zend_ini_parser_cb_t ini_parser_cb, void *arg TSRMLS_DC)
{
int retval;
zend_ini_parser_param ini_parser_param;
@@ -227,7 +227,7 @@ ZEND_API int zend_parse_ini_string(char *str, zend_bool unbuffered_errors, int s
ini_parser_param.arg = arg;
CG(ini_parser_param) = &ini_parser_param;
- if (zend_ini_prepare_string_for_scanning(str, scanner_mode TSRMLS_CC) == FAILURE) {
- if (zend_ini_prepare_string_for_scanning(str, len, scanner_mode TSRMLS_CC) == FAILURE) {
return FAILURE;
}
diff --git a/Zend/zend_ini_scanner.h b/Zend/zend_ini_scanner.h
index cef499f..30b6103 100644
--- a/Zend/zend_ini_scanner.h
+++ b/Zend/zend_ini_scanner.h
@@ -30,7 +30,7 @@ BEGIN_EXTERN_C()
int zend_ini_scanner_get_lineno(TSRMLS_D);
char *zend_ini_scanner_get_filename(TSRMLS_D);
int zend_ini_open_file_for_scanning(zend_file_handle *fh, int scanner_mode TSRMLS_DC);
-int zend_ini_prepare_string_for_scanning(char *str, int scanner_mode TSRMLS_DC);
+int zend_ini_prepare_string_for_scanning(char *str, int len, int scanner_mode TSRMLS_DC);
int ini_lex(zval *ini_lval TSRMLS_DC);
void shutdown_ini_scanner(TSRMLS_D);
END_EXTERN_C()
diff --git a/Zend/zend_ini_scanner.l b/Zend/zend_ini_scanner.l
index 4485bec..33a0f10 100644
--- a/Zend/zend_ini_scanner.l
+++ b/Zend/zend_ini_scanner.l
@@ -37,9 +37,7 @@
#include "zend_ini_scanner_defs.h"
#define YYCTYPE unsigned char
-/* allow the scanner to read one null byte after the end of the string (from ZEND_MMAP_AHEAD)
-
- so that if will be able to terminate to match the current token (e.g. non-enclosed string) /
-#define YYFILL(n) { if (YYCURSOR > YYLIMIT) return 0; }
+#define YYFILL(n) { if ((YYCURSOR + n) >= YYLIMIT) yy_fill(n); }
#define YYCURSOR SCNG(yy_cursor)
#define YYLIMIT SCNG(yy_limit)
#define YYMARKER SCNG(yy_marker)
@@ -57,13 +55,6 @@
#define yyless(x) YYCURSOR = yytext + x
/ #define yymore() goto yymore_restart */
- so that if will be able to terminate to match the current token (e.g. non-enclosed string) /
-/* perform sanity check. If this message is triggered you should
- increase the ZEND_MMAP_AHEAD value in the zend_streams.h file /
-/!max:re2c */
-#if ZEND_MMAP_AHEAD < (YYMAXFILL + 1)
-# error ZEND_MMAP_AHEAD should be greater than YYMAXFILL
-#endif
/* How it works (for the core ini directives):
- ===========================================
@@ -129,6 +120,47 @@ ZEND_API zend_ini_scanner_globals ini_scanner_globals;
return type;
}
+/*!max:re2c / / Define YYMAXFILL */
+static void yy_fill(int size) {
- int fill;
- int len;
- unsigned char* buf;
- unsigned char* start = NULL;
- if (SCNG(buf)) {
-
if ((YYCURSOR + size) >= SCNG(buf_limit)) {
-
zend_error_noreturn(E_COMPILE_ERROR, "Attempted to scan past EOF, possible non-terminated scanner expression.");
-
} else {
-
return;
-
}
- }
- fill = YYMAXFILL +1;
- if (YYMARKER) {
-
start = YYMARKER;
- }
- if (!start || SCNG(yy_text) < start) {
-
start = SCNG(yy_text);
- }
- len = (YYLIMIT - start);
- buf = ecalloc(1, len + fill);
- memcpy(buf, start, len);
- SCNG(buf) = buf;
- SCNG(buf_limit) = buf + len + fill;
- SCNG(buf_offset) = start - SCNG(yy_start);
- SCNG(yy_start) = buf;
- YYCURSOR = buf + (YYCURSOR-start);
- SCNG(yy_text) = buf + ((unsigned char*)yytext - start);
- YYLIMIT = buf + len;
- if (YYMARKER) {
-
YYMARKER = buf;
- }
+}
-
static void _yy_push_state(int new_state TSRMLS_DC)
{
zend_stack_push(&SCNG(state_stack), (void *) &YYGETCONDITION(), sizeof(int));
@@ -161,6 +193,10 @@ static void init_ini_scanner(TSRMLS_D)
SCNG(lineno) = 1;
SCNG(scanner_mode) = ZEND_INI_SCANNER_NORMAL;
zend_stack_init(&SCNG(state_stack)); -
SCNG(buf) = NULL;
-
SCNG(buf_limit) = NULL;
-
SCNG(buf_offset) = 0;
-
SCNG(yy_marker) = NULL;
BEGIN(INITIAL);
}
/* }}} */
@@ -170,6 +206,9 @@ static void init_ini_scanner(TSRMLS_D)
void shutdown_ini_scanner(TSRMLS_D)
{
zend_stack_destroy(&SCNG(state_stack)); -
if (SCNG(buf)) {
-
efree(SCNG(buf));
-
}
if (ini_filename) {
free(ini_filename);
}
@@ -214,10 +253,8 @@ int zend_ini_open_file_for_scanning(zend_file_handle *fh, int scanner_mode TSRML/* {{{ zend_ini_prepare_string_for_scanning()
*/
-int zend_ini_prepare_string_for_scanning(char *str, int scanner_mode TSRMLS_DC)
+int zend_ini_prepare_string_for_scanning(char *str, int len, int scanner_mode TSRMLS_DC)
{
- int len = strlen(str);
- init_ini_scanner(TSRMLS_C);
SCNG(scanner_mode) = scanner_mode;
SCNG(yy_in) = NULL;
@@ -481,7 +518,23 @@ DOUBLE_QUOTES_CHARS ([^$"\]|("\"[^"])|{LITERAL_DOLLAR}|"\"["][^\r\n])
return END_OF_LINE;
}
-<INITIAL,ST_VALUE,ST_RAW>{TABS_AND_SPACES}[;][^\r\n]{NEWLINE} { /* Comment /
+<INITIAL,ST_VALUE,ST_RAW>{TABS_AND_SPACES}[;] { /* Comment */
-
while (YYCURSOR < YYLIMIT) {
-
switch (*YYCURSOR++) {
-
case '\r':
-
if (YYCURSOR < YYLIMIT && *YYCURSOR == '\n') {
-
YYCURSOR++;
-
}
-
/* fall through */
-
case '\n':
-
break;
-
default:
-
continue;
-
}
-
break;
-
}
-
BEGIN(INITIAL);
SCNG(lineno)++;
return END_OF_LINE;
diff --git a/Zend/zend_language_scanner.h b/Zend/zend_language_scanner.h
index e75f54b..c81c64f 100644
--- a/Zend/zend_language_scanner.h
+++ b/Zend/zend_language_scanner.h
@@ -31,6 +31,9 @@ typedef struct _zend_lex_state {
unsigned char *yy_limit;
int yy_state;
zend_stack state_stack; -
unsigned char *buf;
-
unsigned char *buf_limit;
-
size_t buf_offset;
zend_file_handle *in;
uint lineno;
diff --git a/Zend/zend_language_scanner.l b/Zend/zend_language_scanner.l
index 23c06a0..689bde8 100644
--- a/Zend/zend_language_scanner.l
+++ b/Zend/zend_language_scanner.l
@@ -48,7 +48,7 @@
#include "tsrm_config_common.h"
#define YYCTYPE unsigned char
-#define YYFILL(n) { if ((YYCURSOR + n) >= (YYLIMIT + ZEND_MMAP_AHEAD)) { return 0; } }
+#define YYFILL(n) { if ((YYCURSOR + n) >= YYLIMIT) yy_fill(n); }
#define YYCURSOR SCNG(yy_cursor)
#define YYLIMIT SCNG(yy_limit)
#define YYMARKER SCNG(yy_marker)
@@ -67,13 +67,6 @@
yyleng = (unsigned int)x; } while(0)
#define yymore() goto yymore_restart
-/* perform sanity check. If this message is triggered you should
-
increase the ZEND_MMAP_AHEAD value in the zend_streams.h file /
-/!max:re2c */
-#if ZEND_MMAP_AHEAD < YYMAXFILL
-# error ZEND_MMAP_AHEAD should be greater than or equal to YYMAXFILL
-#endif -
#ifdef HAVE_STDARG_H
include <stdarg.h>
#endif
@@ -120,6 +113,47 @@ do { \BEGIN_EXTERN_C()
+/*!max:re2c / / Define YYMAXFILL */
+static void yy_fill(int size) {
- int fill;
- int len;
- unsigned char* buf;
- unsigned char* start = NULL;
- if (SCNG(buf)) {
-
if ((YYCURSOR + size) >= SCNG(buf_limit)) {
-
zend_error_noreturn(E_COMPILE_ERROR, "Attempted to scan past EOF, possible non-terminated scanner expression.");
-
} else {
-
return;
-
}
- }
- fill = YYMAXFILL +1;
- if (YYMARKER) {
-
start = YYMARKER;
- }
- if (!start || SCNG(yy_text) < start) {
-
start = SCNG(yy_text);
- }
- len = (YYLIMIT - start);
- buf = ecalloc(1, len + fill);
- memcpy(buf, start, len);
- SCNG(buf) = buf;
- SCNG(buf_limit) = buf + len + fill;
- SCNG(buf_offset) = start - SCNG(yy_start);
- SCNG(yy_start) = buf;
- YYCURSOR = buf + (YYCURSOR-start);
- SCNG(yy_text) = buf + ((unsigned char*)yytext - start);
- YYLIMIT = buf + len;
- if (YYMARKER) {
-
YYMARKER = buf;
- }
+}
- static void _yy_push_state(int new_state TSRMLS_DC)
{
zend_stack_push(&SCNG(state_stack), (void *) &YYGETCONDITION(), sizeof(int));
@@ -150,6 +184,9 @@ void startup_scanner(TSRMLS_D)
CG(doc_comment) = NULL;
CG(doc_comment_len) = 0;
zend_stack_init(&SCNG(state_stack)); - SCNG(buf) = NULL;
- SCNG(buf_limit) = NULL;
- SCNG(buf_offset) = 0;
}
void shutdown_scanner(TSRMLS_D)
@@ -159,6 +196,9 @@ void shutdown_scanner(TSRMLS_D)
CG(heredoc_len)=0;
}
zend_stack_destroy(&SCNG(state_stack));
- if (SCNG(buf)) {
-
efree(SCNG(buf));
- }
RESET_DOC_COMMENT();
}
@@ -174,6 +214,9 @@ ZEND_API void zend_save_lexical_state(zend_lex_state *lex_state TSRMLS_DC)
lex_state->state_stack = SCNG(state_stack);
zend_stack_init(&SCNG(state_stack));
- lex_state->buf = SCNG(buf);
- lex_state->buf_limit = SCNG(buf_limit);
- lex_state->buf_offset = SCNG(buf_offset);
lex_state->in = SCNG(yy_in);
lex_state->yy_state = YYSTATE;
lex_state->filename = zend_get_compiled_filename(TSRMLS_C);
@@ -203,7 +246,12 @@ ZEND_API void zend_restore_lexical_state(zend_lex_state *lex_state TSRMLS_DC)
zend_stack_destroy(&SCNG(state_stack));
SCNG(state_stack) = lex_state->state_stack;
- SCNG(yy_in) = lex_state->in;
- if (SCNG(buf)) {
-
efree(SCNG(buf));
- }
- SCNG(buf) = lex_state->buf;
- SCNG(buf_limit) = lex_state->buf_limit;
- SCNG(buf_offset) = lex_state->buf_offset;
YYSETCONDITION(lex_state->yy_state);
CG(zend_lineno) = lex_state->lineno;
zend_restore_compiled_filename(lex_state->filename TSRMLS_CC);
@@ -407,11 +455,6 @@ zend_op_array *compile_filename(int type, zval *filename TSRMLS_DC)
ZEND_API int zend_prepare_string_for_scanning(zval *str, char *filename TSRMLS_DC)
{
-
/* enforce two trailing NULLs for flex... */
-
str->value.str.val = safe_erealloc(str->value.str.val, 1, str->value.str.len, ZEND_MMAP_AHEAD);
-
memset(str->value.str.val + str->value.str.len, 0, ZEND_MMAP_AHEAD);
-
SCNG(yy_in)=NULL;
#ifdef ZEND_MULTIBYTE
@@ -442,7 +485,7 @@ ZEND_API int zend_prepare_string_for_scanning(zval *str, char *filename TSRMLS_DZEND_API size_t zend_get_scanned_file_offset(TSRMLS_D)
{ -
size_t offset = SCNG(yy_cursor) - SCNG(yy_start);
- size_t offset = SCNG(yy_cursor) - SCNG(yy_start) + SCNG(buf_offset);
#ifdef ZEND_MULTIBYTE
if (SCNG(input_filter)) {
size_t original_offset = offset, length = 0; do {
@@ -1680,7 +1723,7 @@ inline_html:
while (YYCURSOR < YYLIMIT) {
switch (*YYCURSOR++) {
case '\r':
-
if (*YYCURSOR == '\n') {
-
if (YYCURSOR < YYLIMIT && *YYCURSOR == '\n') { YYCURSOR++; } /* fall through */
@@ -2071,7 +2114,7 @@ double_quotes_scan_done:
while (YYCURSOR < YYLIMIT) {
switch (*YYCURSOR++) {
case '\r':
-
if (*YYCURSOR == '\n') {
-
if (YYCURSOR < YYLIMIT && *YYCURSOR == '\n') { YYCURSOR++; } /* fall through */
@@ -2143,7 +2186,7 @@ heredoc_scan_done:
while (YYCURSOR < YYLIMIT) {
switch (*YYCURSOR++) {
case '\r':
-
if (*YYCURSOR == '\n') {
-
if (YYCURSOR < YYLIMIT && *YYCURSOR == '\n') { YYCURSOR++; } /* fall through */
diff --git a/Zend/zend_stream.c b/Zend/zend_stream.c
index 7befee8..6dd1a83 100644
--- a/Zend/zend_stream.c
+++ b/Zend/zend_stream.c
@@ -29,9 +29,6 @@
#include <sys/stat.h>
#if HAVE_SYS_MMAN_H
include <sys/mman.h>
-# ifndef PAGE_SIZE
-# define PAGE_SIZE 4096
-# endif
#endif
ZEND_DLIMPORT int isatty(int fd);
@@ -215,11 +212,9 @@ ZEND_API int zend_stream_fixup(zend_file_handle *file_handle, char **buf, size_t
if (old_type == ZEND_HANDLE_FP && !file_handle->handle.stream.isatty && size) {
#if HAVE_MMAP
-
if (file_handle->handle.fp &&
-
size != 0 &&
-
((size - 1) % PAGE_SIZE) <= PAGE_SIZE - ZEND_MMAP_AHEAD) {
-
if (file_handle->handle.fp) { /* *buf[size] is zeroed automatically by the kernel */
-
*buf = mmap(0, size + ZEND_MMAP_AHEAD, PROT_READ, MAP_PRIVATE, fileno(file_handle->handle.fp), 0);
-
*buf = mmap(0, size, PROT_READ, MAP_PRIVATE, fileno(file_handle->handle.fp), 0); if (*buf != MAP_FAILED) { long offset = ftell(file_handle->handle.fp); file_handle->handle.stream.mmap.map = *buf;
@@ -236,7 +231,7 @@ ZEND_API int zend_stream_fixup(zend_file_handle *file_handle, char **buf, size_t
}
#endif
file_handle->handle.stream.mmap.map = 0;
-
file_handle->handle.stream.mmap.buf = *buf = safe_emalloc(1, size, ZEND_MMAP_AHEAD);
-
} else {file_handle->handle.stream.mmap.buf = *buf = safe_emalloc(1, size, 0); file_handle->handle.stream.mmap.len = zend_stream_read(file_handle, *buf, size TSRMLS_CC);
size_t read, remain = 4*1024;
@@ -254,21 +249,9 @@ ZEND_API int zend_stream_fixup(zend_file_handle *file_handle, char **buf, size_t
}
file_handle->handle.stream.mmap.map = 0;
file_handle->handle.stream.mmap.len = size;
-
if (size && remain < ZEND_MMAP_AHEAD) {
-
*buf = safe_erealloc(*buf, size, 1, ZEND_MMAP_AHEAD);
-
}
-
file_handle->handle.stream.mmap.buf = *buf;
-
}
-
if (file_handle->handle.stream.mmap.len == 0) {
-
*buf = erealloc(*buf, ZEND_MMAP_AHEAD); file_handle->handle.stream.mmap.buf = *buf;
}
-
if (ZEND_MMAP_AHEAD) {
-
memset(file_handle->handle.stream.mmap.buf + file_handle->handle.stream.mmap.len, 0, ZEND_MMAP_AHEAD);
-
}
-
return_mapped:
file_handle->type = ZEND_HANDLE_MAPPED;
file_handle->handle.stream.mmap.pos = 0;
diff --git a/Zend/zend_stream.h b/Zend/zend_stream.h
index 9c9bdef..9e51419 100644
--- a/Zend/zend_stream.h
+++ b/Zend/zend_stream.h
@@ -31,8 +31,6 @@ typedef size_t (zend_stream_fsizer_t)(void handle TSRMLS_DC);
typedef size_t (zend_stream_reader_t)(void handle, char *buf, size_t len TSRMLS_DC);
typedef void (zend_stream_closer_t)(void handle TSRMLS_DC);
-#define ZEND_MMAP_AHEAD 32
typedef enum {
ZEND_HANDLE_FILENAME,
ZEND_HANDLE_FD,
diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c
index cb886ee..f3186a7 100644
--- a/ext/standard/basic_functions.c
+++ b/ext/standard/basic_functions.c
@@ -5966,12 +5966,11 @@ PHP_FUNCTION(parse_ini_string)
}
/* Setup string */
- string = (char *) emalloc(str_len + ZEND_MMAP_AHEAD);
- string = (char *) emalloc(str_len);
memcpy(string, str, str_len);
-
memset(string + str_len, 0, ZEND_MMAP_AHEAD);
array_init(return_value);
-
if (zend_parse_ini_string(string, 0, scanner_mode, ini_parser_cb, return_value TSRMLS_CC) == FAILURE) {
- if (zend_parse_ini_string(string, str_len, 0, scanner_mode, ini_parser_cb, return_value TSRMLS_CC) == FAILURE) {
zend_hash_destroy(Z_ARRVAL_P(return_value));
efree(Z_ARRVAL_P(return_value));
RETVAL_FALSE;
diff --git a/main/main.c b/main/main.c
index 22bc86b..b791042 100644
--- a/main/main.c
+++ b/main/main.c
@@ -90,13 +90,6 @@
#include "SAPI.h"
#include "rfc1867.h"
-#if HAVE_SYS_MMAN_H
-# include <sys/mman.h>
-# ifndef PAGE_SIZE
-# define PAGE_SIZE 4096
-# endif
-#endif
#ifdef PHP_WIN32
define PAGE_SIZE 4096
#endif
@@ -1147,9 +1140,7 @@ PHPAPI int php_stream_open_for_zend_ex(const char *filename, zend_file_handle h
/ can we mmap immeadiately? */
memset(&handle->handle.stream.mmap, 0, sizeof(handle->handle.stream.mmap));
len = php_zend_stream_fsizer(stream TSRMLS_CC);
-
if (len != 0
-
&& ((len - 1) % PAGE_SIZE) <= PAGE_SIZE - ZEND_MMAP_AHEAD
-
&& php_stream_mmap_possible(stream)
-
if (php_stream_mmap_possible(stream) && (p = php_stream_mmap_range(stream, 0, len, PHP_STREAM_MAP_MODE_SHARED_READONLY, &mapped_len)) != NULL) { handle->handle.stream.closer = php_zend_stream_mmap_closer; handle->handle.stream.mmap.buf = p;
diff --git a/main/php_ini.c b/main/php_ini.c
index aa3afaa..cc57043 100644
--- a/main/php_ini.c
+++ b/main/php_ini.c
@@ -698,7 +698,7 @@ int php_init_config(TSRMLS_D)
if (sapi_module.ini_entries) {
/* Reset active ini section */
RESET_ACTIVE_INI_HASH();
-
zend_parse_ini_string(sapi_module.ini_entries, 1, ZEND_INI_SCANNER_NORMAL, (zend_ini_parser_cb_t) php_ini_parser_cb, &configuration_hash TSRMLS_CC);
-
zend_parse_ini_string(sapi_module.ini_entries, strlen(sapi_module.ini_entries), 1, ZEND_INI_SCANNER_NORMAL, (zend_ini_parser_cb_t) php_ini_parser_cb, &configuration_hash TSRMLS_CC);
}
return SUCCESS;
Hi Lukas,
----- Original Message -----
From: "Lukas Kahwe Smith"
Sent: Wednesday, June 03, 2009
Aloha,
Well we have waited long enough for a fix for re2c, but Johannes and I
(based on Scott's advice) have now decided that we can live with the
current hack that simply reverts to PHP 5.2 behavior (slower parsing,
only relevant for people not using a byte code cache) when re2c fails to
handle things. Derick is looking into this issue, so we might have a fix
in time.As such I am only aware of the following critical issues:
- apply the integer parsing patch and fix the relevant tests (Please,
for the love of god, someone take care of this already)
:-O
Well that's done now! :-) I'm sure a couple more tests will need updating
that I missed, but other than that...
- Matt