Skip to content

Commit 52b514b

Browse files
authored
ext/ldap: Fix references for ldap_modify_batch() (#16121)
Because I don't know how references work in PHP
1 parent d87711b commit 52b514b

File tree

2 files changed

+28
-18
lines changed

2 files changed

+28
-18
lines changed

ext/ldap/ldap.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2560,6 +2560,7 @@ PHP_FUNCTION(ldap_modify_batch)
25602560

25612561
zval *modification_zv = NULL;
25622562
ZEND_HASH_FOREACH_VAL(modifications, modification_zv) {
2563+
ZVAL_DEREF(modification_zv);
25632564
if (Z_TYPE_P(modification_zv) != IS_ARRAY) {
25642565
zend_argument_type_error(3, "must only contain arrays");
25652566
RETURN_THROWS();
@@ -2580,6 +2581,8 @@ PHP_FUNCTION(ldap_modify_batch)
25802581
zend_argument_value_error(3, "a modification entry must contain the \"" LDAP_MODIFY_BATCH_ATTRIB "\" option");
25812582
RETURN_THROWS();
25822583
}
2584+
2585+
ZVAL_DEREF(attrib);
25832586
if (UNEXPECTED(Z_TYPE_P(attrib) != IS_STRING)) {
25842587
zend_argument_type_error(3, "the value for option \"" LDAP_MODIFY_BATCH_ATTRIB "\" must be of type string, %s given", zend_zval_value_name(attrib));
25852588
RETURN_THROWS();
@@ -2594,6 +2597,8 @@ PHP_FUNCTION(ldap_modify_batch)
25942597
zend_argument_value_error(3, "a modification entry must contain the \"" LDAP_MODIFY_BATCH_MODTYPE "\" option");
25952598
RETURN_THROWS();
25962599
}
2600+
2601+
ZVAL_DEREF(modtype_zv);
25972602
if (UNEXPECTED(Z_TYPE_P(modtype_zv) != IS_LONG)) {
25982603
zend_argument_type_error(3, "the value for option \"" LDAP_MODIFY_BATCH_MODTYPE "\" must be of type int, %s given", zend_zval_value_name(attrib));
25992604
RETURN_THROWS();
@@ -2628,6 +2633,8 @@ PHP_FUNCTION(ldap_modify_batch)
26282633
}
26292634
continue;
26302635
}
2636+
2637+
ZVAL_DEREF(modification_values_zv);
26312638
if (Z_TYPE_P(modification_values_zv) != IS_ARRAY) {
26322639
zend_argument_type_error(3, "the value for option \"" LDAP_MODIFY_BATCH_VALUES "\" must be of type array, %s given", zend_zval_value_name(attrib));
26332640
RETURN_THROWS();

ext/ldap/tests/ldap_modify_batch_modifications_with_references.phpt

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,20 @@ ldap
99
$ldap = ldap_connect('ldap://127.0.0.1:3333');
1010
$valid_dn = "cn=userA,something";
1111

12-
$attrib = "attrib1";
13-
$r =& $attrib;
12+
$empty_list = [];
13+
$modification_reference = [
14+
&$empty_list,
15+
];
16+
try {
17+
var_dump(ldap_modify_batch($ldap, $valid_dn, $modification_reference));
18+
} catch (Throwable $e) {
19+
echo $e::class, ': ', $e->getMessage(), PHP_EOL;
20+
}
21+
22+
$attrib = "attrib\0with\0nul\0byte";
1423
$modification_attrib_reference_string = [
1524
[
16-
"attrib" => $r,
25+
"attrib" => &$attrib,
1726
"modtype" => LDAP_MODIFY_BATCH_ADD,
1827
"values" => ["value1"],
1928
],
@@ -24,12 +33,11 @@ try {
2433
echo $e::class, ': ', $e->getMessage(), PHP_EOL;
2534
}
2635

27-
$modtype = LDAP_MODIFY_BATCH_ADD;
28-
$r =& $modtype;
36+
$modtype = -10;
2937
$modification_modtype_reference_int = [
3038
[
3139
"attrib" => "attrib1",
32-
"modtype" => $r,
40+
"modtype" => &$modtype,
3341
"values" => ["value1"],
3442
],
3543
];
@@ -40,13 +48,12 @@ try {
4048
}
4149

4250

43-
$values = ["value1"];
44-
$r =& $values;
51+
$values = [];
4552
$modification_values_reference_array = [
4653
[
4754
"attrib" => "attrib1",
4855
"modtype" => LDAP_MODIFY_BATCH_ADD,
49-
"values" => $r,
56+
"values" => &$values,
5057
],
5158
];
5259
try {
@@ -56,12 +63,8 @@ try {
5663
}
5764

5865
?>
59-
--EXPECTF--
60-
Warning: ldap_modify_batch(): Batch Modify: Can't contact LDAP server in %s on line %d
61-
bool(false)
62-
63-
Warning: ldap_modify_batch(): Batch Modify: Can't contact LDAP server in %s on line %d
64-
bool(false)
65-
66-
Warning: ldap_modify_batch(): Batch Modify: Can't contact LDAP server in %s on line %d
67-
bool(false)
66+
--EXPECT--
67+
ValueError: ldap_modify_batch(): Argument #3 ($modifications_info) a modification entry must only contain the keys "attrib", "modtype", and "values"
68+
ValueError: ldap_modify_batch(): Argument #3 ($modifications_info) the value for option "attrib" must not contain null bytes
69+
ValueError: ldap_modify_batch(): Argument #3 ($modifications_info) the value for option "modtype" must be LDAP_MODIFY_BATCH_ADD, LDAP_MODIFY_BATCH_REMOVE, LDAP_MODIFY_BATCH_REPLACE, or LDAP_MODIFY_BATCH_REMOVE_ALL
70+
ValueError: ldap_modify_batch(): Argument #3 ($modifications_info) the value for option "values" must not be empty

0 commit comments

Comments
 (0)