Skip to content

Commit a42ece5

Browse files
authored
PHPC-1167: Avoid dangling session pointer in bulk writes (#1156)
1 parent 65e9fa6 commit a42ece5

File tree

7 files changed

+105
-0
lines changed

7 files changed

+105
-0
lines changed

php_phongo.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -734,6 +734,7 @@ bool phongo_execute_bulk_write(mongoc_client_t* client, const char* namespace, p
734734
mongoc_bulk_operation_set_hint(bulk, server_id);
735735

736736
if (zsession) {
737+
ZVAL_ZVAL(&bulk_write->session, zsession, 1, 0);
737738
mongoc_bulk_operation_set_client_session(bulk, Z_SESSION_OBJ_P(zsession)->client_session);
738739
}
739740

php_phongo_structs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ typedef struct {
2929
char* database;
3030
char* collection;
3131
bool executed;
32+
zval session;
3233
zend_object std;
3334
} php_phongo_bulkwrite_t;
3435

src/MongoDB/BulkWrite.c

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -566,6 +566,10 @@ static void php_phongo_bulkwrite_free_object(zend_object* object) /* {{{ */
566566
if (intern->collection) {
567567
efree(intern->collection);
568568
}
569+
570+
if (!Z_ISUNDEF(intern->session)) {
571+
zval_ptr_dtor(&intern->session);
572+
}
569573
} /* }}} */
570574

571575
static zend_object* php_phongo_bulkwrite_create_object(zend_class_entry* class_type) /* {{{ */
@@ -614,6 +618,13 @@ static HashTable* php_phongo_bulkwrite_get_debug_info(zval* object, int* is_temp
614618
ADD_ASSOC_BOOL_EX(&retval, "executed", intern->executed);
615619
ADD_ASSOC_LONG_EX(&retval, "server_id", mongoc_bulk_operation_get_hint(intern->bulk));
616620

621+
if (!Z_ISUNDEF(intern->session)) {
622+
ADD_ASSOC_ZVAL_EX(&retval, "session", &intern->session);
623+
Z_ADDREF(intern->session);
624+
} else {
625+
ADD_ASSOC_NULL_EX(&retval, "session");
626+
}
627+
617628
if (mongoc_bulk_operation_get_write_concern(intern->bulk)) {
618629
zval write_concern;
619630

tests/bulk/bulkwrite-debug-001.phpt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ object(MongoDB\Driver\BulkWrite)#%d (%d) {
3232
bool(false)
3333
["server_id"]=>
3434
int(0)
35+
["session"]=>
36+
NULL
3537
["write_concern"]=>
3638
NULL
3739
}
@@ -48,6 +50,8 @@ object(MongoDB\Driver\BulkWrite)#%d (%d) {
4850
bool(false)
4951
["server_id"]=>
5052
int(0)
53+
["session"]=>
54+
NULL
5155
["write_concern"]=>
5256
NULL
5357
}
@@ -64,6 +68,8 @@ object(MongoDB\Driver\BulkWrite)#%d (%d) {
6468
bool(false)
6569
["server_id"]=>
6670
int(0)
71+
["session"]=>
72+
NULL
6773
["write_concern"]=>
6874
NULL
6975
}
@@ -80,6 +86,8 @@ object(MongoDB\Driver\BulkWrite)#%d (%d) {
8086
bool(false)
8187
["server_id"]=>
8288
int(0)
89+
["session"]=>
90+
NULL
8391
["write_concern"]=>
8492
NULL
8593
}
@@ -96,6 +104,8 @@ object(MongoDB\Driver\BulkWrite)#%d (%d) {
96104
bool(false)
97105
["server_id"]=>
98106
int(0)
107+
["session"]=>
108+
NULL
99109
["write_concern"]=>
100110
NULL
101111
}

