diff --git a/servers/slapd/back-ldap/map.c b/servers/slapd/back-ldap/map.c index da478356079d84008c0759e535cfc480e9a698b1..0471ad9d363cc37d652fcdc1b332d79b7c695787 100644 --- a/servers/slapd/back-ldap/map.c +++ b/servers/slapd/back-ldap/map.c @@ -453,18 +453,27 @@ ldap_int_back_filter_map_rewrite( ber_memfree( vtmp.bv_val ); } break; - case SLAPD_FILTER_COMPUTED: - ber_str2bv( - f->f_result == LDAP_COMPARE_FALSE ? "(?=false)" : - f->f_result == LDAP_COMPARE_TRUE ? "(?=true)" : - f->f_result == SLAPD_COMPARE_UNDEFINED ? "(?=undefined)" : - "(?=error)", - f->f_result == LDAP_COMPARE_FALSE ? sizeof("(?=false)")-1 : - f->f_result == LDAP_COMPARE_TRUE ? sizeof("(?=true)")-1 : - f->f_result == SLAPD_COMPARE_UNDEFINED ? sizeof("(?=undefined)")-1 : - sizeof("(?=error)")-1, - 1, fstr ); - return LDAP_COMPARE_FALSE; + case SLAPD_FILTER_COMPUTED: { + struct berval bv; + + switch ( f->f_result ) { + default: + ber_str2bv( "(?=error)", sizeof("(?=error)") - 1, + 1, fstr ); + return LDAP_COMPARE_FALSE; + + case LDAP_COMPARE_FALSE: + case SLAPD_COMPARE_UNDEFINED: + BER_BVSTR( &bv, "(!(objectClass=*))" ); + break; + + case LDAP_COMPARE_TRUE: + BER_BVSTR( &bv, "(objectClass=*)" ); + break; + } + + ber_dupbv( fstr, &bv ); + } return LDAP_SUCCESS; default: ber_str2bv( "(?=unknown)", sizeof("(?=unknown)")-1, 1, fstr );