diff options
Diffstat (limited to 'dev-php/php-cgi/files/php4.3.11-session_save_path-segf.patch')
-rw-r--r-- | dev-php/php-cgi/files/php4.3.11-session_save_path-segf.patch | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/dev-php/php-cgi/files/php4.3.11-session_save_path-segf.patch b/dev-php/php-cgi/files/php4.3.11-session_save_path-segf.patch new file mode 100644 index 000000000000..3836776b14b4 --- /dev/null +++ b/dev-php/php-cgi/files/php4.3.11-session_save_path-segf.patch @@ -0,0 +1,154 @@ +--- sapi/apache2handler/sapi_apache2.c 2005-03-10 12:39:04.000000000 +0100 ++++ sapi/apache2handler/sapi_apache2.c 2005-10-26 16:02:03.000000000 +0200 +@@ -18,7 +18,7 @@ + +----------------------------------------------------------------------+ + */ + +-/* $Id: sapi_apache2.c,v 1.1.2.39 2005/03/10 11:39:04 jorton Exp $ */ ++/* $Id: sapi_apache2.c,v 1.1.2.40.2.5 2005/10/12 21:41:36 tony2001 Exp $ */ + + #include <fcntl.h> + +@@ -268,23 +268,18 @@ + TSRMLS_FETCH(); + + ctx = SG(server_context); +- +- /* We use APLOG_STARTUP because it keeps us from printing the +- * data and time information at the beginning of the error log +- * line. Not sure if this is correct, but it mirrors what happens +- * with Apache 1.3 -- rbb +- */ ++ + if (ctx == NULL) { /* we haven't initialized our ctx yet, oh well */ + ap_log_error(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, 0, NULL, "%s", msg); + } else { +- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, 0, ctx->r, "%s", msg); ++ ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, ctx->r, "%s", msg); + } + } + + static void php_apache_sapi_log_message_ex(char *msg, request_rec *r) + { + if (r) { +- ap_log_rerror(APLOG_MARK, APLOG_ERR | APLOG_STARTUP, 0, r, msg, r->filename); ++ ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r, msg, r->filename); + } else { + php_apache_sapi_log_message(msg); + } +@@ -458,15 +453,34 @@ + request_rec *parent_req = NULL; + TSRMLS_FETCH(); + ++#define PHPAP_INI_OFF \ ++ if (strcmp(r->protocol, "INCLUDED")) { \ ++ zend_try { zend_ini_deactivate(TSRMLS_C); } zend_end_try(); \ ++ } \ ++ + conf = ap_get_module_config(r->per_dir_config, &php4_module); ++ ++ /* apply_config() needs r in some cases, so allocate server_context early */ ++ ctx = SG(server_context); ++ if (ctx == NULL) { ++ ctx = SG(server_context) = apr_pcalloc(r->pool, sizeof(*ctx)); ++ /* register a cleanup so we clear out the SG(server_context) ++ * after each request. Note: We pass in the pointer to the ++ * server_context in case this is handled by a different thread. ++ */ ++ apr_pool_cleanup_register(r->pool, (void *)&SG(server_context), php_server_context_cleanup, apr_pool_cleanup_null); ++ ctx->r = r; ++ ctx = NULL; /* May look weird to null it here, but it is to catch the right case in the first_try later on */ ++ } else { ++ parent_req = ctx->r; ++ ctx->r = r; ++ } + apply_config(conf); + + if (strcmp(r->handler, PHP_MAGIC_TYPE) && strcmp(r->handler, PHP_SOURCE_MAGIC_TYPE) && strcmp(r->handler, PHP_SCRIPT)) { + /* Check for xbithack in this case. */ + if (!AP2(xbithack) || strcmp(r->handler, "text/html") || !(r->finfo.protection & APR_UEXECUTE)) { +- zend_try { +- zend_ini_deactivate(TSRMLS_C); +- } zend_end_try(); ++ PHPAP_INI_OFF; + return DECLINED; + } + } +@@ -475,32 +489,24 @@ + * the configuration; default behaviour is to accept. */ + if (r->used_path_info == AP_REQ_REJECT_PATH_INFO + && r->path_info && r->path_info[0]) { +- zend_try { +- zend_ini_deactivate(TSRMLS_C); +- } zend_end_try(); ++ PHPAP_INI_OFF; + return HTTP_NOT_FOUND; + } + + /* handle situations where user turns the engine off */ + if (!AP2(engine)) { +- zend_try { +- zend_ini_deactivate(TSRMLS_C); +- } zend_end_try(); ++ PHPAP_INI_OFF; + return DECLINED; + } + + if (r->finfo.filetype == 0) { + php_apache_sapi_log_message_ex("script '%s' not found or unable to stat", r); +- zend_try { +- zend_ini_deactivate(TSRMLS_C); +- } zend_end_try(); ++ PHPAP_INI_OFF; + return HTTP_NOT_FOUND; + } + if (r->finfo.filetype == APR_DIR) { + php_apache_sapi_log_message_ex("attempt to invoke directory '%s' as script", r); +- zend_try { +- zend_ini_deactivate(TSRMLS_C); +- } zend_end_try(); ++ PHPAP_INI_OFF; + return HTTP_FORBIDDEN; + } + +@@ -516,24 +522,30 @@ + + zend_first_try { + +- ctx = SG(server_context); + if (ctx == NULL) { +- ctx = SG(server_context) = apr_pcalloc(r->pool, sizeof(*ctx)); +- /* register a cleanup so we clear out the SG(server_context) +- * after each request. Note: We pass in the pointer to the +- * server_context in case this is handled by a different thread. +- */ +- apr_pool_cleanup_register(r->pool, (void *)&SG(server_context), php_server_context_cleanup, apr_pool_cleanup_null); +- +- ctx->r = r; ++normal: + brigade = apr_brigade_create(r->pool, r->connection->bucket_alloc); ++ ctx = SG(server_context); + ctx->brigade = brigade; + + if (php_apache_request_ctor(r, ctx TSRMLS_CC)!=SUCCESS) { + zend_bailout(); + } + } else { +- parent_req = ctx->r; ++ if (!parent_req) { ++ parent_req = ctx->r; ++ } ++ if (parent_req && strcmp(parent_req->handler, PHP_MAGIC_TYPE) && strcmp(parent_req->handler, PHP_SOURCE_MAGIC_TYPE) && strcmp(parent_req->handler, PHP_SCRIPT)) { ++ if (php_apache_request_ctor(r, ctx TSRMLS_CC)!=SUCCESS) { ++ zend_bailout(); ++ } ++ } ++ ++ /* check if comming due to ErrorDocument */ ++ if (parent_req && parent_req->status != HTTP_OK) { ++ parent_req = NULL; ++ goto normal; ++ } + ctx->r = r; + brigade = ctx->brigade; + } |