]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-meta/map.c
ITS#3796 fix IDL cache lock setup/teardown
[openldap] / servers / slapd / back-meta / map.c
index 29a1ade97f8a47e41cc0c2379ff9755622258ada..87ca4b903175cdae6c7750b8098848d40bea291b 100644 (file)
@@ -483,43 +483,40 @@ ldap_back_int_filter_map_rewrite(
                ber_memfree( vtmp.bv_val );
                break;
 
-       case SLAPD_FILTER_COMPUTED:
+       case SLAPD_FILTER_COMPUTED: {
+               struct berval   bv;
+
                switch ( f->f_result ) {
                case LDAP_COMPARE_FALSE:
                        if ( dc->target->mt_flags & LDAP_BACK_F_SUPPORT_T_F ) {
-                               ber_str2bv( "(|)", STRLENOF( "(|)" ), 1, fstr );
-
-                       } else {
-#if 0
-                               ber_str2bv( "(?=false)", STRLENOF( "(?=false)" ), 1, fstr );
-#endif
-                               /* better than nothing... */
-                               ber_str2bv( "(!(objectClass=*))", STRLENOF( "(!(objectClass=*))" ), 1, fstr );
+                               BER_BVSTR( &bv, "(|)" );
+                               break;
                        }
+                       /* fallthru */
+
+               /* FIXME: treat UNDEFINED as FALSE */
+               case SLAPD_COMPARE_UNDEFINED:
+                       /* better than nothing... */
+                       BER_BVSTR( &bv, "(!(objectClass=*))" );
                        break;
 
                case LDAP_COMPARE_TRUE:
                        if ( dc->target->mt_flags & LDAP_BACK_F_SUPPORT_T_F ) {
-                               ber_str2bv( "(&)", STRLENOF( "(&)" ), 1, fstr );
-
-                       } else {
-#if 0
-                               ber_str2bv( "(?=true)", STRLENOF( "(?=true)" ), 1, fstr );
-#endif
-                               /* better than nothing... */
-                               ber_str2bv( "(objectClass=*)", STRLENOF( "(objectClass=*)" ), 1, fstr );
+                               BER_BVSTR( &bv, "(&)" );
+                               break;
                        }
-                       break;
 
-               case SLAPD_COMPARE_UNDEFINED:
-                       ber_str2bv( "(?=undefined)", STRLENOF( "(?=undefined)" ), 1, fstr );
+                       /* better than nothing... */
+                       BER_BVSTR( &bv, "(objectClass=*)" );
                        break;
 
                default:
-                       ber_str2bv( "(?=error)", STRLENOF( "(?=error)" ), 1, fstr );
+                       BER_BVSTR( &bv, "(?=error)" );
                        break;
                }
-               break;
+
+               ber_dupbv( fstr, &bv );
+               } break;
 
        default:
                ber_str2bv( "(?=unknown)", STRLENOF( "(?=unknown)" ), 1, fstr );
@@ -539,6 +536,7 @@ ldap_back_filter_map_rewrite(
        int             rc;
        dncookie        fdc;
        struct berval   ftmp;
+       static char     *dmy = "";
 
        rc = ldap_back_int_filter_map_rewrite( dc, f, fstr, remap );
 
@@ -553,7 +551,7 @@ ldap_back_filter_map_rewrite(
        fdc.ctx = "searchFilter";
        
        switch ( rewrite_session( fdc.target->mt_rwmap.rwm_rw, fdc.ctx,
-                               ( !BER_BVISEMPTY( &ftmp ) ? ftmp.bv_val : "" ),
+                               ( !BER_BVISEMPTY( &ftmp ) ? ftmp.bv_val : dmy ),
                                fdc.conn, &fstr->bv_val ) )
        {
        case REWRITE_REGEXEC_OK:
@@ -586,6 +584,10 @@ ldap_back_filter_map_rewrite(
                rc = LDAP_OTHER;
                break;
        }
+
+       if ( fstr->bv_val == dmy ) {
+               BER_BVZERO( fstr );
+       }
 #endif /* ENABLE_REWRITE */
 
        return rc;