From: Philip Hazel Date: Tue, 21 Dec 2004 12:00:59 +0000 (+0000) Subject: Alex Miller's patch for LDAP_RES_SEARCH_REFERENCE. X-Git-Tag: exim-4_50~66 X-Git-Url: https://vcs.fsf.org/?p=exim.git;a=commitdiff_plain;h=d38f823269ffb0e25cbf2c9b6204f61e149169a7;ds=inline Alex Miller's patch for LDAP_RES_SEARCH_REFERENCE. --- diff --git a/doc/doc-txt/ChangeLog b/doc/doc-txt/ChangeLog index 4cc306291..021b61bcc 100644 --- a/doc/doc-txt/ChangeLog +++ b/doc/doc-txt/ChangeLog @@ -1,4 +1,4 @@ -$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.51 2004/12/21 11:28:38 ph10 Exp $ +$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.52 2004/12/21 12:00:59 ph10 Exp $ Change log file for Exim from version 4.21 ------------------------------------------- @@ -223,6 +223,17 @@ Exim version 4.50 was needed to allow it to recognize "Completed" as not the last thing in the line. +54. The LDAP lookup was not handling a return of LDAP_RES_SEARCH_REFERENCE. A + patch that reportedly fixes this has been added. I am not expert enough to + create a test for it. This is what the patch creator wrote: + + "I found a little strange behaviour of ldap code when working with + Windows 2003 AD Domain, where users was placed in more than one + Organization Units. When I tried to give exim partial DN, the exit code + of ldap_search was unknown to exim because of LDAP_RES_SEARCH_REFERENCE. + But simultaneously result of request was absolutely normal ldap result, + so I produce this patch..." + Exim version 4.43 ----------------- diff --git a/src/ACKNOWLEDGMENTS b/src/ACKNOWLEDGMENTS index 3c591fb9c..e74132803 100644 --- a/src/ACKNOWLEDGMENTS +++ b/src/ACKNOWLEDGMENTS @@ -1,4 +1,4 @@ -$Cambridge: exim/src/ACKNOWLEDGMENTS,v 1.9 2004/12/20 15:24:28 ph10 Exp $ +$Cambridge: exim/src/ACKNOWLEDGMENTS,v 1.10 2004/12/21 12:00:59 ph10 Exp $ EXIM ACKNOWLEDGEMENTS @@ -20,7 +20,7 @@ relatively small patches. Philip Hazel Lists created: 20 November 2002 -Last updated: 20 December 2004 +Last updated: 21 December 2004 THE OLD LIST @@ -172,6 +172,7 @@ Marc Merlin Many suggestions and patches for callouts and Andreas Metzler Patch for message_id_header_domain Suggested patch for multi-config files in scripts bug Alex Miller Suggested readline() patch + Patch for LDAP_RES_SEARCH_REFERENCE handling Andreas Mueller Patch for logging uncompleted SMTP transactions Pete Naylor Patch for LDAP TCP connect timeout setting Marcin Owsiany Diagnosis of a tricky timeout failure bug diff --git a/src/src/lookups/ldap.c b/src/src/lookups/ldap.c index 7a21e8e01..043135e03 100644 --- a/src/src/lookups/ldap.c +++ b/src/src/lookups/ldap.c @@ -1,4 +1,4 @@ -/* $Cambridge: exim/src/src/lookups/ldap.c,v 1.4 2004/11/17 16:31:45 ph10 Exp $ */ +/* $Cambridge: exim/src/src/lookups/ldap.c,v 1.5 2004/12/21 12:00:59 ph10 Exp $ */ /************************************************* * Exim - an Internet mail transport agent * @@ -167,7 +167,7 @@ uschar *matched = NULL; /* partially matched DN */ int attr_count = 0; int error_yield = DEFER; int msgid; -int rc; +int rc, ldap_rc, ldap_parse_rc; int port; int ptr = 0; int rescount = 0; @@ -779,10 +779,10 @@ if (rc == -1 || result == NULL) } /* A return code that isn't -1 doesn't necessarily mean there were no problems -with the search. The message must be an LDAP_RES_SEARCH_RESULT or else it's -something we can't handle. */ +with the search. The message must be an LDAP_RES_SEARCH_RESULT or +LDAP_RES_SEARCH_REFERENCE or else it's something we can't handle. */ -if (rc != LDAP_RES_SEARCH_RESULT) +if (rc != LDAP_RES_SEARCH_RESULT && rc != LDAP_RES_SEARCH_REFERENCE) { *errmsg = string_sprintf("ldap_result returned unexpected code %d", rc); goto RETURN_ERROR; @@ -791,11 +791,16 @@ if (rc != LDAP_RES_SEARCH_RESULT) /* We have a result message from the server. This doesn't yet mean all is well. We need to parse the message to find out exactly what's happened. */ - #if defined LDAP_LIB_SOLARIS || defined LDAP_LIB_OPENLDAP2 - if (ldap_parse_result(lcp->ld, result, &rc, CSS &matched, CSS &error2, NULL, - NULL, 0) < 0) +#if defined LDAP_LIB_SOLARIS || defined LDAP_LIB_OPENLDAP2 + ldap_rc = rc; + ldap_parse_rc = ldap_parse_result(lcp->ld, result, &rc, CSS &matched, + CSS &error2, NULL, NULL, 0); + DEBUG(D_lookup) debug_printf("ldap_parse_result: %d\n", ldap_parse_rc); + if (ldap_parse_rc < 0 && + (ldap_parse_rc != LDAP_NO_RESULTS_RETURNED || + ldap_rc != LDAP_RES_SEARCH_REFERENCE)) { - *errmsg = US"ldap_parse_result failed"; + *errmsg = string_sprintf("ldap_parse_result failed %d", ldap_parse_rc); goto RETURN_ERROR; } error1 = US ldap_err2string(rc);