On Fri, Oct 28, 2011 at 02:27:32AM +0000, Viktor Dukhovni wrote:

> A better solution is required, I'll post an updated proposal
> tomorrow.

Please try the below. It inlines the two-line (possibly deprecated)
ldap_result2error() function, which just calls ldap_parse_result().
I don't believe we actually need to call ldap_parse_sasl_bind_result(),
as ldap_parse_result should be enough, we don't need (or in any
case have never asked for or used) the additional information from
its server_creds result argument.

Index: src/global/dict_ldap.c
--- src/global/dict_ldap.c      1 Mar 2011 04:44:42 -0000       1.1.1.2
+++ src/global/dict_ldap.c      28 Oct 2011 15:58:37 -0000
@@ -498,6 +498,7 @@
 static int dict_ldap_result(LDAP *ld, int msgid, int timeout, LDAPMessage 
**res)
 {
     struct timeval mytimeval;
+    int err;
 
     mytimeval.tv_sec = timeout;
     mytimeval.tv_usec = 0;
@@ -506,10 +507,14 @@
     if (ldap_result(ld, msgid, GET_ALL, &mytimeval, res) == -1)
        return (dict_ldap_get_errno(ld));
 
-    if (dict_ldap_get_errno(ld) == LDAP_TIMEOUT) {
-       (void) dict_ldap_abandon(ld, msgid);
-       return (dict_ldap_set_errno(ld, LDAP_TIMEOUT));
+    if ((err = dict_ldap_get_errno(ld)) != LDAP_SUCCESS) {
+       if (err == LDAP_TIMEOUT) {
+           (void) dict_ldap_abandon(ld, msgid);
+           return (dict_ldap_set_errno(ld, LDAP_TIMEOUT));
+       }
+       return err;
     }
+
     return LDAP_SUCCESS;
 }
 
@@ -552,6 +557,7 @@
 static int dict_ldap_bind_st(DICT_LDAP *dict_ldap)
 {
     int     rc;
+    int     err = LDAP_SUCCESS;
     int     msgid;
     LDAPMessage *res;
     struct berval cred;
@@ -567,7 +573,8 @@
        return (rc);
 
 #define FREE_RESULT 1
-    return (ldap_parse_sasl_bind_result(dict_ldap->ld, res, 0, FREE_RESULT));
+    rc = ldap_parse_result(ld, res, &err, 0, 0, 0, 0, FREE_RESULT);
+    return (rc == LDAP_SUCCESS ? err : rc);
 }
 
 /* search_st - Synchronous search with timeout */

-- 
        Viktor.

Reply via email to