dmitry          Thu Jul 10 11:36:50 2008 UTC

  Modified files:              (Branch: PHP_5_3)
    /php-src/ext/phar   func_interceptors.c func_interceptors.h phar.c 
                        phar_internal.h 
  Log:
  Extensions MUST NOT manipulate with internal functions from 
EG(function_table) in run-time. It may cause problems with opcode caches and in 
multi-threaded environment. Now the same functions are overriden at MINIT and 
call original functions or PHAR ones dependent on flag setting.
  
  
http://cvs.php.net/viewvc.cgi/php-src/ext/phar/func_interceptors.c?r1=1.20.2.7&r2=1.20.2.8&diff_format=u
Index: php-src/ext/phar/func_interceptors.c
diff -u php-src/ext/phar/func_interceptors.c:1.20.2.7 
php-src/ext/phar/func_interceptors.c:1.20.2.8
--- php-src/ext/phar/func_interceptors.c:1.20.2.7       Sat Jun 21 20:47:35 2008
+++ php-src/ext/phar/func_interceptors.c        Thu Jul 10 11:36:50 2008
@@ -16,7 +16,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: func_interceptors.c,v 1.20.2.7 2008/06/21 20:47:35 sfox Exp $ */
+/* $Id: func_interceptors.c,v 1.20.2.8 2008/07/10 11:36:50 dmitry Exp $ */
 
 #include "phar_internal.h"
 
@@ -29,6 +29,10 @@
        int filename_len;
        zval *zcontext = NULL;
 
