diff --git a/servers/slapd/filter.c b/servers/slapd/filter.c index 34fa6b9f69..38f99a7f61 100644 --- a/servers/slapd/filter.c +++ b/servers/slapd/filter.c @@ -212,6 +212,10 @@ get_filter( if ( err != LDAP_SUCCESS ) { break; } + if ( f.f_and == NULL ) { + f.f_choice = SLAPD_FILTER_COMPUTED; + f.f_result = LDAP_COMPARE_TRUE; + } /* no assert - list could be empty */ break; @@ -226,6 +230,10 @@ get_filter( if ( err != LDAP_SUCCESS ) { break; } + if ( f.f_or == NULL ) { + f.f_choice = SLAPD_FILTER_COMPUTED; + f.f_result = LDAP_COMPARE_FALSE; + } /* no assert - list could be empty */ break; @@ -243,6 +251,21 @@ get_filter( } assert( f.f_not != NULL ); + if ( f.f_not->f_choice == SLAPD_FILTER_COMPUTED ) { + if ( f.f_not->f_result == LDAP_COMPARE_TRUE ) { + op->o_tmpfree( f.f_not, op->o_tmpmemctx ); + f.f_not = NULL; + f.f_choice = SLAPD_FILTER_COMPUTED; + f.f_result = LDAP_COMPARE_FALSE; + } else if ( f.f_not->f_result == LDAP_COMPARE_FALSE ) { + op->o_tmpfree( f.f_not, op->o_tmpmemctx ); + f.f_not = NULL; + f.f_choice = SLAPD_FILTER_COMPUTED; + f.f_result = LDAP_COMPARE_TRUE; + } + /* Leave UNDEFINED alone */ + } + break; case LDAP_FILTER_EXT: