X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fbackglue.c;h=b2665549b07810dccf4057f2985b9b8d419a6c56;hb=27cb98d28d60b1f258ea12852b22bfdfec6380f6;hp=c68c1708dd1f0907ed14477f6457c9cbc875a9e1;hpb=9cd630d50738e0bc481684af4eebc2e56b2545f8;p=openldap diff --git a/servers/slapd/backglue.c b/servers/slapd/backglue.c index c68c1708dd..b2665549b0 100644 --- a/servers/slapd/backglue.c +++ b/servers/slapd/backglue.c @@ -63,7 +63,7 @@ glue_back_select ( bv.bv_val = (char *) dn; for (i = 0; inodes; 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,12 +292,15 @@ 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}; - slap_callback cb = {glue_back_response, glue_back_sresult, - glue_back_sendentry, &gs}; + slap_callback cb; + + cb.sc_response = glue_back_response; + cb.sc_sresult = glue_back_sresult; + cb.sc_sendentry = glue_back_sendentry; + cb.sc_private = &gs; gs.prevcb = op->o_callback; @@ -323,6 +326,7 @@ glue_back_search ( case LDAP_SCOPE_ONELEVEL: case LDAP_SCOPE_SUBTREE: op->o_callback = &cb; + rc = gs.err = LDAP_UNWILLING_TO_PERFORM; /* * Execute in reverse order, most general first @@ -332,42 +336,43 @@ glue_back_search ( continue; if (tlimit) { t2limit = stoptime - slap_get_time (); - if (t2limit <= 0) + if (t2limit <= 0) { + rc = gs.err = LDAP_TIMELIMIT_EXCEEDED; break; + } } if (slimit) { s2limit = slimit - gs.nentries; - if (s2limit <= 0) + if (s2limit <= 0) { + rc = gs.err = LDAP_SIZELIMIT_EXCEEDED; 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(ndn, &be->be_nsuffix[0])) { rc = be->be_search (be, conn, op, dn, ndn, scope, deref, s2limit, t2limit, filter, filterstr, @@ -407,8 +412,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", @@ -804,9 +816,8 @@ glue_sub_init( ) int i, j; int cont = num_subordinates; BackendDB *b1, *be; - BackendInfo *bi; + BackendInfo *bi = NULL; glueinfo *gi; - struct berval bv; /* While there are subordinate backends, search backwards through the * backends and connect them to their superior. @@ -828,7 +839,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--; @@ -885,14 +896,7 @@ glue_sub_init( ) gi->nodes * sizeof(gluenode)); } gi->n[gi->nodes].be = be; - if ( dnParent( be->be_nsuffix[0]->bv_val, - (const char **)&bv.bv_val ) - != LDAP_SUCCESS ) { - return -1; - } - bv.bv_len = be->be_nsuffix[0]->bv_len - (bv.bv_val - - be->be_nsuffix[0]->bv_val); - gi->n[gi->nodes].pdn = bv; + dnParent( &be->be_nsuffix[0], &gi->n[gi->nodes].pdn ); gi->nodes++; } if (gi) { @@ -900,14 +904,7 @@ glue_sub_init( ) gi = (glueinfo *)ch_realloc(gi, sizeof(glueinfo) + gi->nodes * sizeof(gluenode)); gi->n[gi->nodes].be = gi->be; - if ( dnParent( b1->be_nsuffix[0]->bv_val, - (const char **)&bv.bv_val ) - != LDAP_SUCCESS ) { - return -1; - } - bv.bv_len = b1->be_nsuffix[0]->bv_len - (bv.bv_val - - b1->be_nsuffix[0]->bv_val); - gi->n[gi->nodes].pdn = bv; + dnParent( &b1->be_nsuffix[0], &gi->n[gi->nodes].pdn ); gi->nodes++; b1->be_private = gi; b1->bd_info = bi;