From 13c70ed4100308b3a39170bbeb65f8d79be43639 Mon Sep 17 00:00:00 2001 From: Kurt Zeilenga Date: Sat, 15 May 2004 19:26:48 +0000 Subject: [PATCH] fix up error handling, including disallowing sync+pagedResults combinations. --- servers/slapd/controls.c | 45 +++++++++++++++++++++++++--------------- 1 file changed, 28 insertions(+), 17 deletions(-) diff --git a/servers/slapd/controls.c b/servers/slapd/controls.c index 1a82d7f776..aafb2b6359 100644 --- a/servers/slapd/controls.c +++ b/servers/slapd/controls.c @@ -348,8 +348,7 @@ find_ctrl( const char *oid ) void slap_free_ctrls( Operation *op, - LDAPControl **ctrls -) + LDAPControl **ctrls ) { int i; @@ -582,8 +581,8 @@ int get_ctrls( if( sc->sc_extendedops != NULL ) { int i; for( i=0; sc->sc_extendedops[i] != NULL; i++ ) { - if( strcmp( op->ore_reqoid.bv_val, sc->sc_extendedops[i] ) - == 0 ) + if( strcmp( op->ore_reqoid.bv_val, + sc->sc_extendedops[i] ) == 0 ) { tagmask=0L; break; @@ -607,7 +606,7 @@ int get_ctrls( } rs->sr_err = sc->sc_parse( op, rs, c ); - + assert( rs->sr_err != LDAP_UNAVAILABLE_CRITICAL_EXTENSION ); if( rs->sr_err != LDAP_SUCCESS ) goto return_results; if ( sc->sc_mask & SLAP_CTRL_FRONTEND ) { @@ -666,7 +665,7 @@ static int parseModifyIncrement ( LDAPControl *ctrl ) { #if 0 - if ( op->o_parseModifyIncrement != SLAP_NO_CONTROL ) { + if ( op->o_modifyIncrement != SLAP_NO_CONTROL ) { rs->sr_text = "modifyIncrement control specified multiple times"; return LDAP_PROTOCOL_ERROR; } @@ -678,7 +677,7 @@ static int parseModifyIncrement ( } #if 0 - op->o_parseModifyIncrement = ctrl->ldctl_iscritical + op->o_modifyIncrement = ctrl->ldctl_iscritical ? SLAP_CRITICAL_CONTROL : SLAP_NONCRITICAL_CONTROL; #endif @@ -850,6 +849,11 @@ static int parsePagedResults ( return LDAP_PROTOCOL_ERROR; } + if ( op->o_sync != SLAP_NO_CONTROL ) { + rs->sr_text = "paged results control specified with sync control"; + return LDAP_PROTOCOL_ERROR; + } + if ( ctrl->ldctl_value.bv_len == 0 ) { rs->sr_text = "paged results control value is empty (or absent)"; return LDAP_PROTOCOL_ERROR; @@ -1284,7 +1288,8 @@ static int parseSearchOptions ( if ( search_flags & LDAP_SEARCH_FLAG_DOMAIN_SCOPE ) { if ( op->o_domain_scope != SLAP_NO_CONTROL ) { - rs->sr_text = "searchOptions control specified multiple times or with domainScope control"; + rs->sr_text = "searchOptions control specified multiple times " + "or with domainScope control"; return LDAP_PROTOCOL_ERROR; } @@ -1295,8 +1300,8 @@ static int parseSearchOptions ( if ( search_flags & ~(LDAP_SEARCH_FLAG_DOMAIN_SCOPE) ) { /* Other search flags not recognised so far */ - rs->sr_text = "searchOptions contained invalid flag"; - return LDAP_UNAVAILABLE_CRITICAL_EXTENSION; + rs->sr_text = "searchOptions contained unrecongized flag"; + return LDAP_UNWILLING_TO_PERFORM; } return LDAP_SUCCESS; @@ -1315,12 +1320,18 @@ static int parseLDAPsync ( struct slap_session_entry *se; if ( op->o_sync != SLAP_NO_CONTROL ) { - rs->sr_text = "LDAP Sync control specified multiple times"; + rs->sr_text = "Sync control specified multiple times"; return LDAP_PROTOCOL_ERROR; } + if ( op->o_pagedresults != SLAP_NO_CONTROL ) { + rs->sr_text = "Sync control specified with pagedResults control"; + return LDAP_PROTOCOL_ERROR; + } + + if ( ctrl->ldctl_value.bv_len == 0 ) { - rs->sr_text = "LDAP Sync control value is empty (or absent)"; + rs->sr_text = "Sync control value is empty (or absent)"; return LDAP_PROTOCOL_ERROR; } @@ -1343,7 +1354,7 @@ static int parseLDAPsync ( } if ( (tag = ber_scanf( ber, "{i" /*}*/, &mode )) == LBER_ERROR ) { - rs->sr_text = "LDAP Sync control : mode decoding error"; + rs->sr_text = "Sync control : mode decoding error"; return LDAP_PROTOCOL_ERROR; } @@ -1355,7 +1366,7 @@ static int parseLDAPsync ( mode = SLAP_SYNC_REFRESH_AND_PERSIST; break; default: - rs->sr_text = "LDAP Sync control : unknown update mode"; + rs->sr_text = "Sync control : unknown update mode"; return LDAP_PROTOCOL_ERROR; } @@ -1364,7 +1375,7 @@ static int parseLDAPsync ( if ( tag == LDAP_TAG_SYNC_COOKIE ) { struct berval tmp_bv; if (( ber_scanf( ber, /*{*/ "o", &tmp_bv )) == LBER_ERROR ) { - rs->sr_text = "LDAP Sync control : cookie decoding error"; + rs->sr_text = "Sync control : cookie decoding error"; return LDAP_PROTOCOL_ERROR; } ber_bvarray_add( &op->o_sync_state.octet_str, &tmp_bv ); @@ -1372,12 +1383,12 @@ static int parseLDAPsync ( } if ( tag == LDAP_TAG_RELOAD_HINT ) { if (( ber_scanf( ber, /*{*/ "b", &op->o_sync_rhint )) == LBER_ERROR ) { - rs->sr_text = "LDAP Sync control : rhint decoding error"; + rs->sr_text = "Sync control : rhint decoding error"; return LDAP_PROTOCOL_ERROR; } } if (( ber_scanf( ber, /*{*/ "}")) == LBER_ERROR ) { - rs->sr_text = "LDAP Sync control : decoding error"; + rs->sr_text = "Sync control : decoding error"; return LDAP_PROTOCOL_ERROR; } -- 2.39.5