tests/bulk/bulkwrite-debug-002.phpt

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
--TEST--
2+
MongoDB\Driver\BulkWrite debug output after execution
3+
--SKIPIF--
4+
<?php require __DIR__ . "/../utils/basic-skipif.inc"; ?>
5+
<?php skip_if_not_live(); ?>
6+
<?php skip_if_not_clean(); ?>
7+
<?php skip_if_server_version('<', '3.6'); ?>
8+
--FILE--
9+
<?php
10+
require_once __DIR__ . "/../utils/basic.inc";
11+
12+
$manager = new MongoDB\Driver\Manager(URI);
13+
14+
$tests = [
15+
[],
16+
['session' => $manager->startSession()],
17+
];
18+
19+
foreach ($tests as $options) {
20+
$bulk = new MongoDB\Driver\BulkWrite();
21+
$bulk->insert(['foo' => 'bar']);
22+
$manager->executeBulkWrite(NS, $bulk, $options);
23+
var_dump($bulk);
24+
}
25+
26+
?>
27+
===DONE===
28+
<?php exit(0); ?>
29+
--EXPECTF--
30+
object(MongoDB\Driver\BulkWrite)#%d (%d) {
31+
["database"]=>
32+
%s
33+
["collection"]=>
34+
%s
35+
["ordered"]=>
36+
bool(true)
37+
["bypassDocumentValidation"]=>
38+
NULL
39+
["executed"]=>
40+
bool(true)
41+
["server_id"]=>
42+
int(%d)
43+
["session"]=>
44+
NULL
45+
["write_concern"]=>
46+
NULL
47+
}
48+
object(MongoDB\Driver\BulkWrite)#%d (%d) {
49+
["database"]=>
50+
%s
51+
["collection"]=>
52+
%s
53+
["ordered"]=>
54+
bool(true)
55+
["bypassDocumentValidation"]=>
56+
NULL
57+
["executed"]=>
58+
bool(true)
59+
["server_id"]=>
60+
int(%d)
61+
["session"]=>
62+
object(MongoDB\Driver\Session)#%d (%d) {
63+
%a
64+
}
65+
["write_concern"]=>
66+
NULL
67+
}
68+
===DONE===

tests/bulk/write-0001.phpt

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ object(MongoDB\Driver\BulkWrite)#%d (%d) {
5353
bool(false)
5454
["server_id"]=>
5555
int(0)
56+
["session"]=>
57+
NULL
5658
["write_concern"]=>
5759
NULL
5860
}
@@ -69,6 +71,8 @@ object(MongoDB\Driver\BulkWrite)#%d (%d) {
6971
bool(false)
7072
["server_id"]=>
7173
int(0)
74+
["session"]=>
75+
NULL
7276
["write_concern"]=>
7377
NULL
7478
}
@@ -85,6 +89,8 @@ object(MongoDB\Driver\BulkWrite)#%d (%d) {
8589
bool(false)
8690
["server_id"]=>
8791
int(0)
92+
["session"]=>
93+
NULL
8894
["write_concern"]=>
8995
NULL
9096
}
@@ -101,6 +107,8 @@ object(MongoDB\Driver\BulkWrite)#%d (%d) {
101107
bool(false)
102108
["server_id"]=>
103109
int(0)
110+
["session"]=>
111+
NULL
104112
["write_concern"]=>
105113
NULL
106114
}
@@ -117,6 +125,8 @@ object(MongoDB\Driver\BulkWrite)#%d (%d) {
117125
bool(true)
118126
["server_id"]=>
119127
int(%r[1-9]\d*%r)
128+
["session"]=>
129+
NULL
120130
["write_concern"]=>
121131
NULL
122132
}

tests/bulk/write-0002.phpt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,8 @@ object(MongoDB\Driver\BulkWrite)#%d (%d) {
4949
bool(false)
5050
["server_id"]=>
5151
int(0)
52+
["session"]=>
53+
NULL
5254
["write_concern"]=>
5355
NULL
5456
}
@@ -65,6 +67,8 @@ object(MongoDB\Driver\BulkWrite)#%d (%d) {
6567
bool(true)
6668
["server_id"]=>
6769
int(%r[1-9]\d*%r)
70+
["session"]=>
71+
NULL
6872
["write_concern"]=>
6973
array(%d) {
7074
["w"]=>

0 commit comments

Comments
 (0)