X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fcontrols.c;h=ea2ecba0ec2edea11f055924a6459c27ad792789;hb=eb6b2650091656bde96fbbdb87a5b8154cdc319b;hp=48a2640156409a3e12d180d841aea5fe7e16e295;hpb=a1eb25c595d9c13beab074dfa872b6a9def6b36f;p=openldap
diff --git a/servers/slapd/controls.c b/servers/slapd/controls.c
index 48a2640156..ea2ecba0ec 100644
--- a/servers/slapd/controls.c
+++ b/servers/slapd/controls.c
@@ -1,7 +1,7 @@
/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software .
*
- * Copyright 1998-2006 The OpenLDAP Foundation.
+ * Copyright 1998-2007 The OpenLDAP Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -25,29 +25,24 @@
#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 SLAP_DONTUSECOPY
+static SLAP_CTRL_PARSE_FN parseDomainScope;
static SLAP_CTRL_PARSE_FN parseDontUseCopy;
-#endif
-#ifdef SLAP_RELAX
-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;
+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 */
@@ -147,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,
@@ -174,20 +174,11 @@ static struct slap_control control_defs[] = {
SLAP_CTRL_ACCESS|SLAP_CTRL_HIDE,
NULL, NULL,
parseNoOp, LDAP_SLIST_ENTRY_INITIALIZER(next) },
-#ifdef SLAP_DONTUSECOPY
- { 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) },
-#endif
-#ifdef SLAP_RELAX
{ LDAP_CONTROL_RELAX,
- (int)offsetof(struct slap_control_ids, sc_manageDIT),
+ (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),
@@ -848,7 +839,6 @@ slap_remove_control(
return rs->sr_err;
}
-#ifdef SLAP_DONTUSECOPY
static int parseDontUseCopy (
Operation *op,
SlapReply *rs,
@@ -859,8 +849,8 @@ static int parseDontUseCopy (
return LDAP_PROTOCOL_ERROR;
}
- if ( ctrl->ldctl_value.bv_len ) {
- rs->sr_text = "dontUseCopy control value not empty";
+ if ( !BER_BVISNULL( &ctrl->ldctl_value )) {
+ rs->sr_text = "dontUseCopy control value not absent";
return LDAP_PROTOCOL_ERROR;
}
@@ -872,31 +862,28 @@ static int parseDontUseCopy (
op->o_dontUseCopy = SLAP_CONTROL_CRITICAL;
return LDAP_SUCCESS;
}
-#endif
-#ifdef SLAP_RELAX
-static int parseManageDIT (
+static int parseRelax (
Operation *op,
SlapReply *rs,
LDAPControl *ctrl )
{
- if ( op->o_managedit != SLAP_CONTROL_NONE ) {
+ 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 = "relax control value not empty";
+ if ( !BER_BVISNULL( &ctrl->ldctl_value )) {
+ rs->sr_text = "relax control value not absent";
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,
@@ -908,8 +895,8 @@ static int parseManageDSAit (
return LDAP_PROTOCOL_ERROR;
}
- if ( ctrl->ldctl_value.bv_len ) {
- rs->sr_text = "manageDSAit control value not empty";
+ if ( !BER_BVISNULL( &ctrl->ldctl_value )) {
+ rs->sr_text = "manageDSAit control value not absent";
return LDAP_PROTOCOL_ERROR;
}
@@ -933,6 +920,11 @@ static int parseProxyAuthz (
return LDAP_PROTOCOL_ERROR;
}
+ if ( BER_BVISNULL( &ctrl->ldctl_value )) {
+ rs->sr_text = "proxy authorization control value absent";
+ return LDAP_PROTOCOL_ERROR;
+ }
+
if ( !( global_allows & SLAP_ALLOW_PROXY_AUTHZ_ANON )
&& BER_BVISEMPTY( &op->o_ndn ) )
{
@@ -950,7 +942,7 @@ static int parseProxyAuthz (
ctrl->ldctl_value.bv_len ? ctrl->ldctl_value.bv_val : "anonymous",
0 );
- if ( ctrl->ldctl_value.bv_len == 0 ) {
+ if ( BER_BVISEMPTY( &ctrl->ldctl_value )) {
Debug( LDAP_DEBUG_TRACE,
"parseProxyAuthz: conn=%lu anonymous\n",
op->o_connid, 0, 0 );
@@ -1004,7 +996,6 @@ static int parseProxyAuthz (
op->o_ndn = dn;
ber_dupbv( &op->o_dn, &dn );
-
Statslog( LDAP_DEBUG_STATS, "%s PROXYAUTHZ dn=\"%s\"\n",
op->o_log_prefix, dn.bv_val, 0, 0, 0 );
@@ -1050,8 +1041,13 @@ static int parsePagedResults (
return LDAP_PROTOCOL_ERROR;
}
+ if ( BER_BVISNULL( &ctrl->ldctl_value ) ) {
+ rs->sr_text = "paged results control value is absent";
+ return LDAP_PROTOCOL_ERROR;
+ }
+
if ( BER_BVISEMPTY( &ctrl->ldctl_value ) ) {
- rs->sr_text = "paged results control value is empty (or absent)";
+ rs->sr_text = "paged results control value is empty";
return LDAP_PROTOCOL_ERROR;
}
@@ -1126,8 +1122,13 @@ static int parseSortedResults (
return LDAP_PROTOCOL_ERROR;
}
+ if ( BER_BVISNULL( &ctrl->ldctl_value ) ) {
+ rs->sr_text = "sorted results control value is absent";
+ return LDAP_PROTOCOL_ERROR;
+ }
+
if ( BER_BVISEMPTY( &ctrl->ldctl_value ) ) {
- rs->sr_text = "sorted results control value is empty (or absent)";
+ rs->sr_text = "sorted results control value is empty";
return LDAP_PROTOCOL_ERROR;
}
@@ -1154,8 +1155,13 @@ static int parseAssert (
return LDAP_PROTOCOL_ERROR;
}
- if ( ctrl->ldctl_value.bv_len == 0 ) {
- rs->sr_text = "assert control value is empty (or absent)";
+ if ( BER_BVISNULL( &ctrl->ldctl_value )) {
+ rs->sr_text = "assert control value is absent";
+ return LDAP_PROTOCOL_ERROR;
+ }
+
+ if ( BER_BVISEMPTY( &ctrl->ldctl_value )) {
+ rs->sr_text = "assert control value is empty";
return LDAP_PROTOCOL_ERROR;
}
@@ -1212,8 +1218,13 @@ static int parsePreRead (
return LDAP_PROTOCOL_ERROR;
}
- if ( ctrl->ldctl_value.bv_len == 0 ) {
- rs->sr_text = "preread control value is empty (or absent)";
+ if ( BER_BVISNULL( &ctrl->ldctl_value )) {
+ rs->sr_text = "preread control value is absent";
+ return LDAP_PROTOCOL_ERROR;
+ }
+
+ if ( BER_BVISEMPTY( &ctrl->ldctl_value )) {
+ rs->sr_text = "preread control value is empty";
return LDAP_PROTOCOL_ERROR;
}
@@ -1280,8 +1291,13 @@ static int parsePostRead (
return LDAP_PROTOCOL_ERROR;
}
- if ( ctrl->ldctl_value.bv_len == 0 ) {
- rs->sr_text = "postread control value is empty (or absent)";
+ if ( BER_BVISNULL( &ctrl->ldctl_value )) {
+ rs->sr_text = "postread control value is absent";
+ return LDAP_PROTOCOL_ERROR;
+ }
+
+ if ( BER_BVISEMPTY( &ctrl->ldctl_value )) {
+ rs->sr_text = "postread control value is empty";
return LDAP_PROTOCOL_ERROR;
}
@@ -1307,18 +1323,37 @@ static int parsePostRead (
goto done;
}
- for( i=0; isr_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";
- goto done;
+ rc = slap_bv2ad( &an[i].an_name, &an[i].an_desc, &dummy );
+ if ( rc != LDAP_SUCCESS ) {
+ int i;
+ static struct berval special_attrs[] = {
+ BER_BVC( LDAP_NO_ATTRS ),
+ BER_BVC( LDAP_ALL_USER_ATTRIBUTES ),
+ BER_BVC( LDAP_ALL_OPERATIONAL_ATTRIBUTES ),
+ BER_BVNULL
+ };
+
+ /* deal with special attribute types */
+ for ( i = 0; !BER_BVISNULL( &special_attrs[ i ] ); i++ ) {
+ if ( bvmatch( &an[i].an_name, &special_attrs[ i ] ) ) {
+ break;
+ }
+ }
+
+ if ( BER_BVISNULL( &special_attrs[ i ] ) && ctrl->ldctl_iscritical ) {
+ rs->sr_err = rc;
+ rs->sr_text = dummy
+ ? dummy
+ : "postread control: unknown attributeType";
+ goto done;
+ }
}
}
@@ -1346,8 +1381,13 @@ static int parseValuesReturnFilter (
return LDAP_PROTOCOL_ERROR;
}
- if ( ctrl->ldctl_value.bv_len == 0 ) {
- rs->sr_text = "valuesReturnFilter control value is empty (or absent)";
+ if ( BER_BVISNULL( &ctrl->ldctl_value )) {
+ rs->sr_text = "valuesReturnFilter control value is absent";
+ return LDAP_PROTOCOL_ERROR;
+ }
+
+ if ( BER_BVISEMPTY( &ctrl->ldctl_value )) {
+ rs->sr_text = "valuesReturnFilter control value is empty";
return LDAP_PROTOCOL_ERROR;
}
@@ -1430,8 +1470,8 @@ static int parsePermissiveModify (
return LDAP_PROTOCOL_ERROR;
}
- if ( ctrl->ldctl_value.bv_len ) {
- rs->sr_text = "permissiveModify control value not empty";
+ if ( BER_BVISNULL( &ctrl->ldctl_value )) {
+ rs->sr_text = "permissiveModify control value not absent";
return LDAP_PROTOCOL_ERROR;
}
@@ -1452,7 +1492,7 @@ static int parseDomainScope (
return LDAP_PROTOCOL_ERROR;
}
- if ( ctrl->ldctl_value.bv_len ) {
+ if ( BER_BVISNULL( &ctrl->ldctl_value )) {
rs->sr_text = "domainScope control value not empty";
return LDAP_PROTOCOL_ERROR;
}
@@ -1475,8 +1515,8 @@ static int parseTreeDelete (
return LDAP_PROTOCOL_ERROR;
}
- if ( ctrl->ldctl_value.bv_len ) {
- rs->sr_text = "treeDelete control value not empty";
+ if ( BER_BVISNULL( &ctrl->ldctl_value )) {
+ rs->sr_text = "treeDelete control value not absent";
return LDAP_PROTOCOL_ERROR;
}
@@ -1497,8 +1537,13 @@ static int parseSearchOptions (
ber_int_t search_flags;
ber_tag_t tag;
- if ( ctrl->ldctl_value.bv_len == 0 ) {
- rs->sr_text = "searchOptions control value is empty (or absent)";
+ if ( BER_BVISNULL( &ctrl->ldctl_value )) {
+ rs->sr_text = "searchOptions control value is absent";
+ return LDAP_PROTOCOL_ERROR;
+ }
+
+ if ( BER_BVISEMPTY( &ctrl->ldctl_value )) {
+ rs->sr_text = "searchOptions control value is empty";
return LDAP_PROTOCOL_ERROR;
}