]> git.sur5r.net Git - openldap/commitdiff
fix up error handling, including disallowing sync+pagedResults combinations.
authorKurt Zeilenga <kurt@openldap.org>
Sat, 15 May 2004 19:26:48 +0000 (19:26 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Sat, 15 May 2004 19:26:48 +0000 (19:26 +0000)
servers/slapd/controls.c

index 1a82d7f776f32de4c52c1d957c4bd1c9e15e8c67..aafb2b6359c0805e7086bb6b5fffd6ebc880b5b4 100644 (file)
@@ -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;
        }