Alex Miller's patch for LDAP_RES_SEARCH_REFERENCE.
authorPhilip Hazel <ph10@hermes.cam.ac.uk>
Tue, 21 Dec 2004 12:00:59 +0000 (12:00 +0000)
committerPhilip Hazel <ph10@hermes.cam.ac.uk>
Tue, 21 Dec 2004 12:00:59 +0000 (12:00 +0000)
doc/doc-txt/ChangeLog
src/ACKNOWLEDGMENTS
src/src/lookups/ldap.c

index 4cc306291d8f63d60be5f81b49dbe0c24dfda220..021b61bcc2b479ba27239894249116ceb6fd6ada 100644 (file)
@@ -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
 -------------------------------------------
 
 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.
 
     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
 -----------------
 
 Exim version 4.43
 -----------------
index 3c591fb9c5538b5705d651a71e11fd848b413cdd..e741328035de5b18f50ffacc47d7b9230a797178 100644 (file)
@@ -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
 
 
 EXIM ACKNOWLEDGEMENTS
 
@@ -20,7 +20,7 @@ relatively small patches.
 Philip Hazel
 
 Lists created: 20 November 2002
 Philip Hazel
 
 Lists created: 20 November 2002
-Last updated:  20 December 2004
+Last updated:  21 December 2004
 
 
 THE OLD LIST
 
 
 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                           
 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
 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
index 7a21e8e014ceb7e5affa32f92636d9a280081786..043135e039127e687d8de8ce38a43ddf20248b3c 100644 (file)
@@ -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    *
 
 /*************************************************
 *     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    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;
 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
   }
 
 /* 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;
   {
   *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. */
 
 /* 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);
     goto RETURN_ERROR;
     }
   error1 = US ldap_err2string(rc);