]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/controls.c
- use STRLENOF, looks cleaner
[openldap] / servers / slapd / controls.c
index eb624f00ce42fa0d28a1a833623d9b58431b3a3e..b6c356e7413293b2f07234363f799e970749b2e3 100644 (file)
 #include "../../libraries/liblber/lber-int.h"
 
 static SLAP_CTRL_PARSE_FN parseAssert;
-static SLAP_CTRL_PARSE_FN parsePreRead;
-static SLAP_CTRL_PARSE_FN parsePostRead;
-static SLAP_CTRL_PARSE_FN parseProxyAuthz;
-#ifdef LDAP_DEVEL
+static SLAP_CTRL_PARSE_FN parseDomainScope;
 static SLAP_CTRL_PARSE_FN parseDontUseCopy;
-static SLAP_CTRL_PARSE_FN parseManageDIT;
-#endif
 static SLAP_CTRL_PARSE_FN parseManageDSAit;
 static SLAP_CTRL_PARSE_FN parseNoOp;
 static SLAP_CTRL_PARSE_FN parsePagedResults;
-#ifdef LDAP_DEVEL
+static SLAP_CTRL_PARSE_FN parsePermissiveModify;
+static SLAP_CTRL_PARSE_FN parsePreRead, parsePostRead;
+static SLAP_CTRL_PARSE_FN parseProxyAuthz;
+static SLAP_CTRL_PARSE_FN parseRelax;
+static SLAP_CTRL_PARSE_FN parseSearchOptions;
+#ifdef SLAP_SORTEDRESULTS
 static SLAP_CTRL_PARSE_FN parseSortedResults;
 #endif
-static SLAP_CTRL_PARSE_FN parseValuesReturnFilter;
-static SLAP_CTRL_PARSE_FN parsePermissiveModify;
-static SLAP_CTRL_PARSE_FN parseDomainScope;
+static SLAP_CTRL_PARSE_FN parseSubentries;
 #ifdef SLAP_CONTROL_X_TREE_DELETE
 static SLAP_CTRL_PARSE_FN parseTreeDelete;
 #endif
-static SLAP_CTRL_PARSE_FN parseSearchOptions;
-static SLAP_CTRL_PARSE_FN parseSubentries;
+static SLAP_CTRL_PARSE_FN parseValuesReturnFilter;
 
 #undef sc_mask /* avoid conflict with Irix 6.5 <sys/signal.h> */
 
@@ -133,7 +130,7 @@ static struct slap_control control_defs[] = {
                SLAP_CTRL_SEARCH,
                NULL, NULL,
                parsePagedResults, LDAP_SLIST_ENTRY_INITIALIZER(next) },
