]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/overlays/pcache.c
ITS#6002 fix attrset unparse
[openldap] / servers / slapd / overlays / pcache.c
index b0b7c65c1c4bc4a32d73c4472b1affd1841cbecb..2ad67c2f50ab6406a7ee261fb4bb3296ccfd711c 100644 (file)
@@ -1976,7 +1976,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 +1993,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 );
@@ -2447,7 +2460,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;
                }