File tree Expand file tree Collapse file tree 2 files changed +40
-0
lines changed Expand file tree Collapse file tree 2 files changed +40
-0
lines changed Original file line number Diff line number Diff line change @@ -57,6 +57,14 @@ class StreamWrapper
57
57
/** @var ReadableStream|WritableStream|null */
58
58
private $ stream ;
59
59
60
+ public function __destruct ()
61
+ {
62
+ /* This destructor is a workaround for PHP trying to use the stream well
63
+ * after all objects have been destructed. This can cause autoloading
64
+ * issues and possibly segmentation faults during PHP shutdown. */
65
+ $ this ->stream = null ;
66
+ }
67
+
60
68
/**
61
69
* Return the stream's file document.
62
70
*
@@ -88,6 +96,10 @@ public static function register($protocol = 'gridfs')
88
96
*/
89
97
public function stream_close ()
90
98
{
99
+ if (! $ this ->stream ) {
100
+ return ;
101
+ }
102
+
91
103
$ this ->stream ->close ();
92
104
}
93
105
Original file line number Diff line number Diff line change 19
19
use function array_merge ;
20
20
use function call_user_func ;
21
21
use function current ;
22
+ use function exec ;
22
23
use function fclose ;
23
24
use function fopen ;
24
25
use function fread ;
25
26
use function fwrite ;
26
27
use function hash_init ;
28
+ use function implode ;
27
29
use function is_callable ;
28
30
use function min ;
29
31
use function sprintf ;
30
32
use function str_repeat ;
31
33
use function stream_get_contents ;
32
34
use function strlen ;
35
+ use function strncasecmp ;
33
36
use function substr ;
37
+ use const PHP_EOL ;
38
+ use const PHP_OS ;
34
39
use const PHP_VERSION_ID ;
35
40
36
41
/**
@@ -743,6 +748,29 @@ public function testUploadFromStreamFails()
743
748
$ this ->bucket ->uploadFromStream ('filename ' , $ source );
744
749
}
745
750
751
+ public function testDanglingOpenWritableStream ()
752
+ {
753
+ if (! strncasecmp (PHP_OS , 'WIN ' , 3 )) {
754
+ $ this ->markTestSkipped ('Test does not apply to Windows ' );
755
+ }
756
+
757
+ $ path = __DIR__ . '/../../vendor/autoload.php ' ;
758
+ $ command = <<<CMD
759
+ php -r "require ' $ path'; \\ \$stream = (new MongoDB\Client)->test->selectGridFSBucket()->openUploadStream('filename', ['disableMD5' => true]);" 2>&1
760
+ CMD ;
761
+
762
+ @exec (
763
+ $ command ,
764
+ $ output ,
765
+ $ return
766
+ );
767
+
768
+ $ this ->assertSame (0 , $ return );
769
+ $ output = implode (PHP_EOL , $ output );
770
+
771
+ $ this ->assertSame ('' , $ output );
772
+ }
773
+
746
774
/**
747
775
* Asserts that a collection with the given name does not exist on the
748
776
* server.
You can’t perform that action at this time.
0 commit comments