+       if (!PHAR_G(intercepted)) {
+               goto skip_phar;
+       }
+
        if ((PHAR_GLOBALS->phar_fname_map.arBuckets && 
!zend_hash_num_elements(&(PHAR_GLOBALS->phar_fname_map)))
                && !cached_phars.arBuckets) {
                goto skip_phar;
@@ -98,6 +102,10 @@
        long maxlen = PHP_STREAM_COPY_ALL;
        zval *zcontext = NULL;
 
+       if (!PHAR_G(intercepted)) {
+               goto skip_phar;
+       }
+
        if ((PHAR_GLOBALS->phar_fname_map.arBuckets && 
!zend_hash_num_elements(&(PHAR_GLOBALS->phar_fname_map)))
                && !cached_phars.arBuckets) {
                goto skip_phar;
@@ -224,6 +232,10 @@
        zval *zcontext = NULL;
        php_stream *stream;
 
+       if (!PHAR_G(intercepted)) {
+               goto skip_phar;
+       }
+
        if ((PHAR_GLOBALS->phar_fname_map.arBuckets && 
!zend_hash_num_elements(&(PHAR_GLOBALS->phar_fname_map)))
                && !cached_phars.arBuckets) {
                goto skip_phar;
@@ -315,6 +327,10 @@
        zval *zcontext = NULL;
        php_stream *stream;
 
+       if (!PHAR_G(intercepted)) {
+               goto skip_phar;
+       }
+
        if ((PHAR_GLOBALS->phar_fname_map.arBuckets && 
!zend_hash_num_elements(&(PHAR_GLOBALS->phar_fname_map)))
                && !cached_phars.arBuckets) {
                /* no need to check, include_path not even specified in fopen/ 
no active phars */
@@ -792,14 +808,18 @@
 
 #define PharFileFunction(fname, funcnum, orig) \
 void fname(INTERNAL_FUNCTION_PARAMETERS) { \
-       char *filename; \
-       int filename_len; \
-       \
-       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &filename, 
&filename_len) == FAILURE) { \
-               return; \
+       if (!PHAR_G(intercepted)) { \
+               PHAR_G(orig)(INTERNAL_FUNCTION_PARAM_PASSTHRU); \
+       } else { \
+               char *filename; \
+               int filename_len; \
+               \
+               if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", 
&filename, &filename_len) == FAILURE) { \
+                       return; \
+               } \
+               \
+               phar_file_stat(filename, (php_stat_len) filename_len, funcnum, 
PHAR_G(orig), INTERNAL_FUNCTION_PARAM_PASSTHRU); \
        } \
-       \
-       phar_file_stat(filename, (php_stat_len) filename_len, funcnum, 
PHAR_G(orig), INTERNAL_FUNCTION_PARAM_PASSTHRU); \
 }
 /* }}} */
 
@@ -878,6 +898,10 @@
        char *filename;
        int filename_len;
 
+       if (!PHAR_G(intercepted)) {
+               goto skip_phar;
+       }
+
        if ((PHAR_GLOBALS->phar_fname_map.arBuckets && 
!zend_hash_num_elements(&(PHAR_GLOBALS->phar_fname_map)))
                && !cached_phars.arBuckets) {
                goto skip_phar;
@@ -939,6 +963,10 @@
        char *filename;
        int filename_len;
 
+       if (!PHAR_G(intercepted)) {
+               goto skip_phar;
+       }
+
        if ((PHAR_GLOBALS->phar_fname_map.arBuckets && 
!zend_hash_num_elements(&(PHAR_GLOBALS->phar_fname_map)))
                && !cached_phars.arBuckets) {
                goto skip_phar;
@@ -1006,6 +1034,26 @@
 /* }}} */
 
 /* {{{ void phar_intercept_functions(TSRMLS_D) */
+void phar_intercept_functions(TSRMLS_D)
+{
+       zend_function *orig;
+
+       if (!PHAR_G(request_init)) {
+               PHAR_G(cwd) = NULL;
+               PHAR_G(cwd_len) = 0;
+       }
+       PHAR_G(intercepted) = 1;
+}
+/* }}} */
+
+/* {{{ void phar_release_functions(TSRMLS_D) */
+void phar_release_functions(TSRMLS_D)
+{
+       PHAR_G(intercepted) = 0;
+}
+/* }}} */
+
+/* {{{ void phar_intercept_functions_init(TSRMLS_D) */
 #define PHAR_INTERCEPT(func) \
        PHAR_G(orig_##func) = NULL; \
        if (SUCCESS == zend_hash_find(CG(function_table), #func, sizeof(#func), 
(void **)&orig)) { \
@@ -1013,17 +1061,10 @@
                orig->internal_function.handler = phar_##func; \
        }
 
-void phar_intercept_functions(TSRMLS_D)
+void phar_intercept_functions_init(TSRMLS_D)
 {
        zend_function *orig;
 
-       if (!PHAR_G(request_init)) {
-               PHAR_G(cwd) = NULL;
-               PHAR_G(cwd_len) = 0;
-       } else if (PHAR_G(orig_fopen)) {
-               /* don't double-intercept */
-               return;
-       }
        PHAR_INTERCEPT(fopen);
        PHAR_INTERCEPT(file_get_contents);
        PHAR_INTERCEPT(is_file);
@@ -1046,17 +1087,18 @@
        PHAR_INTERCEPT(lstat);
        PHAR_INTERCEPT(stat);
        PHAR_INTERCEPT(readfile);
+       PHAR_G(intercepted) = 0;
 }
 /* }}} */
 
-/* {{{ void phar_release_functions(TSRMLS_D) */
+/* {{{ void phar_intercept_functions_shutdown(TSRMLS_D) */
 #define PHAR_RELEASE(func) \
        if (PHAR_G(orig_##func) && SUCCESS == 
zend_hash_find(CG(function_table), #func, sizeof(#func), (void **)&orig)) { \
                orig->internal_function.handler = PHAR_G(orig_##func); \
        } \
        PHAR_G(orig_##func) = NULL;
 
-void phar_release_functions(TSRMLS_D)
+void phar_intercept_functions_shutdown(TSRMLS_D)
 {
        zend_function *orig;
 
@@ -1081,6 +1123,7 @@
        PHAR_RELEASE(lstat);
        PHAR_RELEASE(stat);
        PHAR_RELEASE(readfile);
+       PHAR_G(intercepted) = 0;
 }
 /* }}} */
 
http://cvs.php.net/viewvc.cgi/php-src/ext/phar/func_interceptors.h?r1=1.1&r2=1.1.2.1&diff_format=u
Index: php-src/ext/phar/func_interceptors.h
diff -u php-src/ext/phar/func_interceptors.h:1.1 
php-src/ext/phar/func_interceptors.h:1.1.2.1
--- php-src/ext/phar/func_interceptors.h:1.1    Fri Jan 11 07:30:02 2008
+++ php-src/ext/phar/func_interceptors.h        Thu Jul 10 11:36:50 2008
@@ -17,11 +17,13 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: func_interceptors.h,v 1.1 2008/01/11 07:30:02 cellog Exp $ */
+/* $Id: func_interceptors.h,v 1.1.2.1 2008/07/10 11:36:50 dmitry Exp $ */
 
 BEGIN_EXTERN_C()
 void phar_intercept_functions(TSRMLS_D);
 void phar_release_functions(TSRMLS_D);
+void phar_intercept_functions_init(TSRMLS_D);
+void phar_intercept_functions_shutdown(TSRMLS_D);
 END_EXTERN_C()
 
 /*
http://cvs.php.net/viewvc.cgi/php-src/ext/phar/phar.c?r1=1.370.2.31&r2=1.370.2.32&diff_format=u
Index: php-src/ext/phar/phar.c
diff -u php-src/ext/phar/phar.c:1.370.2.31 php-src/ext/phar/phar.c:1.370.2.32
--- php-src/ext/phar/phar.c:1.370.2.31  Wed Jul  9 14:15:41 2008
+++ php-src/ext/phar/phar.c     Thu Jul 10 11:36:50 2008
@@ -17,7 +17,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: phar.c,v 1.370.2.31 2008/07/09 14:15:41 tony2001 Exp $ */
+/* $Id: phar.c,v 1.370.2.32 2008/07/10 11:36:50 dmitry Exp $ */
 
 #define PHAR_MAIN 1
 #include "phar_internal.h"
@@ -3299,13 +3299,18 @@
 
        phar_object_init(TSRMLS_C);
 
+       phar_intercept_functions_init(TSRMLS_C);
+
        return php_register_url_stream_wrapper("phar", &php_stream_phar_wrapper 
TSRMLS_CC);
 }
 /* }}} */
 
 PHP_MSHUTDOWN_FUNCTION(phar) /* {{{ */
 {
-       return php_unregister_url_stream_wrapper("phar" TSRMLS_CC);
+       php_unregister_url_stream_wrapper("phar" TSRMLS_CC);
+
+       phar_intercept_functions_shutdown(TSRMLS_C);
+
        if (zend_compile_file == phar_compile_file) {
                zend_compile_file = phar_orig_compile_file;
        }
@@ -3319,6 +3324,8 @@
                zend_hash_destroy(&(cached_phars));
                zend_hash_destroy(&(cached_alias));
        }
+
+       return SUCCESS;
 }
 /* }}} */
 
@@ -3353,9 +3360,7 @@
                PHAR_G(cwd) = NULL;
                PHAR_G(cwd_len) = 0;
                PHAR_G(cwd_init) = 0;
-               if (!PHAR_G(orig_fopen)) {
-                       phar_intercept_functions(TSRMLS_C);
-               }
+               phar_intercept_functions(TSRMLS_C);
        }
 }
 /* }}} */
@@ -3407,7 +3412,7 @@
        php_info_print_table_header(2, "Phar: PHP Archive support", "enabled");
        php_info_print_table_row(2, "Phar EXT version", PHP_PHAR_VERSION);
        php_info_print_table_row(2, "Phar API version", PHP_PHAR_API_VERSION);
-       php_info_print_table_row(2, "CVS revision", "$Revision: 1.370.2.31 $");
+       php_info_print_table_row(2, "CVS revision", "$Revision: 1.370.2.32 $");
        php_info_print_table_row(2, "Phar-based phar archives", "enabled");
        php_info_print_table_row(2, "Tar-based phar archives", "enabled");
        php_info_print_table_row(2, "ZIP-based phar archives", "enabled");
@@ -3451,6 +3456,7 @@
        ZEND_MOD_OPTIONAL("bz2")
        ZEND_MOD_OPTIONAL("openssl")
        ZEND_MOD_OPTIONAL("zlib")
+       ZEND_MOD_OPTIONAL("standard")
 #if HAVE_SPL
        ZEND_MOD_REQUIRED("spl")
 #endif
http://cvs.php.net/viewvc.cgi/php-src/ext/phar/phar_internal.h?r1=1.109.2.19&r2=1.109.2.20&diff_format=u
Index: php-src/ext/phar/phar_internal.h
diff -u php-src/ext/phar/phar_internal.h:1.109.2.19 
php-src/ext/phar/phar_internal.h:1.109.2.20
--- php-src/ext/phar/phar_internal.h:1.109.2.19 Sat Jun 21 19:40:41 2008
+++ php-src/ext/phar/phar_internal.h    Thu Jul 10 11:36:50 2008
@@ -17,7 +17,7 @@
   +----------------------------------------------------------------------+
 */
 
-/* $Id: phar_internal.h,v 1.109.2.19 2008/06/21 19:40:41 sfox Exp $ */
+/* $Id: phar_internal.h,v 1.109.2.20 2008/07/10 11:36:50 dmitry Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -158,6 +158,7 @@
        int         has_bz2;
        zend_bool   readonly_orig;
        zend_bool   require_hash_orig;
+       zend_bool       intercepted;
        int         request_init;
        int         require_hash;
        int         request_done;

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to