-#ifdef LDAP_DEVEL
+#ifdef SLAP_SORTEDRESULTS
        { LDAP_CONTROL_SORTREQUEST,
                (int)offsetof(struct slap_control_ids, sc_sortedResults),
                SLAP_CTRL_GLOBAL|SLAP_CTRL_SEARCH|SLAP_CTRL_HIDE,
@@ -145,6 +142,11 @@ static struct slap_control control_defs[] = {
                SLAP_CTRL_GLOBAL|SLAP_CTRL_SEARCH|SLAP_CTRL_HIDE,
                NULL, NULL,
                parseDomainScope, LDAP_SLIST_ENTRY_INITIALIZER(next) },
+       { LDAP_CONTROL_DONTUSECOPY,
+               (int)offsetof(struct slap_control_ids, sc_dontUseCopy),
+               SLAP_CTRL_GLOBAL|SLAP_CTRL_INTROGATE|SLAP_CTRL_HIDE,
+               NULL, NULL,
+               parseDontUseCopy, LDAP_SLIST_ENTRY_INITIALIZER(next) },
        { LDAP_CONTROL_X_PERMISSIVE_MODIFY,
                (int)offsetof(struct slap_control_ids, sc_permissiveModify),
                SLAP_CTRL_MODIFY|SLAP_CTRL_HIDE,
@@ -172,18 +174,11 @@ static struct slap_control control_defs[] = {
                SLAP_CTRL_ACCESS|SLAP_CTRL_HIDE,
                NULL, NULL,
                parseNoOp, LDAP_SLIST_ENTRY_INITIALIZER(next) },
-#ifdef LDAP_DEVEL
-       { LDAP_CONTROL_DONTUSECOPY,
-               (int)offsetof(struct slap_control_ids, sc_dontUseCopy),
-               SLAP_CTRL_INTROGATE|SLAP_CTRL_HIDE,
-               NULL, NULL,
-               parseDontUseCopy, LDAP_SLIST_ENTRY_INITIALIZER(next) },
-       { LDAP_CONTROL_MANAGEDIT,
-               (int)offsetof(struct slap_control_ids, sc_manageDIT),
+       { LDAP_CONTROL_RELAX,
+               (int)offsetof(struct slap_control_ids, sc_relax),
                SLAP_CTRL_GLOBAL|SLAP_CTRL_UPDATE|SLAP_CTRL_HIDE,
                NULL, NULL,
-               parseManageDIT, LDAP_SLIST_ENTRY_INITIALIZER(next) },
-#endif
+               parseRelax, LDAP_SLIST_ENTRY_INITIALIZER(next) },
 #ifdef LDAP_X_TXN
        { LDAP_CONTROL_X_TXN_SPEC,
                (int)offsetof(struct slap_control_ids, sc_txnSpec),
@@ -420,7 +415,7 @@ get_supported_controls(char ***ctrloidsp,
        }
        masks = (slap_mask_t *)SLAP_MALLOC( (n + 1) * sizeof(slap_mask_t) );
        if  ( masks == NULL ) {
-               ch_free( oids );
+               SLAP_FREE( oids );
                return LDAP_NO_MEMORY;
        }
 
@@ -844,7 +839,6 @@ slap_remove_control(
        return rs->sr_err;
 }
 
-#ifdef LDAP_DEVEL
 static int parseDontUseCopy (
        Operation *op,
        SlapReply *rs,
@@ -860,7 +854,7 @@ static int parseDontUseCopy (
                return LDAP_PROTOCOL_ERROR;
        }
 
-       if ( ctrl->ldctl_iscritical != SLAP_CONTROL_CRITICAL ) {
+       if ( !ctrl->ldctl_iscritical ) {
                rs->sr_text = "dontUseCopy criticality of FALSE not allowed";
                return LDAP_PROTOCOL_ERROR;
        }
@@ -869,28 +863,27 @@ static int parseDontUseCopy (
        return LDAP_SUCCESS;
 }
 
-static int parseManageDIT (
+static int parseRelax (
        Operation *op,
        SlapReply *rs,
        LDAPControl *ctrl )
 {
-       if ( op->o_managedit != SLAP_CONTROL_NONE ) {
-               rs->sr_text = "manageDIT control specified multiple times";
+       if ( op->o_relax != SLAP_CONTROL_NONE ) {
+               rs->sr_text = "relax control specified multiple times";
                return LDAP_PROTOCOL_ERROR;
        }
 
        if ( ctrl->ldctl_value.bv_len ) {
-               rs->sr_text = "manageDIT control value not empty";
+               rs->sr_text = "relax control value not empty";
                return LDAP_PROTOCOL_ERROR;
        }
 
-       op->o_managedit = ctrl->ldctl_iscritical
+       op->o_relax = ctrl->ldctl_iscritical
                ? SLAP_CONTROL_CRITICAL
                : SLAP_CONTROL_NONCRITICAL;
 
        return LDAP_SUCCESS;
 }
-#endif
 
 static int parseManageDSAit (
        Operation *op,
@@ -1107,7 +1100,7 @@ done:;
        return rc;
 }
 
-#ifdef LDAP_DEVEL
+#ifdef SLAP_SORTEDRESULTS
 static int parseSortedResults (
        Operation *op,
        SlapReply *rs,
@@ -1161,6 +1154,7 @@ static int parseAssert (
        
        rs->sr_err = get_filter( op, ber, (Filter **)&(op->o_assertion),
                &rs->sr_text);
+       (void) ber_free( ber, 1 );
        if( rs->sr_err != LDAP_SUCCESS ) {
                if( rs->sr_err == SLAPD_DISCONNECT ) {
                        rs->sr_err = LDAP_PROTOCOL_ERROR;
@@ -1223,26 +1217,28 @@ static int parsePreRead (
                return LDAP_OTHER;
        }
 
+       rs->sr_err = LDAP_SUCCESS;
+
        siz = sizeof( AttributeName );
        off = offsetof( AttributeName, an_name );
        if ( ber_scanf( ber, "{M}", &an, &siz, off ) == LBER_ERROR ) {
                rs->sr_text = "preread control: decoding error";
-               return LDAP_PROTOCOL_ERROR;
+               rs->sr_err = LDAP_PROTOCOL_ERROR;
+               goto done;
        }
 
        for( i=0; i<siz; i++ ) {
-               int             rc = LDAP_SUCCESS;
                const char      *dummy = NULL;
 
                an[i].an_desc = NULL;
                an[i].an_oc = NULL;
                an[i].an_oc_exclude = 0;
-               rc = slap_bv2ad( &an[i].an_name, &an[i].an_desc, &dummy );
-               if ( rc != LDAP_SUCCESS && ctrl->ldctl_iscritical ) {
+               rs->sr_err = slap_bv2ad( &an[i].an_name, &an[i].an_desc, &dummy );
+               if ( rs->sr_err != LDAP_SUCCESS && ctrl->ldctl_iscritical ) {
                        rs->sr_text = dummy
                                ? dummy
                                : "postread control: unknown attributeType";
-                       return rc;
+                       goto done;
                }
        }
 
@@ -1252,8 +1248,9 @@ static int parsePreRead (
 
        op->o_preread_attrs = an;
 
-       rs->sr_err = LDAP_SUCCESS;
-       return LDAP_SUCCESS;
+done:
+       (void) ber_free( ber, 1 );
+       return rs->sr_err;
 }
 
 static int parsePostRead (
@@ -1288,26 +1285,27 @@ static int parsePostRead (
                return LDAP_OTHER;
        }
 
+       rs->sr_err = LDAP_SUCCESS;
        siz = sizeof( AttributeName );
        off = offsetof( AttributeName, an_name );
        if ( ber_scanf( ber, "{M}", &an, &siz, off ) == LBER_ERROR ) {
                rs->sr_text = "postread control: decoding error";
-               return LDAP_PROTOCOL_ERROR;
+               rs->sr_err = LDAP_PROTOCOL_ERROR;
+               goto done;
        }
 
        for( i=0; i<siz; i++ ) {
-               int             rc = LDAP_SUCCESS;
                const char      *dummy = NULL;
 
                an[i].an_desc = NULL;
                an[i].an_oc = NULL;
                an[i].an_oc_exclude = 0;
-               rc = slap_bv2ad( &an[i].an_name, &an[i].an_desc, &dummy );
-               if ( rc != LDAP_SUCCESS && ctrl->ldctl_iscritical ) {
+               rs->sr_err = slap_bv2ad( &an[i].an_name, &an[i].an_desc, &dummy );
+               if ( rs->sr_err != LDAP_SUCCESS && ctrl->ldctl_iscritical ) {
                        rs->sr_text = dummy
                                ? dummy
                                : "postread control: unknown attributeType";
-                       return rc;
+                       goto done;
                }
        }
 
@@ -1317,8 +1315,9 @@ static int parsePostRead (
 
        op->o_postread_attrs = an;
 
-       rs->sr_err = LDAP_SUCCESS;
-       return LDAP_SUCCESS;
+done:
+       (void) ber_free( ber, 1 );
+       return rs->sr_err;
 }
 
 static int parseValuesReturnFilter (
@@ -1348,6 +1347,8 @@ static int parseValuesReturnFilter (
        rs->sr_err = get_vrFilter( op, ber,
                (ValuesReturnFilter **)&(op->o_vrFilter), &rs->sr_text);
 
+       (void) ber_free( ber, 1 );
+
        if( rs->sr_err != LDAP_SUCCESS ) {
                if( rs->sr_err == SLAPD_DISCONNECT ) {
                        rs->sr_err = LDAP_PROTOCOL_ERROR;
@@ -1494,13 +1495,14 @@ static int parseSearchOptions (
                return LDAP_OTHER;
        }
 
-       if ( (tag = ber_scanf( ber, "{i}", &search_flags )) == LBER_ERROR ) {
+       tag = ber_scanf( ber, "{i}", &search_flags );
+       (void) ber_free( ber, 1 );
+
+       if ( tag == LBER_ERROR ) {
                rs->sr_text = "searchOptions control decoding error";
                return LDAP_PROTOCOL_ERROR;
        }
 
-       (void) ber_free( ber, 1 );
-
        if ( search_flags & LDAP_SEARCH_FLAG_DOMAIN_SCOPE ) {
                if ( op->o_domain_scope != SLAP_CONTROL_NONE ) {
                        rs->sr_text = "searchOptions control specified multiple times "