@@ -315,6 +315,8 @@ static php_stream *user_wrapper_opener(php_stream_wrapper *wrapper, const char *
315
315
316
316
us = emalloc (sizeof (* us ));
317
317
us -> wrapper = uwrap ;
318
+ /* call_method_if_exists() may unregister the stream wrapper. Hold on to it. */
319
+ GC_ADDREF (us -> wrapper -> resource );
318
320
319
321
user_stream_create_object (uwrap , context , & us -> object );
320
322
if (Z_TYPE (us -> object ) == IS_UNDEF ) {
@@ -350,8 +352,6 @@ static php_stream *user_wrapper_opener(php_stream_wrapper *wrapper, const char *
350
352
351
353
/* set wrapper data to be a reference to our object */
352
354
ZVAL_COPY (& stream -> wrapperdata , & us -> object );
353
-
354
- GC_ADDREF (us -> wrapper -> resource );
355
355
} else {
356
356
php_stream_wrapper_log_error (wrapper , options , "\"%s::" USERSTREAM_OPEN "\" call failed" ,
357
357
ZSTR_VAL (us -> wrapper -> ce -> name ));
@@ -361,6 +361,7 @@ static php_stream *user_wrapper_opener(php_stream_wrapper *wrapper, const char *
361
361
if (stream == NULL ) {
362
362
zval_ptr_dtor (& us -> object );
363
363
ZVAL_UNDEF (& us -> object );
364
+ zend_list_delete (us -> wrapper -> resource );
364
365
efree (us );
365
366
}
366
367
zval_ptr_dtor (& zretval );
@@ -403,6 +404,8 @@ static php_stream *user_wrapper_opendir(php_stream_wrapper *wrapper, const char
403
404
404
405
us = emalloc (sizeof (* us ));
405
406
us -> wrapper = uwrap ;
407
+ /* call_method_if_exists() may unregister the stream wrapper. Hold on to it. */
408
+ GC_ADDREF (us -> wrapper -> resource );
406
409
407
410
user_stream_create_object (uwrap , context , & us -> object );
408
411
if (Z_TYPE (us -> object ) == IS_UNDEF ) {
@@ -425,8 +428,6 @@ static php_stream *user_wrapper_opendir(php_stream_wrapper *wrapper, const char
425
428
426
429
/* set wrapper data to be a reference to our object */
427
430
ZVAL_COPY (& stream -> wrapperdata , & us -> object );
428
-
429
- GC_ADDREF (us -> wrapper -> resource );
430
431
} else {
431
432
php_stream_wrapper_log_error (wrapper , options , "\"%s::" USERSTREAM_DIR_OPEN "\" call failed" ,
432
433
ZSTR_VAL (us -> wrapper -> ce -> name ));
@@ -436,6 +437,7 @@ static php_stream *user_wrapper_opendir(php_stream_wrapper *wrapper, const char
436
437
if (stream == NULL ) {
437
438
zval_ptr_dtor (& us -> object );
438
439
ZVAL_UNDEF (& us -> object );
440
+ zend_list_delete (us -> wrapper -> resource );
439
441
efree (us );
440
442
}
441
443
zval_ptr_dtor (& zretval );
0 commit comments