]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/controls.c
silence warning
[openldap] / servers / slapd / controls.c
index 5cdfaf0051da64ab2a0f256dbacd9b00fe5c15f5..a7188be37af4372d3c8996894d088242797815cd 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2010 The OpenLDAP Foundation.
+ * Copyright 1998-2011 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -160,7 +160,7 @@ static struct slap_control control_defs[] = {
                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,
+               SLAP_CTRL_GLOBAL|SLAP_CTRL_INTROGATE,
                NULL, NULL,
                parseDontUseCopy, LDAP_SLIST_ENTRY_INITIALIZER(next) },
        { LDAP_CONTROL_X_PERMISSIVE_MODIFY,
@@ -344,6 +344,38 @@ register_supported_control2(const char *controloid,
        return LDAP_SUCCESS;
 }
 
+#ifdef SLAP_CONFIG_DELETE
+int
+unregister_supported_control( const char *controloid )
+{
+       struct slap_control *sc;
+       int i;
+
+       if ( controloid == NULL || (sc = find_ctrl( controloid )) == NULL ){
+               return -1;
+       }
+
+       for ( i = 0; slap_known_controls[ i ]; i++ ) {
+               if ( strcmp( controloid, slap_known_controls[ i ] ) == 0 ) {
+                       do {
+                               slap_known_controls[ i ] = slap_known_controls[ i+1 ];
+                       } while ( slap_known_controls[ i++ ] );
+                       num_known_controls--;
+                       break;
+               }
+       }
+
+       LDAP_SLIST_REMOVE(&controls_list, sc, slap_control, sc_next);
+       ch_free( sc->sc_oid );
+       if ( sc->sc_extendedopsbv != NULL ) {
+               ber_bvarray_free( sc->sc_extendedopsbv );
+       }
+       ch_free( sc );
+
+       return 0;
+}
+#endif /* SLAP_CONFIG_DELETE */
+
 /*
  * One-time initialization of internal controls.
  */
@@ -658,10 +690,21 @@ int slap_parse_ctrl(
        return rc;
 }
 
-int get_ctrls(
+int
+get_ctrls(
        Operation *op,
        SlapReply *rs,
        int sendres )
+{
+       return get_ctrls2( op, rs, sendres, LDAP_TAG_CONTROLS );
+}
+
+int
+get_ctrls2(
+       Operation *op,
+       SlapReply *rs,
+       int sendres,
+       ber_tag_t ctag )
 {
        int nctrls = 0;
        ber_tag_t tag;
@@ -687,7 +730,7 @@ int get_ctrls(
                return rs->sr_err;
        }
 
-       if(( tag = ber_peek_tag( ber, &len )) != LDAP_TAG_CONTROLS ) {
+       if(( tag = ber_peek_tag( ber, &len )) != ctag ) {
                if( tag == LBER_ERROR ) {
                        rs->sr_err = SLAPD_DISCONNECT;
                        rs->sr_text = "unexpected data in PDU";
@@ -1137,14 +1180,13 @@ static int parseProxyAuthz (
        }
 
        ch_free( op->o_ndn.bv_val );
-       ch_free( op->o_dn.bv_val );
 
        /*
         * NOTE: since slap_sasl_getdn() returns a normalized dn,
         * from now on op->o_dn is normalized
         */
        op->o_ndn = dn;
-       ber_dupbv( &op->o_dn, &dn );
+       ber_bvreplace( &op->o_dn, &dn );
 
        Statslog( LDAP_DEBUG_STATS, "%s PROXYAUTHZ dn=\"%s\"\n",
            op->o_log_prefix, dn.bv_val, 0, 0, 0 );