]> granicus.if.org Git - php/commitdiff
increase context refcount before open() to avoid crash when open() fails and destroys...
authorAntony Dovgal <tony2001@php.net>
Wed, 6 Aug 2008 09:03:36 +0000 (09:03 +0000)
committerAntony Dovgal <tony2001@php.net>
Wed, 6 Aug 2008 09:03:36 +0000 (09:03 +0000)
main/streams/streams.c

index f1b74a49d5ad7b89098b03e0c9a8c220403f14cc..3d7d251ee3dd4bb837cdee07b894658699d75b50 100755 (executable)
@@ -2414,14 +2414,22 @@ PHPAPI php_stream *_php_stream_open_wrapper_ex(char *path, char *mode, int optio
                        php_stream_wrapper_log_error(wrapper, options ^ REPORT_ERRORS TSRMLS_CC,
                                        "wrapper does not support stream open");
                } else {
+                       /* refcount++ to make sure the context doesn't get destroyed 
+                        * if open() fails and stream is closed */
+                       if (context) {
+                               zend_list_addref(context->rsrc_id);
+                       }
+
                        stream = wrapper->wops->stream_opener(wrapper,
                                path_to_open, implicit_mode, options ^ REPORT_ERRORS,
                                opened_path, context STREAMS_REL_CC TSRMLS_CC);
-               }
 
-               /* increase context refcount only if the context is really used */
-               if (stream && stream->context) {
-                       zend_list_addref(stream->context->rsrc_id);
+                       /* if open() succeeded and context was not used, do refcount--
+                        * XXX if a wrapper didn't actually use context (no way to know that)
+                        * and open() failed, refcount will stay increased */
+                       if (context && stream && !stream->context) {
+                               zend_list_delete(context->rsrc_id);
+                       }
                }
 
                /* if the caller asked for a persistent stream but the wrapper did not