]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-ldap/extended.c
Add a retry for entry_get too. (oops)
[openldap] / servers / slapd / back-ldap / extended.c
index 2661150224394265ef18a81f4fccd36423ae27ea..5008de7acc2e33ec2fb7bdcb848227ca41cf0090 100644 (file)
@@ -100,6 +100,7 @@ ldap_back_exop_passwd(
        LDAPMessage *res;
        ber_int_t msgid;
        int rc, isproxy;
+       int do_retry = 1;
        dncookie dc;
 
        lc = ldap_back_getconn(op, rs);
@@ -128,15 +129,12 @@ ldap_back_exop_passwd(
                }
        }
 
+retry:
        rc = ldap_passwd(lc->ld, isproxy ? &mdn : NULL,
                qpw->rs_old.bv_val ? &qpw->rs_old : NULL,
                qpw->rs_new.bv_val ? &qpw->rs_new : NULL,
                op->o_ctrls, NULL, &msgid);
 
-       if (mdn.bv_val != op->o_req_dn.bv_val) {
-               free(mdn.bv_val);
-       }
-
        if (rc == LDAP_SUCCESS) {
                if (ldap_result(lc->ld, msgid, 1, NULL, &res) == -1) {
                        ldap_get_option(lc->ld, LDAP_OPT_ERROR_NUMBER, &rc);
@@ -166,6 +164,10 @@ ldap_back_exop_passwd(
        }
        if (rc != LDAP_SUCCESS) {
                rs->sr_err = slap_map_api2result( rs );
+               if ( rs->sr_err == LDAP_UNAVAILABLE && do_retry ) {
+                       do_retry = 0;
+                       if ( ldap_back_retry (lc, op, rs )) goto retry;
+               }
                send_ldap_result(op, rs);
                if (rs->sr_matched) free((char *)rs->sr_matched);
                if (rs->sr_text) free((char *)rs->sr_text);
@@ -173,5 +175,9 @@ ldap_back_exop_passwd(
                rs->sr_text = NULL;
                rc = -1;
        }
+       if (mdn.bv_val != op->o_req_dn.bv_val) {
+               free(mdn.bv_val);
+       }
+
        return rc;
 }