Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/MongoDB/Query.c
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,7 @@ static bool php_phongo_query_opts_append_document(bson_t* opts, const char* opts
zval* value = php_array_fetch(zarr, zarr_key);
bson_t b = BSON_INITIALIZER;

ZVAL_DEREF(value);
if (Z_TYPE_P(value) != IS_OBJECT && Z_TYPE_P(value) != IS_ARRAY) {
phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT, "Expected \"%s\" %s to be array or object, %s given", zarr_key, zarr_key[0] == '$' ? "modifier" : "option", PHONGO_ZVAL_CLASS_OR_TYPE_NAME_P(value));
return false;
Expand Down Expand Up @@ -333,6 +334,7 @@ bool phongo_query_init(zval* return_value, zval* filter, zval* options)
if (php_array_existsc(options, "modifiers")) {
modifiers = php_array_fetchc(options, "modifiers");

ZVAL_DEREF(modifiers);
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should be done by php_array_fetchc?

if (Z_TYPE_P(modifiers) != IS_ARRAY) {
phongo_throw_exception(PHONGO_ERROR_INVALID_ARGUMENT, "Expected \"modifiers\" option to be array, %s given", PHONGO_ZVAL_CLASS_OR_TYPE_NAME_P(modifiers));
return false;
Expand Down
34 changes: 34 additions & 0 deletions tests/query/bug2457-001.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
--TEST--
PHPC-2457: Query modifiers can be passed reference
--FILE--
<?php

$modifiers = ['$orderby' => ['x' => 1]];
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You noted the following error in PHPC-2457:

PHP Fatal error: Uncaught MongoDB\Driver\Exception\InvalidArgumentException: Expected "$orderby" modifier to be array or object, bool given

The exception originates from php_phongo_query_opts_append_document(), but I'm not sure how that's possible as the code calls PHONGO_ZVAL_CLASS_OR_TYPE_NAME_P(value). That macro delegates to zend_get_type_by_const(). IS_REFERENCE isn't even included in that function, and I can't imagine why the type would match for the function returning "bool".


$query = new MongoDB\Driver\Query([], [
'modifiers' => &$modifiers,
]);

var_dump($query);

?>
===DONE===
<?php exit(0); ?>
--EXPECTF--
Deprecated: MongoDB\Driver\Query::__construct(): The "modifiers" option is deprecated and will be removed in a future release in %s
object(MongoDB\Driver\Query)#1 (3) {
["filter"]=>
object(stdClass)#2 (0) {
}
["options"]=>
object(stdClass)#4 (1) {
["sort"]=>
object(stdClass)#3 (1) {
["x"]=>
int(1)
}
}
["readConcern"]=>
NULL
}
===DONE===
49 changes: 49 additions & 0 deletions tests/query/bug2457-002.phpt
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
--TEST--
PHPC-2457: Query options can be passed reference
--FILE--
<?php

$collation = ['locale' => 'fr_FR', 'strength' => 2];
$let = ['x' => 1];
$sort = ['_id' => 1];

$query = new MongoDB\Driver\Query([], [
'collation' => &$collation,
'let' => &$let,
'sort' => &$sort,
]);

var_dump($query);

?>
===DONE===
<?php exit(0); ?>
--EXPECT--
object(MongoDB\Driver\Query)#1 (3) {
["filter"]=>
object(stdClass)#2 (0) {
}
["options"]=>
object(stdClass)#6 (3) {
["collation"]=>
object(stdClass)#3 (2) {
["locale"]=>
string(5) "fr_FR"
["strength"]=>
int(2)
}
["let"]=>
object(stdClass)#4 (1) {
["x"]=>
int(1)
}
["sort"]=>
object(stdClass)#5 (1) {
["_id"]=>
int(1)
}
}
["readConcern"]=>
NULL
}
===DONE===