Skip to content

Commit 5d4846b

Browse files
committed
ext/ldap: simplify ldap_connect() workflow, fix url leak.
delaying the object creation only before ldap initialisation. fix forgotten url freeing on TLS error code path. close GH-18645
1 parent 772479e commit 5d4846b

File tree

2 files changed

+32
-3
lines changed

2 files changed

+32
-3
lines changed

ext/ldap/ldap.c

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -984,8 +984,6 @@ PHP_FUNCTION(ldap_connect)
984984
RETURN_FALSE;
985985
}
986986

987-
object_init_ex(return_value, ldap_link_ce);
988-
ld = Z_LDAP_LINK_P(return_value);
989987

990988
{
991989
int rc = LDAP_SUCCESS;
@@ -1008,13 +1006,17 @@ PHP_FUNCTION(ldap_connect)
10081006

10091007
/* ensure all pending TLS options are applied in a new context */
10101008
if (ldap_set_option(NULL, LDAP_OPT_X_TLS_NEWCTX, &val) != LDAP_OPT_SUCCESS) {
1011-
zval_ptr_dtor(return_value);
1009+
if (url != host) {
1010+
efree(url);
1011+
}
10121012
php_error_docref(NULL, E_WARNING, "Could not create new security context");
10131013
RETURN_FALSE;
10141014
}
10151015
LDAPG(tls_newctx) = false;
10161016
}
10171017
#endif
1018+
object_init_ex(return_value, ldap_link_ce);
1019+
ld = Z_LDAP_LINK_P(return_value);
10181020

10191021
#ifdef LDAP_API_FEATURE_X_OPENLDAP
10201022
/* ldap_init() is deprecated, use ldap_initialize() instead.
@@ -1027,6 +1029,9 @@ PHP_FUNCTION(ldap_connect)
10271029
ldap = ldap_init(host, port);
10281030
if (ldap == NULL) {
10291031
zval_ptr_dtor(return_value);
1032+
if (url != host) {
1033+
efree(url);
1034+
}
10301035
php_error_docref(NULL, E_WARNING, "Could not create session handle");
10311036
RETURN_FALSE;
10321037
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
--TEST--
2+
ldap_connect() - Connection errors
3+
--EXTENSIONS--
4+
ldap
5+
--INI--
6+
error_reporting=E_ALL & ~E_DEPRECATED
7+
--FILE--
8+
<?php
9+
require "connect.inc";
10+
try {
11+
ldap_connect("nope://$host", 65536);
12+
} catch (\ValueError $e) {
13+
echo $e->getMessage(), PHP_EOL;
14+
}
15+
16+
try {
17+
ldap_connect("nope://$host", 0);
18+
} catch (\ValueError $e) {
19+
echo $e->getMessage(), PHP_EOL;
20+
}
21+
?>
22+
--EXPECT--
23+
ldap_connect(): Argument #2 ($port) must be between 1 and 65535
24+
ldap_connect(): Argument #2 ($port) must be between 1 and 65535

0 commit comments

Comments
 (0)