From e273c2e5c788ace9bf5d3d9b8ef171d57d3d2722 Mon Sep 17 00:00:00 2001 From: Jeremy Mikola Date: Mon, 25 Jun 2018 11:41:20 -0400 Subject: [PATCH 1/2] PHPC-1193: Bump libmongoc to 1.11.0 --- config.m4 | 4 ++-- config.w32 | 4 ++-- src/libmongoc | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/config.m4 b/config.m4 index 68e959c3c..2e07bb328 100644 --- a/config.m4 +++ b/config.m4 @@ -296,13 +296,13 @@ if test "$PHP_MONGODB" != "no"; then PHP_MONGODB_COMMON_SOURCES="common-b64.c" dnl Generated with: find src/libmongoc/src/libbson/src/bson -name '*.c' -print0 | cut -sz -d / -f 7- | sort -z | tr '\000' ' ' - PHP_MONGODB_BSON_SOURCES="bcon.c bson-atomic.c bson.c bson-clock.c bson-context.c bson-decimal128.c bson-error.c bson-iso8601.c bson-iter.c bson-json.c bson-keys.c bson-md5.c bson-memory.c bson-oid.c bson-reader.c bson-string.c bson-timegm.c bson-utf8.c bson-value.c bson-version-functions.c bson-writer.c" + PHP_MONGODB_BSON_SOURCES="bcon.c bson-atomic.c bson.c bson-clock.c bson-context.c bson-decimal128.c bson-error.c bson-fnv.c bson-iso8601.c bson-iter.c bson-json.c bson-keys.c bson-md5.c bson-memory.c bson-oid.c bson-reader.c bson-string.c bson-timegm.c bson-utf8.c bson-value.c bson-version-functions.c bson-writer.c" dnl Generated with: find src/libmongoc/src/libbson/src/jsonsl -name '*.c' -print0 | cut -sz -d / -f 7- | sort -z | tr '\000' ' ' PHP_MONGODB_JSONSL_SOURCES="jsonsl.c" dnl Generated with: find src/libmongoc/src/libmongoc/src/mongoc -name '*.c' -print0 | cut -sz -d / -f 7- | sort -z | tr '\000' ' ' - PHP_MONGODB_MONGOC_SOURCES="mongoc-apm.c mongoc-array.c mongoc-async.c mongoc-async-cmd.c mongoc-buffer.c mongoc-bulk-operation.c mongoc-change-stream.c mongoc-client.c mongoc-client-pool.c mongoc-client-session.c mongoc-cluster.c mongoc-cluster-cyrus.c mongoc-cluster-gssapi.c mongoc-cluster-sasl.c mongoc-cluster-sspi.c mongoc-cmd.c mongoc-collection.c mongoc-compression.c mongoc-counters.c mongoc-crypto.c mongoc-crypto-cng.c mongoc-crypto-common-crypto.c mongoc-crypto-openssl.c mongoc-cursor-array.c mongoc-cursor.c mongoc-cursor-cmd.c mongoc-cursor-cmd-deprecated.c mongoc-cursor-find.c mongoc-cursor-find-cmd.c mongoc-cursor-find-opquery.c mongoc-cursor-legacy.c mongoc-cyrus.c mongoc-database.c mongoc-find-and-modify.c mongoc-gridfs.c mongoc-gridfs-file.c mongoc-gridfs-file-list.c mongoc-gridfs-file-page.c mongoc-gssapi.c mongoc-handshake.c mongoc-host-list.c mongoc-index.c mongoc-init.c mongoc-libressl.c mongoc-linux-distro-scanner.c mongoc-list.c mongoc-log.c mongoc-matcher.c mongoc-matcher-op.c mongoc-memcmp.c mongoc-openssl.c mongoc-opts.c mongoc-opts-helpers.c mongoc-queue.c mongoc-rand-cng.c mongoc-rand-common-crypto.c mongoc-rand-openssl.c mongoc-read-concern.c mongoc-read-prefs.c mongoc-rpc.c mongoc-sasl.c mongoc-scram.c mongoc-secure-channel.c mongoc-secure-transport.c mongoc-server-description.c mongoc-server-stream.c mongoc-set.c mongoc-socket.c mongoc-ssl.c mongoc-sspi.c mongoc-stream-buffered.c mongoc-stream.c mongoc-stream-file.c mongoc-stream-gridfs.c mongoc-stream-socket.c mongoc-stream-tls.c mongoc-stream-tls-libressl.c mongoc-stream-tls-openssl-bio.c mongoc-stream-tls-openssl.c mongoc-stream-tls-secure-channel.c mongoc-stream-tls-secure-transport.c mongoc-topology.c mongoc-topology-description-apm.c mongoc-topology-description.c mongoc-topology-scanner.c mongoc-uri.c mongoc-util.c mongoc-version-functions.c mongoc-write-command.c mongoc-write-command-legacy.c mongoc-write-concern.c" + PHP_MONGODB_MONGOC_SOURCES="mongoc-apm.c mongoc-array.c mongoc-async.c mongoc-async-cmd.c mongoc-buffer.c mongoc-bulk-operation.c mongoc-change-stream.c mongoc-client.c mongoc-client-pool.c mongoc-client-session.c mongoc-cluster.c mongoc-cluster-cyrus.c mongoc-cluster-gssapi.c mongoc-cluster-sasl.c mongoc-cluster-sspi.c mongoc-cmd.c mongoc-collection.c mongoc-compression.c mongoc-counters.c mongoc-crypto.c mongoc-crypto-cng.c mongoc-crypto-common-crypto.c mongoc-crypto-openssl.c mongoc-cursor-array.c mongoc-cursor.c mongoc-cursor-cmd.c mongoc-cursor-cmd-deprecated.c mongoc-cursor-find.c mongoc-cursor-find-cmd.c mongoc-cursor-find-opquery.c mongoc-cursor-legacy.c mongoc-cyrus.c mongoc-database.c mongoc-error.c mongoc-find-and-modify.c mongoc-gridfs.c mongoc-gridfs-file.c mongoc-gridfs-file-list.c mongoc-gridfs-file-page.c mongoc-gssapi.c mongoc-handshake.c mongoc-host-list.c mongoc-index.c mongoc-init.c mongoc-libressl.c mongoc-linux-distro-scanner.c mongoc-list.c mongoc-log.c mongoc-matcher.c mongoc-matcher-op.c mongoc-memcmp.c mongoc-openssl.c mongoc-opts.c mongoc-opts-helpers.c mongoc-queue.c mongoc-rand-cng.c mongoc-rand-common-crypto.c mongoc-rand-openssl.c mongoc-read-concern.c mongoc-read-prefs.c mongoc-rpc.c mongoc-sasl.c mongoc-scram.c mongoc-secure-channel.c mongoc-secure-transport.c mongoc-server-description.c mongoc-server-stream.c mongoc-set.c mongoc-socket.c mongoc-ssl.c mongoc-sspi.c mongoc-stream-buffered.c mongoc-stream.c mongoc-stream-file.c mongoc-stream-gridfs.c mongoc-stream-socket.c mongoc-stream-tls.c mongoc-stream-tls-libressl.c mongoc-stream-tls-openssl-bio.c mongoc-stream-tls-openssl.c mongoc-stream-tls-secure-channel.c mongoc-stream-tls-secure-transport.c mongoc-topology.c mongoc-topology-description-apm.c mongoc-topology-description.c mongoc-topology-scanner.c mongoc-uri.c mongoc-util.c mongoc-version-functions.c mongoc-write-command.c mongoc-write-command-legacy.c mongoc-write-concern.c" dnl Generated with: find src/libmongoc/src/zlib-1.2.11 -maxdepth 1 -name '*.c' -print0 | cut -sz -d / -f 5- | sort -z | tr '\000' ' ' PHP_MONGODB_ZLIB_SOURCES="adler32.c compress.c crc32.c deflate.c gzclose.c gzlib.c gzread.c gzwrite.c infback.c inffast.c inflate.c inftrees.c trees.c uncompr.c zutil.c" diff --git a/config.w32 b/config.w32 index dca66ed45..295684a2a 100644 --- a/config.w32 +++ b/config.w32 @@ -78,13 +78,13 @@ if (PHP_MONGODB != "no") { var PHP_MONGODB_COMMON_SOURCES="common-b64.c" // Generated with: find src/libmongoc/src/libbson/src/bson -name '*.c' -print0 | cut -sz -d / -f 7- | sort -z | tr '\000' ' ' - var PHP_MONGODB_BSON_SOURCES="bcon.c bson-atomic.c bson.c bson-clock.c bson-context.c bson-decimal128.c bson-error.c bson-iso8601.c bson-iter.c bson-json.c bson-keys.c bson-md5.c bson-memory.c bson-oid.c bson-reader.c bson-string.c bson-timegm.c bson-utf8.c bson-value.c bson-version-functions.c bson-writer.c"; + var PHP_MONGODB_BSON_SOURCES="bcon.c bson-atomic.c bson.c bson-clock.c bson-context.c bson-decimal128.c bson-error.c bson-fnv.c bson-iso8601.c bson-iter.c bson-json.c bson-keys.c bson-md5.c bson-memory.c bson-oid.c bson-reader.c bson-string.c bson-timegm.c bson-utf8.c bson-value.c bson-version-functions.c bson-writer.c"; // Generated with: find src/libmongoc/src/libbson/src/jsonsl -name '*.c' -print0 | cut -sz -d / -f 7- | sort -z | tr '\000' ' ' var PHP_MONGODB_JSONSL_SOURCES="jsonsl.c"; // Generated with: find src/libmongoc/src/libmongoc/src/mongoc -name '*.c' -print0 | cut -sz -d / -f 7- | sort -z | tr '\000' ' ' - var PHP_MONGODB_MONGOC_SOURCES="mongoc-apm.c mongoc-array.c mongoc-async.c mongoc-async-cmd.c mongoc-buffer.c mongoc-bulk-operation.c mongoc-change-stream.c mongoc-client.c mongoc-client-pool.c mongoc-client-session.c mongoc-cluster.c mongoc-cluster-cyrus.c mongoc-cluster-gssapi.c mongoc-cluster-sasl.c mongoc-cluster-sspi.c mongoc-cmd.c mongoc-collection.c mongoc-compression.c mongoc-counters.c mongoc-crypto.c mongoc-crypto-cng.c mongoc-crypto-common-crypto.c mongoc-crypto-openssl.c mongoc-cursor-array.c mongoc-cursor.c mongoc-cursor-cmd.c mongoc-cursor-cmd-deprecated.c mongoc-cursor-find.c mongoc-cursor-find-cmd.c mongoc-cursor-find-opquery.c mongoc-cursor-legacy.c mongoc-cyrus.c mongoc-database.c mongoc-find-and-modify.c mongoc-gridfs.c mongoc-gridfs-file.c mongoc-gridfs-file-list.c mongoc-gridfs-file-page.c mongoc-gssapi.c mongoc-handshake.c mongoc-host-list.c mongoc-index.c mongoc-init.c mongoc-libressl.c mongoc-linux-distro-scanner.c mongoc-list.c mongoc-log.c mongoc-matcher.c mongoc-matcher-op.c mongoc-memcmp.c mongoc-openssl.c mongoc-opts.c mongoc-opts-helpers.c mongoc-queue.c mongoc-rand-cng.c mongoc-rand-common-crypto.c mongoc-rand-openssl.c mongoc-read-concern.c mongoc-read-prefs.c mongoc-rpc.c mongoc-sasl.c mongoc-scram.c mongoc-secure-channel.c mongoc-secure-transport.c mongoc-server-description.c mongoc-server-stream.c mongoc-set.c mongoc-socket.c mongoc-ssl.c mongoc-sspi.c mongoc-stream-buffered.c mongoc-stream.c mongoc-stream-file.c mongoc-stream-gridfs.c mongoc-stream-socket.c mongoc-stream-tls.c mongoc-stream-tls-libressl.c mongoc-stream-tls-openssl-bio.c mongoc-stream-tls-openssl.c mongoc-stream-tls-secure-channel.c mongoc-stream-tls-secure-transport.c mongoc-topology.c mongoc-topology-description-apm.c mongoc-topology-description.c mongoc-topology-scanner.c mongoc-uri.c mongoc-util.c mongoc-version-functions.c mongoc-write-command.c mongoc-write-command-legacy.c mongoc-write-concern.c"; + var PHP_MONGODB_MONGOC_SOURCES="mongoc-apm.c mongoc-array.c mongoc-async.c mongoc-async-cmd.c mongoc-buffer.c mongoc-bulk-operation.c mongoc-change-stream.c mongoc-client.c mongoc-client-pool.c mongoc-client-session.c mongoc-cluster.c mongoc-cluster-cyrus.c mongoc-cluster-gssapi.c mongoc-cluster-sasl.c mongoc-cluster-sspi.c mongoc-cmd.c mongoc-collection.c mongoc-compression.c mongoc-counters.c mongoc-crypto.c mongoc-crypto-cng.c mongoc-crypto-common-crypto.c mongoc-crypto-openssl.c mongoc-cursor-array.c mongoc-cursor.c mongoc-cursor-cmd.c mongoc-cursor-cmd-deprecated.c mongoc-cursor-find.c mongoc-cursor-find-cmd.c mongoc-cursor-find-opquery.c mongoc-cursor-legacy.c mongoc-cyrus.c mongoc-database.c mongoc-error.c mongoc-find-and-modify.c mongoc-gridfs.c mongoc-gridfs-file.c mongoc-gridfs-file-list.c mongoc-gridfs-file-page.c mongoc-gssapi.c mongoc-handshake.c mongoc-host-list.c mongoc-index.c mongoc-init.c mongoc-libressl.c mongoc-linux-distro-scanner.c mongoc-list.c mongoc-log.c mongoc-matcher.c mongoc-matcher-op.c mongoc-memcmp.c mongoc-openssl.c mongoc-opts.c mongoc-opts-helpers.c mongoc-queue.c mongoc-rand-cng.c mongoc-rand-common-crypto.c mongoc-rand-openssl.c mongoc-read-concern.c mongoc-read-prefs.c mongoc-rpc.c mongoc-sasl.c mongoc-scram.c mongoc-secure-channel.c mongoc-secure-transport.c mongoc-server-description.c mongoc-server-stream.c mongoc-set.c mongoc-socket.c mongoc-ssl.c mongoc-sspi.c mongoc-stream-buffered.c mongoc-stream.c mongoc-stream-file.c mongoc-stream-gridfs.c mongoc-stream-socket.c mongoc-stream-tls.c mongoc-stream-tls-libressl.c mongoc-stream-tls-openssl-bio.c mongoc-stream-tls-openssl.c mongoc-stream-tls-secure-channel.c mongoc-stream-tls-secure-transport.c mongoc-topology.c mongoc-topology-description-apm.c mongoc-topology-description.c mongoc-topology-scanner.c mongoc-uri.c mongoc-util.c mongoc-version-functions.c mongoc-write-command.c mongoc-write-command-legacy.c mongoc-write-concern.c"; EXTENSION("mongodb", "php_phongo.c phongo_compat.c", null, PHP_MONGODB_CFLAGS); ADD_SOURCES(configure_module_dirname + "/src", "bson.c bson-encode.c", "mongodb"); diff --git a/src/libmongoc b/src/libmongoc index 5ba198691..44ee444b8 160000 --- a/src/libmongoc +++ b/src/libmongoc @@ -1 +1 @@ -Subproject commit 5ba1986910d38ce852bbb7f75328338b840f3402 +Subproject commit 44ee444b82a1e8b9f0be27f54ffa469d10bff841 From 98a7abaa21bd290e098cfa8bd5c3bab1ec511894 Mon Sep 17 00:00:00 2001 From: Jeremy Mikola Date: Mon, 25 Jun 2018 15:50:48 -0400 Subject: [PATCH 2/2] PHPC-1216: Always validate and apply wtimeoutMS in URI options array --- php_phongo.c | 28 +++++++++---------- .../manager-ctor-write_concern-002.phpt | 5 +++- .../manager-ctor-write_concern-error-004.phpt | 6 ++-- .../manager-ctor-write_concern-error-007.phpt | 20 +++++++++++++ .../manager/manager-getwriteconcern-001.phpt | 5 +++- 5 files changed, 45 insertions(+), 19 deletions(-) create mode 100644 tests/manager/manager-ctor-write_concern-error-007.phpt diff --git a/php_phongo.c b/php_phongo.c index 6b18df4a5..74ba970c3 100644 --- a/php_phongo.c +++ b/php_phongo.c @@ -1788,7 +1788,6 @@ static bool php_phongo_apply_rp_options_to_uri(mongoc_uri_t* uri, bson_t* option static bool php_phongo_apply_wc_options_to_uri(mongoc_uri_t* uri, bson_t* options TSRMLS_DC) /* {{{ */ { bson_iter_t iter; - int32_t wtimeoutms; mongoc_write_concern_t* new_wc; const mongoc_write_concern_t* old_wc; @@ -1811,8 +1810,6 @@ static bool php_phongo_apply_wc_options_to_uri(mongoc_uri_t* uri, bson_t* option return true; } - wtimeoutms = mongoc_write_concern_get_wtimeout(old_wc); - new_wc = mongoc_write_concern_copy(old_wc); if (bson_iter_init_find_case(&iter, options, MONGOC_URI_SAFE)) { @@ -1827,6 +1824,8 @@ static bool php_phongo_apply_wc_options_to_uri(mongoc_uri_t* uri, bson_t* option } if (bson_iter_init_find_case(&iter, options, MONGOC_URI_WTIMEOUTMS)) { + int32_t wtimeout; + if (!BSON_ITER_HOLDS_INT32(&iter)) { PHONGO_URI_INVALID_TYPE(iter, "32-bit integer"); mongoc_write_concern_destroy(new_wc); @@ -1834,7 +1833,16 @@ static bool php_phongo_apply_wc_options_to_uri(mongoc_uri_t* uri, bson_t* option return false; } - wtimeoutms = bson_iter_int32(&iter); + wtimeout = bson_iter_int32(&iter); + + if (wtimeout < 0) { + phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT TSRMLS_CC, "Expected wtimeoutMS to be >= 0, %d given", wtimeout); + mongoc_write_concern_destroy(new_wc); + + return false; + } + + mongoc_write_concern_set_wtimeout(new_wc, wtimeout); } if (bson_iter_init_find_case(&iter, options, MONGOC_URI_JOURNAL)) { @@ -1872,7 +1880,8 @@ static bool php_phongo_apply_wc_options_to_uri(mongoc_uri_t* uri, bson_t* option const char* str = bson_iter_utf8(&iter, NULL); if (0 == strcasecmp(PHONGO_WRITE_CONCERN_W_MAJORITY, str)) { - mongoc_write_concern_set_wmajority(new_wc, wtimeoutms); + /* wtimeoutMS is set independently, so preserve its value here */ + mongoc_write_concern_set_wmajority(new_wc, mongoc_write_concern_get_wtimeout(new_wc)); } else { mongoc_write_concern_set_wtag(new_wc, str); } @@ -1884,15 +1893,6 @@ static bool php_phongo_apply_wc_options_to_uri(mongoc_uri_t* uri, bson_t* option } } - /* Only set wtimeout if it's still applicable; otherwise, clear it. */ - if (mongoc_write_concern_get_w(new_wc) > 1 || - mongoc_write_concern_get_wmajority(new_wc) || - mongoc_write_concern_get_wtag(new_wc)) { - mongoc_write_concern_set_wtimeout(new_wc, wtimeoutms); - } else { - mongoc_write_concern_set_wtimeout(new_wc, 0); - } - if (mongoc_write_concern_get_journal(new_wc)) { int32_t w = mongoc_write_concern_get_w(new_wc); diff --git a/tests/manager/manager-ctor-write_concern-002.phpt b/tests/manager/manager-ctor-write_concern-002.phpt index d85c740b2..37365ee46 100644 --- a/tests/manager/manager-ctor-write_concern-002.phpt +++ b/tests/manager/manager-ctor-write_concern-002.phpt @@ -4,7 +4,6 @@ MongoDB\Driver\Manager::__construct(): write concern options (wtimeoutms) 1, w = majority, or tag sets are used ['mongodb://127.0.0.1/?wtimeoutms=1000', []], ['mongodb://127.0.0.1/?w=2&wtimeoutms=1000', []], ['mongodb://127.0.0.1/?w=majority&wtimeoutms=1000', []], @@ -27,6 +26,8 @@ foreach ($tests as $test) { --EXPECTF-- object(MongoDB\Driver\WriteConcern)#%d (%d) { + ["wtimeout"]=> + int(1000) } object(MongoDB\Driver\WriteConcern)#%d (%d) { ["w"]=> @@ -47,6 +48,8 @@ object(MongoDB\Driver\WriteConcern)#%d (%d) { int(1000) } object(MongoDB\Driver\WriteConcern)#%d (%d) { + ["wtimeout"]=> + int(1000) } object(MongoDB\Driver\WriteConcern)#%d (%d) { ["w"]=> diff --git a/tests/manager/manager-ctor-write_concern-error-004.phpt b/tests/manager/manager-ctor-write_concern-error-004.phpt index 0c49528aa..fc6e2e84e 100644 --- a/tests/manager/manager-ctor-write_concern-error-004.phpt +++ b/tests/manager/manager-ctor-write_concern-error-004.phpt @@ -1,5 +1,5 @@ --TEST-- -MongoDB\Driver\Manager::__construct(): invalid write concern (wtimeoutms range) +MongoDB\Driver\Manager::__construct(): invalid write concern (wtimeoutms range exceeds INT32_MAX) --SKIPIF-- --FILE-- @@ -7,8 +7,8 @@ MongoDB\Driver\Manager::__construct(): invalid write concern (wtimeoutms range) require_once __DIR__ . '/../utils/tools.php'; -/* Note: libmongoc does not check wTimeoutMS's range in the URI string. 64-bit - * integers will be truncated by strtol() */ +/* Note: libmongoc does not check wTimeoutMS's upper bounds in the URI string. + * 64-bit integers will be truncated by strtol(). */ echo throws(function() { new MongoDB\Driver\Manager(null, ['wTimeoutMS' => 2147483648]); diff --git a/tests/manager/manager-ctor-write_concern-error-007.phpt b/tests/manager/manager-ctor-write_concern-error-007.phpt new file mode 100644 index 000000000..36483a751 --- /dev/null +++ b/tests/manager/manager-ctor-write_concern-error-007.phpt @@ -0,0 +1,20 @@ +--TEST-- +MongoDB\Driver\Manager::__construct(): invalid write concern (wtimeoutms range) +--SKIPIF-- + +--FILE-- + -1]); +}, "MongoDB\Driver\Exception\InvalidArgumentException"), "\n"; + +?> +===DONE=== + +--EXPECT-- +OK: Got MongoDB\Driver\Exception\InvalidArgumentException +Expected wtimeoutMS to be >= 0, -1 given +===DONE=== diff --git a/tests/manager/manager-getwriteconcern-001.phpt b/tests/manager/manager-getwriteconcern-001.phpt index 7acbaf333..dd1fbb05d 100644 --- a/tests/manager/manager-getwriteconcern-001.phpt +++ b/tests/manager/manager-getwriteconcern-001.phpt @@ -10,7 +10,6 @@ $tests = array( array(null, array('w' => 1, 'journal' => true)), array(null, array('w' => 'majority', 'journal' => true)), array('mongodb://127.0.0.1/?w=majority&journal=true', array('w' => 1, 'journal' => false)), - // wtimeoutms does not get applied unless w > 1, w = majority, or tag sets are used array('mongodb://127.0.0.1/?wtimeoutms=1000', array()), array(null, array('wtimeoutms' => 1000)), array('mongodb://127.0.0.1/?w=2', array('wtimeoutms' => 1000)), @@ -61,8 +60,12 @@ object(MongoDB\Driver\WriteConcern)#%d (%d) { bool(false) } object(MongoDB\Driver\WriteConcern)#%d (%d) { + ["wtimeout"]=> + int(1000) } object(MongoDB\Driver\WriteConcern)#%d (%d) { + ["wtimeout"]=> + int(1000) } object(MongoDB\Driver\WriteConcern)#%d (%d) { ["w"]=>