@@ -42,6 +42,7 @@ struct php_user_stream_wrapper {
42
42
};
43
43
44
44
static 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 );
45
+ static int user_wrapper_close (php_stream_wrapper * wrapper , php_stream * stream );
45
46
static int user_wrapper_stat_url (php_stream_wrapper * wrapper , const char * url , int flags , php_stream_statbuf * ssb , php_stream_context * context );
46
47
static int user_wrapper_unlink (php_stream_wrapper * wrapper , const char * url , int options , php_stream_context * context );
47
48
static int user_wrapper_rename (php_stream_wrapper * wrapper , const char * url_from , const char * url_to , int options , php_stream_context * context );
@@ -53,7 +54,7 @@ static php_stream *user_wrapper_opendir(php_stream_wrapper *wrapper, const char
53
54
54
55
static const php_stream_wrapper_ops user_stream_wops = {
55
56
user_wrapper_opener ,
56
- NULL , /* close - the streams themselves know how */
57
+ user_wrapper_close ,
57
58
NULL , /* stat - the streams themselves know how */
58
59
user_wrapper_stat_url ,
59
60
user_wrapper_opendir ,
@@ -375,6 +376,8 @@ static php_stream *user_wrapper_opener(php_stream_wrapper *wrapper, const char *
375
376
376
377
/* set wrapper data to be a reference to our object */
377
378
ZVAL_COPY (& stream -> wrapperdata , & us -> object );
379
+
380
+ GC_ADDREF (us -> wrapper -> resource );
378
381
} else {
379
382
php_stream_wrapper_log_error (wrapper , options , "\"%s::" USERSTREAM_OPEN "\" call failed" ,
380
383
ZSTR_VAL (us -> wrapper -> ce -> name ));
@@ -399,6 +402,12 @@ static php_stream *user_wrapper_opener(php_stream_wrapper *wrapper, const char *
399
402
return stream ;
400
403
}
401
404
405
+ static int user_wrapper_close (php_stream_wrapper * wrapper , php_stream * stream )
406
+ {
407
+ struct php_user_stream_wrapper * uwrap = (struct php_user_stream_wrapper * )wrapper -> abstract ;
408
+ zend_list_delete (uwrap -> resource );
409
+ }
410
+
402
411
static php_stream * user_wrapper_opendir (php_stream_wrapper * wrapper , const char * filename , const char * mode ,
403
412
int options , zend_string * * opened_path , php_stream_context * context STREAMS_DC )
404
413
{
@@ -440,6 +449,8 @@ static php_stream *user_wrapper_opendir(php_stream_wrapper *wrapper, const char
440
449
441
450
/* set wrapper data to be a reference to our object */
442
451
ZVAL_COPY (& stream -> wrapperdata , & us -> object );
452
+
453
+ GC_ADDREF (us -> wrapper -> resource );
443
454
} else {
444
455
php_stream_wrapper_log_error (wrapper , options , "\"%s::" USERSTREAM_DIR_OPEN "\" call failed" ,
445
456
ZSTR_VAL (us -> wrapper -> ce -> name ));
0 commit comments