diff options
author | Samuel Surtees <ssurtees@euclideon.com> | 2018-12-11 20:15:15 +1000 |
---|---|---|
committer | Daniel Stenberg <daniel@haxx.se> | 2018-12-11 13:20:12 +0100 |
commit | 1b443a7c00c1e5d2d0567d440f309cba5d69096b (patch) | |
tree | 01b486448cfafc1590184dd336c4b20589f20209 | |
parent | 3a9cb0d74d396d4cb4f987ab023d9786415a024c (diff) | |
download | curl-1b443a7c00c1e5d2d0567d440f309cba5d69096b.tar.gz |
ldap: fix LDAP URL parsing regressions
- Match URL scheme with LDAP and LDAPS
- Retrieve attributes, scope and filter from URL query instead
Regression brought in 46e164069d1a5230 (7.62.0)
Closes #3362
-rw-r--r-- | lib/ldap.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/lib/ldap.c b/lib/ldap.c index ceaa71d08..a149f8cbc 100644 --- a/lib/ldap.c +++ b/lib/ldap.c @@ -839,6 +839,7 @@ static int _ldap_url_parse2(const struct connectdata *conn, LDAPURLDesc *ludp) { int rc = LDAP_SUCCESS; char *path; + char *query; char *p; char *q; size_t i; @@ -846,7 +847,7 @@ static int _ldap_url_parse2(const struct connectdata *conn, LDAPURLDesc *ludp) if(!conn->data || !conn->data->state.up.path || conn->data->state.up.path[0] != '/' || - !strcasecompare("LDAP", conn->data->state.up.scheme)) + !strncasecompare("LDAP", conn->data->state.up.scheme, 4)) return LDAP_INVALID_SYNTAX; ludp->lud_scope = LDAP_SCOPE_BASE; @@ -858,11 +859,14 @@ static int _ldap_url_parse2(const struct connectdata *conn, LDAPURLDesc *ludp) if(!path) return LDAP_NO_MEMORY; - /* Parse the DN (Distinguished Name) */ - q = strchr(p, '?'); - if(q) - *q++ = '\0'; + /* Duplicate the query */ + q = query = strdup(conn->data->state.up.query); + if(!query) { + free(path); + return LDAP_NO_MEMORY; + } + /* Parse the DN (Distinguished Name) */ if(*p) { char *dn = p; char *unescaped; @@ -1039,6 +1043,7 @@ static int _ldap_url_parse2(const struct connectdata *conn, LDAPURLDesc *ludp) quit: free(path); + free(query); return rc; } |