]> granicus.if.org Git - php/commitdiff
- Merged to 5.3 change in trunk in _php_stream_free. This prevents the segfault
authorGustavo André dos Santos Lopes <cataphract@php.net>
Sun, 8 May 2011 19:59:42 +0000 (19:59 +0000)
committerGustavo André dos Santos Lopes <cataphract@php.net>
Sun, 8 May 2011 19:59:42 +0000 (19:59 +0000)
  in the testcase for bug #53624. The testcase still has to be fixed though,
  because it only works as intended on Windows.

main/streams/streams.c

index 22373016b6013dc007b57a06ccc72d9ac23d3a3e..aafb652a08574ec6d4572112494d459e1cc390a7 100755 (executable)
@@ -355,7 +355,12 @@ fprintf(stderr, "stream_free: %s:%p[%s] preserve_handle=%d release_cast=%d remov
 
        /* If not called from the resource dtor, remove the stream from the resource list. */
        if ((close_options & PHP_STREAM_FREE_RSRC_DTOR) == 0 && remove_rsrc) {
-               zend_list_delete(stream->rsrc_id);
+               /* zend_list_delete actually only decreases the refcount; if we're
+                * releasing the stream, we want to actually delete the resource from
+                * the resource list, otherwise the resource will point to invalid memory.
+                * In any case, let's always completely delete it from the resource list,
+                * not only when PHP_STREAM_FREE_RELEASE_STREAM is set */
+               while (zend_list_delete(stream->rsrc_id) == SUCCESS) {}
        }
 
        /* Remove stream from any context link list */