X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Foverlays%2Fpcache.c;h=c44a932af85c8a5ddb16ce27f24990cb703e038f;hb=59e9ff6243465640956b58ad1756a3ede53eca7c;hp=84c9d237a94125de0b624d70fa4b63509e6ff5da;hpb=6e430cca902dfef92609e91ea14dafea934324d2;p=openldap diff --git a/servers/slapd/overlays/pcache.c b/servers/slapd/overlays/pcache.c index 84c9d237a9..c44a932af8 100644 --- a/servers/slapd/overlays/pcache.c +++ b/servers/slapd/overlays/pcache.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 2003-2014 The OpenLDAP Foundation. + * Copyright 2003-2018 The OpenLDAP Foundation. * Portions Copyright 2003 IBM Corporation. * Portions Copyright 2003-2009 Symas Corporation. * All rights reserved. @@ -65,7 +65,7 @@ typedef struct Query_s { struct query_template_s; typedef struct Qbase_s { - Avlnode *scopes[4]; /* threaded AVL trees of cached queries */ + TAvlnode *scopes[4]; /* threaded AVL trees of cached queries */ struct berval base; int queries; } Qbase; @@ -455,8 +455,13 @@ ftemp_attrs( struct berval *ftemp, struct berval *template, *t1++ = *p1++; p2 = strchr( p1, '=' ); - if ( !p2 ) + if ( !p2 ) { + if ( !descs ) { + ch_free( temp2 ); + return -1; + } break; + } i = p2 - p1; AC_MEMCPY( t1, p1, i ); t1 += i; @@ -468,6 +473,7 @@ ftemp_attrs( struct berval *ftemp, struct berval *template, ad = NULL; i = slap_bv2ad( &bv, &ad, text ); if ( i ) { + ch_free( temp2 ); ch_free( descs ); return -1; } @@ -563,6 +569,7 @@ bottom: } if ( !t_cnt ) { *text = "couldn't parse template"; + ch_free(attrs); return -1; } if ( !got_oc && !( set->flags & PC_GOT_OC )) { @@ -1265,14 +1272,14 @@ typedef struct fstack { } fstack; static CachedQuery * -find_filter( Operation *op, Avlnode *root, Filter *inputf, Filter *first ) +find_filter( Operation *op, TAvlnode *root, Filter *inputf, Filter *first ) { Filter* fs; Filter* fi; MatchingRule* mrule = NULL; int res=0, eqpass= 0; int ret, rc, dir; - Avlnode *ptr; + TAvlnode *ptr; CachedQuery cq, *qc; fstack *stack = NULL, *fsp; @@ -2831,7 +2838,7 @@ pcache_op_bind( QueryTemplate *temp; Entry *e; slap_callback cb = { 0 }, *sc; - bindinfo bi; + bindinfo bi = { 0 }; bindcacheinfo *bci; Operation op2; int rc; @@ -2861,7 +2868,6 @@ pcache_op_bind( op2 = *op; op2.o_dn = op->o_bd->be_rootdn; op2.o_ndn = op->o_bd->be_rootndn; - bi.bi_flags = 0; op2.o_bd = &cm->db; e = NULL; @@ -2890,11 +2896,8 @@ pcache_op_bind( */ bi.bi_cm = cm; bi.bi_templ = temp; - bi.bi_cq = NULL; - bi.bi_si = NULL; bi.bi_cb.sc_response = pc_bind_search; - bi.bi_cb.sc_cleanup = NULL; bi.bi_cb.sc_private = &bi; cb.sc_private = &bi; cb.sc_response = pc_bind_resp; @@ -2930,6 +2933,7 @@ pcache_op_bind( sc->sc_response = pc_bind_save; sc->sc_cleanup = NULL; sc->sc_private = sc+1; + sc->sc_writewait = NULL; bci = sc->sc_private; sc->sc_next = op->o_callback; op->o_callback = sc; @@ -3122,6 +3126,7 @@ pcache_op_search( cb->sc_response = pcache_response; cb->sc_cleanup = pcache_op_cleanup; cb->sc_private = (cb+1); + cb->sc_writewait = 0; si = cb->sc_private; si->on = on; si->query = query; @@ -4494,6 +4499,7 @@ pcache_db_init( qm = (query_manager*)ch_malloc(sizeof(query_manager)); cm->db = *be; + cm->db.bd_info = NULL; SLAP_DBFLAGS(&cm->db) |= SLAP_DBFLAG_NO_SCHEMA_CHECK; cm->db.be_private = NULL; cm->db.bd_self = &cm->db; @@ -4779,7 +4785,7 @@ pcache_db_close( cache_manager *cm = on->on_bi.bi_private; query_manager *qm = cm->qm; QueryTemplate *tm; - int i, rc = 0; + int rc = 0; /* stop the thread ... */ if ( cm->cc_arg ) { @@ -4789,6 +4795,7 @@ pcache_db_close( } ldap_pvt_runqueue_remove( &slapd_rq, cm->cc_arg ); ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex ); + cm->cc_arg = NULL; } if ( cm->save_queries ) { @@ -4860,10 +4867,35 @@ pcache_db_close( cm->db.be_limits = NULL; cm->db.be_acl = NULL; - if ( cm->db.bd_info->bi_db_close ) { rc = cm->db.bd_info->bi_db_close( &cm->db, NULL ); } + +#ifdef PCACHE_MONITOR + if ( rc == LDAP_SUCCESS ) { + rc = pcache_monitor_db_close( be ); + } +#endif /* PCACHE_MONITOR */ + + return rc; +} + +static int +pcache_db_destroy( + BackendDB *be, + ConfigReply *cr +) +{ + slap_overinst *on = (slap_overinst *)be->bd_info; + cache_manager *cm = on->on_bi.bi_private; + query_manager *qm = cm->qm; + QueryTemplate *tm; + int i; + + if ( cm->db.be_private != NULL ) { + backend_stopdown_one( &cm->db ); + } + while ( (tm = qm->templates) != NULL ) { CachedQuery *qc, *qn; qm->templates = tm->qmnext; @@ -4901,29 +4933,6 @@ pcache_db_close( free( qm->attr_sets ); qm->attr_sets = NULL; -#ifdef PCACHE_MONITOR - if ( rc == LDAP_SUCCESS ) { - rc = pcache_monitor_db_close( be ); - } -#endif /* PCACHE_MONITOR */ - - return rc; -} - -static int -pcache_db_destroy( - BackendDB *be, - ConfigReply *cr -) -{ - slap_overinst *on = (slap_overinst *)be->bd_info; - cache_manager *cm = on->on_bi.bi_private; - query_manager *qm = cm->qm; - - if ( cm->db.be_private != NULL ) { - backend_stopdown_one( &cm->db ); - } - ldap_pvt_thread_mutex_destroy( &qm->lru_mutex ); ldap_pvt_thread_mutex_destroy( &cm->cache_mutex ); free( qm );