@@ -341,6 +341,8 @@ static php_stream *user_wrapper_opener(php_stream_wrapper *wrapper, const char *
341
341
342
342
us = emalloc (sizeof (* us ));
343
343
us -> wrapper = uwrap ;
344
+ /* call_method_if_exists() may unregister the stream wrapper. Hold on to it. */
345
+ GC_ADDREF (us -> wrapper -> resource );
344
346
345
347
user_stream_create_object (uwrap , context , & us -> object );
346
348
if (Z_TYPE (us -> object ) == IS_UNDEF ) {
@@ -376,8 +378,6 @@ static php_stream *user_wrapper_opener(php_stream_wrapper *wrapper, const char *
376
378
377
379
/* set wrapper data to be a reference to our object */
378
380
ZVAL_COPY (& stream -> wrapperdata , & us -> object );
379
-
380
- GC_ADDREF (us -> wrapper -> resource );
381
381
} else {
382
382
php_stream_wrapper_log_error (wrapper , options , "\"%s::" USERSTREAM_OPEN "\" call failed" ,
383
383
ZSTR_VAL (us -> wrapper -> ce -> name ));
@@ -387,6 +387,7 @@ static php_stream *user_wrapper_opener(php_stream_wrapper *wrapper, const char *
387
387
if (stream == NULL ) {
388
388
zval_ptr_dtor (& us -> object );
389
389
ZVAL_UNDEF (& us -> object );
390
+ zend_list_delete (us -> wrapper -> resource );
390
391
efree (us );
391
392
}
392
393
zval_ptr_dtor (& zretval );
@@ -429,6 +430,8 @@ static php_stream *user_wrapper_opendir(php_stream_wrapper *wrapper, const char
429
430
430
431
us = emalloc (sizeof (* us ));
431
432
us -> wrapper = uwrap ;
433
+ /* call_method_if_exists() may unregister the stream wrapper. Hold on to it. */
434
+ GC_ADDREF (us -> wrapper -> resource );
432
435
433
436
user_stream_create_object (uwrap , context , & us -> object );
434
437
if (Z_TYPE (us -> object ) == IS_UNDEF ) {
@@ -451,8 +454,6 @@ static php_stream *user_wrapper_opendir(php_stream_wrapper *wrapper, const char
451
454
452
455
/* set wrapper data to be a reference to our object */
453
456
ZVAL_COPY (& stream -> wrapperdata , & us -> object );
454
-
455
- GC_ADDREF (us -> wrapper -> resource );
456
457
} else {
457
458
php_stream_wrapper_log_error (wrapper , options , "\"%s::" USERSTREAM_DIR_OPEN "\" call failed" ,
458
459
ZSTR_VAL (us -> wrapper -> ce -> name ));
@@ -462,6 +463,7 @@ static php_stream *user_wrapper_opendir(php_stream_wrapper *wrapper, const char
462
463
if (stream == NULL ) {
463
464
zval_ptr_dtor (& us -> object );
464
465
ZVAL_UNDEF (& us -> object );
466
+ zend_list_delete (us -> wrapper -> resource );
465
467
efree (us );
466
468
}
467
469
zval_ptr_dtor (& zretval );
0 commit comments