3535static int le_protocols ;
3636
3737struct php_user_stream_wrapper {
38+ php_stream_wrapper wrapper ;
3839 char * protoname ;
3940 zend_class_entry * ce ;
40- php_stream_wrapper wrapper ;
41+ zend_resource * resource ;
4142};
4243
4344static php_stream * user_wrapper_opener (php_stream_wrapper * wrapper , const char * filename , const char * mode , int options , zend_string * * opened_path , php_stream_context * context STREAMS_DC );
@@ -481,10 +482,12 @@ PHP_FUNCTION(stream_wrapper_register)
481482 uwrap -> wrapper .wops = & user_stream_wops ;
482483 uwrap -> wrapper .abstract = uwrap ;
483484 uwrap -> wrapper .is_url = ((flags & PHP_STREAM_IS_URL ) != 0 );
485+ uwrap -> resource = NULL ;
484486
485487 rsrc = zend_register_resource (uwrap , le_protocols );
486488
487489 if (php_register_url_stream_wrapper_volatile (protocol , & uwrap -> wrapper ) == SUCCESS ) {
490+ uwrap -> resource = rsrc ;
488491 RETURN_TRUE ;
489492 }
490493
@@ -510,12 +513,20 @@ PHP_FUNCTION(stream_wrapper_unregister)
510513 RETURN_THROWS ();
511514 }
512515
516+ php_stream_wrapper * wrapper = zend_hash_find_ptr (php_stream_get_url_stream_wrappers_hash (), protocol );
513517 if (php_unregister_url_stream_wrapper_volatile (protocol ) == FAILURE ) {
514518 /* We failed */
515519 php_error_docref (NULL , E_WARNING , "Unable to unregister protocol %s://" , ZSTR_VAL (protocol ));
516520 RETURN_FALSE ;
517521 }
518522
523+ ZEND_ASSERT (wrapper != NULL );
524+ if (wrapper -> wops == & user_stream_wops ) {
525+ struct php_user_stream_wrapper * uwrap = (struct php_user_stream_wrapper * )wrapper ;
526+ // uwrap will be released by resource destructor
527+ zend_list_delete (uwrap -> resource );
528+ }
529+
519530 RETURN_TRUE ;
520531}
521532/* }}} */
0 commit comments