]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/backglue.c
use ldap_charray_free() instead of slapd's charray_free()
[openldap] / servers / slapd / backglue.c
index 63dd4158adf0142f1ecb10d4b313eee7a60d6c38..af3949325d9af8dfb9f74a87d3608bd5b073b063 100644 (file)
@@ -63,7 +63,7 @@ glue_back_select (
        bv.bv_val = (char *) dn;
 
        for (i = 0; i<gi->nodes; i++) {
-               if (dnIsSuffix(&bv, gi->n[i].be->be_nsuffix[0])) {
+               if (dnIsSuffix(&bv, &gi->n[i].be->be_nsuffix[0])) {
                        return gi->n[i].be;
                }
        }
@@ -97,7 +97,7 @@ glue_back_close (
 )
 {
        static int glueClosed = 0;
-       int rc;
+       int rc = 0;
 
        if (glueClosed) return 0;
 
@@ -292,7 +292,7 @@ glue_back_search (
 {
        glueinfo *gi = (glueinfo *)b0->be_private;
        BackendDB *be;
-       int i, rc, t2limit = 0, s2limit = 0;
+       int i, rc = 0, t2limit = 0, s2limit = 0;
        long stoptime = 0;
        struct berval bv;
        glue_state gs = {0};
@@ -349,34 +349,31 @@ glue_back_search (
                                        break;
                                }
                        }
+                       rc = 0;
                        /*
                         * check for abandon 
                         */
-                       ldap_pvt_thread_mutex_lock (&op->o_abandonmutex);
-                       rc = op->o_abandon;
-                       ldap_pvt_thread_mutex_unlock (&op->o_abandonmutex);
-                       if (rc) {
-                               rc = 0;
+                       if (op->o_abandon) {
                                goto done;
                        }
                        be = gi->n[i].be;
                        if (scope == LDAP_SCOPE_ONELEVEL && 
                                dn_match(&gi->n[i].pdn, ndn)) {
                                rc = be->be_search (be, conn, op,
-                                       be->be_suffix[0], be->be_nsuffix[0],
+                                       &be->be_suffix[0], &be->be_nsuffix[0],
                                        LDAP_SCOPE_BASE, deref,
                                        s2limit, t2limit, filter, filterstr,
                                        attrs, attrsonly);
 
                        } else if (scope == LDAP_SCOPE_SUBTREE &&
-                               dnIsSuffix(be->be_nsuffix[0], ndn)) {
+                               dnIsSuffix(&be->be_nsuffix[0], ndn)) {
                                rc = be->be_search (be, conn, op,
-                                       be->be_suffix[0], be->be_nsuffix[0],
+                                       &be->be_suffix[0], &be->be_nsuffix[0],
                                        scope, deref,
                                        s2limit, t2limit, filter, filterstr,
                                        attrs, attrsonly);
 
-                       } else if (dnIsSuffix(&bv, be->be_nsuffix[0])) {
+                       } else if (dnIsSuffix(&bv, &be->be_nsuffix[0])) {
                                rc = be->be_search (be, conn, op, dn, ndn,
                                        scope, deref,
                                        s2limit, t2limit, filter, filterstr,
@@ -416,8 +413,15 @@ glue_back_bind (
        be = glue_back_select (b0, ndn->bv_val);
 
        if (be && be->be_bind) {
-               conn->c_authz_backend = be;
                rc = be->be_bind (be, conn, op, dn, ndn, method, cred, edn);
+
+               if( rc == LDAP_SUCCESS ) {
+                       ldap_pvt_thread_mutex_lock( &conn->c_mutex );
+                       if( conn->c_authz_backend == NULL ) {
+                               conn->c_authz_backend = be;
+                       }
+                       ldap_pvt_thread_mutex_unlock( &conn->c_mutex );
+               }
        } else {
                rc = LDAP_UNWILLING_TO_PERFORM;
                send_ldap_result (conn, op, rc, NULL, "No bind target found",
@@ -813,7 +817,7 @@ glue_sub_init( )
        int i, j;
        int cont = num_subordinates;
        BackendDB *b1, *be;
-       BackendInfo *bi;
+       BackendInfo *bi = NULL;
        glueinfo *gi;
 
        /* While there are subordinate backends, search backwards through the
@@ -836,7 +840,7 @@ glue_sub_init( )
                        if (be->be_flags & SLAP_BFLAG_GLUE_LINKED) {
                                continue;
                        }
-                       if (!dnIsSuffix(be->be_nsuffix[0], b1->be_nsuffix[0])) {
+                       if (!dnIsSuffix(&be->be_nsuffix[0], &b1->be_nsuffix[0])) {
                                continue;
                        }
                        cont--;
@@ -893,7 +897,7 @@ glue_sub_init( )
                                        gi->nodes * sizeof(gluenode));
                        }
                        gi->n[gi->nodes].be = be;
-                       dnParent( be->be_nsuffix[0], &gi->n[gi->nodes].pdn ); 
+                       dnParent( &be->be_nsuffix[0], &gi->n[gi->nodes].pdn ); 
                        gi->nodes++;
                }
                if (gi) {
@@ -901,7 +905,7 @@ glue_sub_init( )
                        gi = (glueinfo *)ch_realloc(gi,
                                sizeof(glueinfo) + gi->nodes * sizeof(gluenode));
                        gi->n[gi->nodes].be = gi->be;
-                       dnParent( b1->be_nsuffix[0], &gi->n[gi->nodes].pdn );
+                       dnParent( &b1->be_nsuffix[0], &gi->n[gi->nodes].pdn );
                        gi->nodes++;
                        b1->be_private = gi;
                        b1->bd_info = bi;