]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/overlays/pcache.c
Happy New Year
[openldap] / servers / slapd / overlays / pcache.c
index 1fa8d1ede429d10ce96fb3f1faf6c5f0ab386083..166ca48a2a23655b9f3f599bb629384ff8cc8b59 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 2003-2013 The OpenLDAP Foundation.
+ * Copyright 2003-2018 The OpenLDAP Foundation.
  * Portions Copyright 2003 IBM Corporation.
  * Portions Copyright 2003-2009 Symas Corporation.
  * All rights reserved.
@@ -457,8 +457,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;
@@ -470,6 +475,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;
                }
@@ -565,6 +571,7 @@ bottom:
        }
        if ( !t_cnt ) {
                *text = "couldn't parse template";
+               ch_free(attrs);
                return -1;
        }
        if ( !got_oc && !( set->flags & PC_GOT_OC )) {
@@ -2834,7 +2841,7 @@ pcache_op_bind(
        QueryTemplate *temp;
        Entry *e;
        slap_callback   cb = { 0 }, *sc;
-       bindinfo bi;
+       bindinfo bi = { 0 };
        bindcacheinfo *bci;
        Operation op2;
        int rc;
@@ -2864,7 +2871,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;
@@ -2893,11 +2899,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;
@@ -2933,6 +2936,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;
@@ -3125,6 +3129,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;
@@ -4497,6 +4502,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;
@@ -4782,7 +4788,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 ) {
@@ -4792,6 +4798,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 ) {
@@ -4863,10 +4870,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;
@@ -4904,29 +4936,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 );