]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/overlays/pcache.c
Fix last commit: C90 rejects declaration after code
[openldap] / servers / slapd / overlays / pcache.c
index 235d0f9c2aa006ee20f913f03032299b49450bb2..3a1a5fa60b0732f46adc6bcc7659b0f40de63ced 100644 (file)
@@ -1175,6 +1175,8 @@ free_query (CachedQuery* qc)
 {
        free(qc->q_uuid.bv_val);
        filter_free(qc->filter);
+       ldap_pvt_thread_rdwr_destroy( &qc->rwlock );
+       memset(qc, 0, sizeof(*qc));
        free(qc);
 }
 
@@ -1264,6 +1266,7 @@ add_query(
                new_cached_query = find_filter( op, qbase->scopes[query->scope],
                                                        query->filter, first );
                filter_free( query->filter );
+               query->filter = NULL;
        }
        Debug( pcache_debug, "TEMPLATE %p QUERIES++ %d\n",
                        (void *) templ, templ->no_of_queries, 0 );
@@ -1602,7 +1605,7 @@ filter2template(
                (*filter_attrs)[*filter_cnt].an_desc = ad;
                (*filter_attrs)[*filter_cnt].an_name = ad->ad_cname;
                (*filter_attrs)[*filter_cnt].an_oc = NULL;
-               (*filter_attrs)[*filter_cnt].an_oc_exclude = 0;
+               (*filter_attrs)[*filter_cnt].an_flags = 0;
                BER_BVZERO( &(*filter_attrs)[*filter_cnt+1].an_name );
                (*filter_cnt)++;
                if ( ad == slap_schema.si_ad_objectClass )
@@ -1976,7 +1979,7 @@ pcache_op_cleanup( Operation *op, SlapReply *rs ) {
                Entry *e;
 
                /* don't return more entries than requested by the client */
-               if ( si->slimit && rs->sr_nentries >= si->slimit ) {
+               if ( si->slimit > 0 && rs->sr_nentries >= si->slimit ) {
                        si->slimit_exceeded = 1;
                }
 
@@ -1993,6 +1996,19 @@ pcache_op_cleanup( Operation *op, SlapReply *rs ) {
                                goto over;
                        }
 
+                       /* check for malformed entries: attrs with no values */
+                       {
+                               Attribute *a = rs->sr_entry->e_attrs;
+                               for (; a; a=a->a_next) {
+                                       if ( !a->a_numvals ) {
+                                               Debug( pcache_debug, "%s: query not cacheable because of attrs without values in DN \"%s\" (%s)\n",
+                                               op->o_log_prefix, rs->sr_entry->e_name.bv_val,
+                                               a->a_desc->ad_cname.bv_val );
+                                               goto over;
+                                       }
+                               }
+                       }
+
                        if ( si->count < si->max ) {
                                si->count++;
                                e = entry_dup( rs->sr_entry );
@@ -2168,8 +2184,8 @@ add_filter_attrs(
                (*new_attrs)[i].an_desc = attrs->attrs[i].an_desc;
        }
        BER_BVZERO( &(*new_attrs)[i].an_name );
-       alluser = an_find(*new_attrs, &AllUser);
-       allop = an_find(*new_attrs, &AllOper);
+       alluser = an_find( *new_attrs, slap_bv_all_user_attrs );
+       allop = an_find( *new_attrs, slap_bv_all_operational_attrs );
 
        j = i;
        for ( i=0; i<fattr_cnt; i++ ) {
@@ -2186,14 +2202,14 @@ add_filter_attrs(
                (*new_attrs)[j].an_name = filter_attrs[i].an_name;
                (*new_attrs)[j].an_desc = filter_attrs[i].an_desc;
                (*new_attrs)[j].an_oc = NULL;
-               (*new_attrs)[j].an_oc_exclude = 0;
+               (*new_attrs)[j].an_flags = 0;
                j++;
        }
        if ( addoc ) {
                (*new_attrs)[j].an_name = slap_schema.si_ad_objectClass->ad_cname;
                (*new_attrs)[j].an_desc = slap_schema.si_ad_objectClass;
                (*new_attrs)[j].an_oc = NULL;
-               (*new_attrs)[j].an_oc_exclude = 0;
+               (*new_attrs)[j].an_flags = 0;
                j++;
        }
        BER_BVZERO( &(*new_attrs)[j].an_name );
@@ -2383,8 +2399,6 @@ pcache_op_search(
        op->o_tmpfree( tempstr.bv_val, op->o_tmpmemctx );
 
        if (answerable) {
-               /* Need to clear the callbacks of the original operation,
-                * in case there are other overlays */
                BackendDB       *save_bd = op->o_bd;
                slap_callback   *save_cb = op->o_callback;
 
@@ -2397,7 +2411,12 @@ pcache_op_search(
                        send_ldap_result( op, rs );
                } else {
                        op->o_bd = &cm->db;
-                       op->o_callback = NULL;
+                       if ( cm->response_cb == PCACHE_RESPONSE_CB_TAIL ) {
+                               /* The cached entry was already processed by any
+                                * other overlays, so don't let it get processed again.
+                                */
+                               op->o_callback = NULL;
+                       }
                        i = cm->db.bd_info->bi_op_search( op, rs );
                }
                ldap_pvt_thread_rdwr_runlock(&answerable->rwlock);
@@ -2447,7 +2466,7 @@ pcache_op_search(
                si->slimit = 0;
                si->slimit_exceeded = 0;
                si->caching_reason = PC_IGNORE;
-               if ( op->ors_slimit && op->ors_slimit < cm->num_entries_limit ) {
+               if ( op->ors_slimit > 0 && op->ors_slimit < cm->num_entries_limit ) {
                        si->slimit = op->ors_slimit;
                        op->ors_slimit = cm->num_entries_limit;
                }
@@ -2737,7 +2756,8 @@ pc_cfadd( Operation *op, SlapReply *rs, Entry *p, ConfigArgs *ca )
 
        /* FIXME: should not hardcode "olcDatabase" here */
        bv.bv_len = snprintf( ca->cr_msg, sizeof( ca->cr_msg ),
-               "olcDatabase=%s", cm->db.bd_info->bi_type );
+               "olcDatabase=" SLAP_X_ORDERED_FMT "%s",
+               0, cm->db.bd_info->bi_type );
        if ( bv.bv_len >= sizeof( ca->cr_msg ) ) {
                return -1;
        }
@@ -3019,7 +3039,7 @@ pc_cf_gen( ConfigArgs *c )
                                        attr_name->an_name = attr_name->an_desc->ad_cname;
                                }
                                attr_name->an_oc = NULL;
-                               attr_name->an_oc_exclude = 0;
+                               attr_name->an_flags = 0;
                                if ( attr_name->an_desc == slap_schema.si_ad_objectClass )
                                        qm->attr_sets[num].flags |= PC_GOT_OC;
                                attr_name++;