2828
2929ZEND_DECLARE_MODULE_GLOBALS (shadow )
3030
31- static char * shadow_override_copy = NULL ;
32-
3331typedef struct _shadow_function {
3432 void (* orig_handler )(INTERNAL_FUNCTION_PARAMETERS );
3533 int argno ;
@@ -63,8 +61,8 @@ static php_stream_ops shadow_dirstream_ops = {
6361 NULL /* set_option */
6462};
6563
66- static php_stream_wrapper_ops * plain_ops ;
67- zend_string * (* original_zend_resolve_path )(const char * filename , int filename_len );
64+ static const php_stream_wrapper_ops * plain_ops ;
65+ zend_string * (* original_zend_resolve_path )(const char * filename , size_t filename_len );
6866static void (* orig_touch )(INTERNAL_FUNCTION_PARAMETERS );
6967static void (* orig_chmod )(INTERNAL_FUNCTION_PARAMETERS );
7068static void (* orig_chdir )(INTERNAL_FUNCTION_PARAMETERS );
@@ -73,7 +71,7 @@ static void (*orig_realpath)(INTERNAL_FUNCTION_PARAMETERS);
7371static void (* orig_is_writable )(INTERNAL_FUNCTION_PARAMETERS );
7472static void (* orig_glob )(INTERNAL_FUNCTION_PARAMETERS );
7573
76- zend_string * shadow_resolve_path (const char * filename , int filename_len );
74+ zend_string * shadow_resolve_path (const char * filename , size_t filename_len );
7775static php_stream * shadow_stream_opener (php_stream_wrapper * wrapper , const char * filename , const char * mode ,
7876 int options , zend_string * * opened_path , php_stream_context * context STREAMS_DC );
7977static int shadow_stat (php_stream_wrapper * wrapper , const char * url , int flags , php_stream_statbuf * ssb ,
@@ -115,7 +113,7 @@ const zend_function_entry shadow_functions[] = {
115113static PHP_GINIT_FUNCTION (shadow )
116114{
117115 memset (shadow_globals , 0 , sizeof (zend_shadow_globals ));
118- zend_hash_init (& shadow_globals -> cache , 10 , NULL , ZVAL_PTR_DTOR , 1 ); // persistent!
116+ zend_hash_init (& shadow_globals -> cache , 10 , NULL , ZVAL_INTERNAL_PTR_DTOR , 1 ); // persistent!
119117 zend_hash_init (& shadow_globals -> replaced_function_table , 10 , NULL , ZVAL_PTR_DTOR , 1 );
120118 // initial size 10 here is a common sense - look at the number of overriden functions
121119}
@@ -169,14 +167,20 @@ PHP_INI_END()
169167
170168#define SHADOW_CONSTANT (C ) REGISTER_LONG_CONSTANT(#C, C, CONST_CS | CONST_PERSISTENT)
171169
170+ /* {{{ SHADOW_OVERRIDE
171+ * Use this macros to override php function with shadow analogue. E.g.:
172+ * SHADOW_OVERRIDE(fread);
173+ * It requires shadow_fread() function to be defined and have exactly the same signature as fread() function.
174+ */
172175#define SHADOW_OVERRIDE (func ) \
173176 orig_##func = NULL; \
174177 zend_string * key_##func = zend_string_init(#func, strlen(#func), 0);\
175178 if ((orig = zend_hash_find_ptr(CG(function_table), key_##func)) != NULL) { \
176179 orig_##func = orig->internal_function.handler; \
177180 orig->internal_function.handler = shadow_##func; \
178181 } \
179- zend_string_release(key_##func);
182+ zend_string_release_ex(key_##func, 0);
183+ /* }}} */
180184
181185#define SHADOW_ENABLED () (SHADOW_G(enabled) != 0 && SHADOW_G(instance) != NULL && SHADOW_G(template) != NULL)
182186
@@ -196,7 +200,7 @@ static void shadow_override_function(char *fname, size_t fname_len, int argno, i
196200 return ;
197201 }
198202
199- zend_string_release (fname_zs );
203+ zend_string_release_ex (fname_zs , 0 );
200204 table = & cls -> function_table ;
201205 fname = col + 2 ;
202206 fname_len = strlen (fname );
@@ -205,7 +209,7 @@ static void shadow_override_function(char *fname, size_t fname_len, int argno, i
205209 zend_string * fname_zs = zend_string_init (fname , strlen (fname ), 0 );
206210
207211 if ((orig = zend_hash_find_ptr (table , fname_zs )) == NULL ) {
208- zend_string_release (fname_zs );
212+ zend_string_release_ex (fname_zs , 0 );
209213 return ;
210214 }
211215
@@ -216,8 +220,8 @@ static void shadow_override_function(char *fname, size_t fname_len, int argno, i
216220
217221 orig -> internal_function .handler = shadow_generic_override ;
218222
219- zend_string_release (fname_zs );
220- zend_string_release (fname_full );
223+ zend_string_release_ex (fname_zs , 0 );
224+ zend_string_release_ex (fname_full , 1 );
221225}
222226
223227static void shadow_undo_override (char * fname , size_t fname_len , int argno , int argtype )
@@ -236,7 +240,7 @@ static void shadow_undo_override(char *fname, size_t fname_len, int argno, int a
236240 return ;
237241 }
238242
239- zend_string_release (fname_zs );
243+ zend_string_release_ex (fname_zs , 0 );
240244 table = & cls -> function_table ;
241245 fname = col + 2 ;
242246 fname_len = strlen (fname );
@@ -245,12 +249,12 @@ static void shadow_undo_override(char *fname, size_t fname_len, int argno, int a
245249 zend_string * fname_zs = zend_string_init (fname , strlen (fname ), 0 );
246250
247251 if ((orig = zend_hash_find_ptr (table , fname_zs )) == NULL ) {
248- zend_string_release (fname_zs );
252+ zend_string_release_ex (fname_zs , 0 );
249253 return ;
250254 }
251255
252256 if ((override = zend_hash_find_ptr (& SHADOW_G (replaced_function_table ), fname_full )) == NULL ) {
253- zend_string_release (fname_zs );
257+ zend_string_release_ex (fname_zs , 0 );
254258 return ;
255259 }
256260
@@ -259,8 +263,8 @@ static void shadow_undo_override(char *fname, size_t fname_len, int argno, int a
259263 zend_hash_del (& SHADOW_G (replaced_function_table ), fname_full );
260264 pefree (override , 1 );
261265
262- zend_string_release (fname_full );
263- zend_string_release (fname_zs );
266+ zend_string_release_ex (fname_full , 1 );
267+ zend_string_release_ex (fname_zs , 0 );
264268}
265269
266270
@@ -321,7 +325,7 @@ PHP_MINIT_FUNCTION(shadow)
321325 int argno ;
322326 int argtype ;
323327 /* Save this for shutdown */
324- shadow_override_copy = estrdup (SHADOW_G (override ));
328+ SHADOW_G ( shadow_override_copy ) = estrdup (SHADOW_G (override ));
325329 while (* over ) {
326330 char * next = strchr (over , ',' );
327331 if (!next ) {
@@ -364,9 +368,9 @@ PHP_MINIT_FUNCTION(shadow)
364368 */
365369PHP_MSHUTDOWN_FUNCTION (shadow )
366370{
367- if (shadow_override_copy != NULL ) {
371+ if (SHADOW_G ( shadow_override_copy ) != NULL ) {
368372 /* Cleanup after our user-specified overrides. */
369- char * over = shadow_override_copy ;
373+ char * over = SHADOW_G ( shadow_override_copy ) ;
370374 size_t over_len ;
371375 char c ;
372376 int argno ;
@@ -404,7 +408,7 @@ PHP_MSHUTDOWN_FUNCTION(shadow)
404408 break ;
405409 }
406410 }
407- efree (shadow_override_copy );
411+ efree (SHADOW_G ( shadow_override_copy ) );
408412 }
409413 UNREGISTER_INI_ENTRIES ();
410414 return SUCCESS ;
@@ -417,13 +421,17 @@ PHP_MSHUTDOWN_FUNCTION(shadow)
417421PHP_RINIT_FUNCTION (shadow )
418422{
419423 if (SHADOW_G (enabled )) {
420- php_unregister_url_stream_wrapper_volatile ("file" );
421- php_register_url_stream_wrapper_volatile ("file" , & shadow_wrapper );
424+ zend_string * protocol ;
425+ protocol = zend_string_init ("file" , strlen ("file" ), 0 );
426+ php_unregister_url_stream_wrapper_volatile (protocol );
427+ php_register_url_stream_wrapper_volatile (protocol , & shadow_wrapper );
428+ zend_string_release_ex (protocol , 0 );
422429 }
423430 SHADOW_G (template ) = NULL ;
424431 SHADOW_G (instance ) = NULL ;
425432 SHADOW_G (curdir ) = NULL ;
426433 SHADOW_G (segment_id ) = 0 ;
434+ SHADOW_G (shadow_override_copy ) = NULL ;
427435 return SUCCESS ;
428436}
429437/* }}} */
@@ -844,7 +852,7 @@ static void ensure_dir_exists(char *pathname, php_stream_wrapper *wrapper, php_s
844852 pathname [dir_len ] = '/' ; /* restore full path */
845853}
846854
847- zend_string * shadow_resolve_path (const char * filename , int filename_len )
855+ zend_string * shadow_resolve_path (const char * filename , size_t filename_len )
848856{
849857 char * shadow_result = template_to_instance (filename , OPT_CHECK_EXISTS TSRMLS_CC );
850858 zend_string * result = NULL ;
@@ -1175,7 +1183,7 @@ static int shadow_call_replace_name_ex(zval *name, char *repname, void (*orig_fu
11751183 Z_STR_P (name ) = new_name ;
11761184 orig_func (INTERNAL_FUNCTION_PARAM_PASSTHRU );
11771185 Z_STR_P (name ) = old_name ;
1178- zend_string_release (new_name );
1186+ zend_string_release_ex (new_name , 1 );
11791187 return SUCCESS ;
11801188}
11811189
@@ -1565,7 +1573,7 @@ static void shadow_generic_override(INTERNAL_FUNCTION_PARAMETERS)
15651573 }
15661574 shadow_function * func ;
15671575 if ((func = zend_hash_find_ptr (& SHADOW_G (replaced_function_table ), fname_full )) == NULL ) {
1568- zend_string_release (fname_full );
1576+ zend_string_release_ex (fname_full , 0 );
15691577 return ;
15701578 }
15711579 zval * name ;
@@ -1574,20 +1582,20 @@ static void shadow_generic_override(INTERNAL_FUNCTION_PARAMETERS)
15741582
15751583 if (!SHADOW_ENABLED ()) {
15761584 func -> orig_handler (INTERNAL_FUNCTION_PARAM_PASSTHRU );
1577- zend_string_release (fname_full );
1585+ zend_string_release_ex (fname_full , 0 );
15781586 return ;
15791587 }
15801588
15811589 name = shadow_get_arg (func -> argno TSRMLS_CC );
15821590 if (!name || Z_TYPE_P (name ) != IS_STRING ) {
15831591 func -> orig_handler (INTERNAL_FUNCTION_PARAM_PASSTHRU );
1584- zend_string_release (fname_full );
1592+ zend_string_release_ex (fname_full , 0 );
15851593 return ;
15861594 }
15871595 /* not our path - don't mess with it */
15881596 if (!shadow_stream_check (Z_STRVAL_P (name ))) {
15891597 func -> orig_handler (INTERNAL_FUNCTION_PARAM_PASSTHRU );
1590- zend_string_release (fname_full );
1598+ zend_string_release_ex (fname_full , 0 );
15911599 return ;
15921600 }
15931601 /* try to translate */
@@ -1602,11 +1610,11 @@ static void shadow_generic_override(INTERNAL_FUNCTION_PARAMETERS)
16021610 /* we didn't find better name, use original */
16031611 if (!instname ) {
16041612 func -> orig_handler (INTERNAL_FUNCTION_PARAM_PASSTHRU );
1605- zend_string_release (fname_full );
1613+ zend_string_release_ex (fname_full , 0 );
16061614 return ;
16071615 }
16081616 shadow_call_replace_name_ex (name , instname , func -> orig_handler , INTERNAL_FUNCTION_PARAM_PASSTHRU );
1609- zend_string_release (fname_full );
1617+ zend_string_release_ex (fname_full , 0 );
16101618}
16111619
16121620/*
0 commit comments