More ITS#5734: Handle empty o_req_ndn. flags=>flags&LDAP_LIMITS_MASK in a test.

This commit is contained in:
Hallvard Furuseth 2008-10-24 18:16:43 +00:00
parent dffe8d37fa
commit 0f22e6bb04

View File

@ -67,6 +67,7 @@ limits_get(
struct slap_limits_set **limit struct slap_limits_set **limit
) )
{ {
static struct berval empty_dn = BER_BVC( "" );
struct slap_limits **lm; struct slap_limits **lm;
struct berval *ndns[2]; struct berval *ndns[2];
@ -95,12 +96,19 @@ limits_get(
unsigned isthis = type == SLAP_LIMITS_TYPE_THIS; unsigned isthis = type == SLAP_LIMITS_TYPE_THIS;
struct berval *ndn = ndns[isthis]; struct berval *ndn = ndns[isthis];
switch ( style ) { if ( style == SLAP_LIMITS_ANY )
case SLAP_LIMITS_EXACT: goto found_any;
if ( BER_BVISEMPTY( ndn ) ) { if ( BER_BVISEMPTY( ndn ) ) {
break; if ( style == SLAP_LIMITS_ANONYMOUS )
goto found_nodn;
if ( !isthis )
continue;
ndn = &empty_dn;
} }
switch ( style ) {
case SLAP_LIMITS_EXACT:
if ( type == SLAP_LIMITS_TYPE_GROUP ) { if ( type == SLAP_LIMITS_TYPE_GROUP ) {
int rc = backend_group( op, NULL, int rc = backend_group( op, NULL,
&lm[0]->lm_pat, ndn, &lm[0]->lm_pat, ndn,
@ -121,10 +129,6 @@ limits_get(
case SLAP_LIMITS_CHILDREN: { case SLAP_LIMITS_CHILDREN: {
ber_len_t d; ber_len_t d;
if ( BER_BVISEMPTY( ndn ) ) {
break;
}
/* ndn shorter than lm_pat */ /* ndn shorter than lm_pat */
if ( ndn->bv_len < lm[0]->lm_pat.bv_len ) { if ( ndn->bv_len < lm[0]->lm_pat.bv_len ) {
break; break;
@ -159,33 +163,19 @@ limits_get(
} }
case SLAP_LIMITS_REGEX: case SLAP_LIMITS_REGEX:
if ( BER_BVISEMPTY( ndn ) ) {
break;
}
if ( regexec( &lm[0]->lm_regex, ndn->bv_val, 0, NULL, 0 ) == 0 ) { if ( regexec( &lm[0]->lm_regex, ndn->bv_val, 0, NULL, 0 ) == 0 ) {
goto found_dn; goto found_dn;
} }
break; break;
case SLAP_LIMITS_ANONYMOUS: case SLAP_LIMITS_ANONYMOUS:
if ( BER_BVISEMPTY( ndn ) ) {
goto found;
}
break; break;
case SLAP_LIMITS_USERS: case SLAP_LIMITS_USERS:
if ( !BER_BVISEMPTY( ndn ) ) { found_nodn:
goto found;
}
break;
case SLAP_LIMITS_ANY:
*limit = &lm[0]->lm_limits;
return( 0 );
found:
Debug( LDAP_DEBUG_TRACE, "<== limits_get: type=%s match=%s\n", Debug( LDAP_DEBUG_TRACE, "<== limits_get: type=%s match=%s\n",
dn_source[isthis], limits2str( style ), 0 ); dn_source[isthis], limits2str( style ), 0 );
found_any:
*limit = &lm[0]->lm_limits; *limit = &lm[0]->lm_limits;
return( 0 ); return( 0 );
@ -461,15 +451,7 @@ limits_parse(
} }
/* pre-check the data */ /* pre-check the data */
switch ( flags ) { if ( pattern != NULL ) {
case SLAP_LIMITS_ANONYMOUS:
case SLAP_LIMITS_USERS:
/* no need for pattern */
pattern = NULL;
break;
default:
if ( pattern[0] != '=' ) { if ( pattern[0] != '=' ) {
Debug( LDAP_DEBUG_ANY, Debug( LDAP_DEBUG_ANY,
"%s : line %d: missing '=' in " "%s : line %d: missing '=' in "
@ -490,7 +472,7 @@ limits_parse(
flags = SLAP_LIMITS_ANY; flags = SLAP_LIMITS_ANY;
pattern = NULL; pattern = NULL;
} else if ( flags == SLAP_LIMITS_REGEX } else if ( (flags & SLAP_LIMITS_MASK) == SLAP_LIMITS_REGEX
&& strcmp( pattern, ".*" ) == 0 ) { && strcmp( pattern, ".*" ) == 0 ) {
flags = SLAP_LIMITS_ANY; flags = SLAP_LIMITS_ANY;
pattern = NULL; pattern = NULL;