Skip to content

Commit 8d1a791

Browse files
committed
Merge branch 'PHP-8.4'
* PHP-8.4: ext/ldap: Fix GH-16101 (Segfaults in php_ldap_do_search() when LDAPs is not a list)
2 parents 6674213 + 16b272d commit 8d1a791

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

ext/ldap/ldap.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1480,6 +1480,11 @@ static void php_ldap_do_search(INTERNAL_FUNCTION_PARAMETERS, int scope)
14801480
ret = 0;
14811481
goto cleanup;
14821482
}
1483+
if (!zend_array_is_list(Z_ARRVAL_P(link))) {
1484+
zend_argument_value_error(1, "must be a list");
1485+
ret = 0;
1486+
goto cleanup;
1487+
}
14831488

14841489
if (base_dn_ht) {
14851490
nbases = zend_hash_num_elements(base_dn_ht);

ext/ldap/tests/gh16101.phpt

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
--TEST--
2+
Bug GH-16101: Segfault in ldap_list(), ldap_read(), and ldap_search() when LDAPs array is not a list
3+
--EXTENSIONS--
4+
ldap
5+
--FILE--
6+
<?php
7+
8+
/* We are assuming 3333 is not connectable */
9+
$ldap = ldap_connect('ldap://127.0.0.1:3333');
10+
$valid_dn = "cn=userA,something";
11+
$valid_filter = "";
12+
13+
$ldaps_dict = [
14+
"hello" => $ldap,
15+
"world" => $ldap,
16+
];
17+
try {
18+
var_dump(ldap_list($ldaps_dict, $valid_dn, $valid_filter));
19+
} catch (Throwable $e) {
20+
echo $e::class, ': ', $e->getMessage(), PHP_EOL;
21+
}
22+
23+
?>
24+
--EXPECT--
25+
ValueError: ldap_list(): Argument #1 ($ldap) must be a list

0 commit comments

Comments
 (0)