]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/controls.c
Make LDAP_MEMORY_DEBUG a bitmask. #define LDAP_MEMORY_DEBUG_ASSERT. ITS#4990.
[openldap] / libraries / libldap / controls.c
index 1ad762b38461622b772e0c385e593ce569b8b4e1..51fde85a51c3c7a601b2b4aac5515be3108876cb 100644 (file)
@@ -1,18 +1,34 @@
 /* $OpenLDAP$ */
-/*
- * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
- * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
+/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
+ *
+ * Copyright 1998-2007 The OpenLDAP Foundation.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted only as authorized by the OpenLDAP
+ * Public License.
+ *
+ * A copy of this license is available in the file LICENSE in the
+ * top-level directory of the distribution or, alternatively, at
+ * <http://www.OpenLDAP.org/license.html>.
  */
-
-/* LDAPv3 Controls (RFC2251)
+/* This notice applies to changes, created by or for Novell, Inc.,
+ * to preexisting works for which notices appear elsewhere in this file.
  *
- *     Controls ::= SEQUENCE OF Control  
+ * Copyright (C) 1999, 2000 Novell, Inc. All Rights Reserved.
  *
- *     Control ::= SEQUENCE { 
- *             controlType             LDAPOID,
- *             criticality             BOOLEAN DEFAULT FALSE,
- *             controlValue    OCTET STRING OPTIONAL
- *     }
+ * THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND TREATIES.
+ * USE, MODIFICATION, AND REDISTRIBUTION OF THIS WORK IS SUBJECT TO VERSION
+ * 2.0.1 OF THE OPENLDAP PUBLIC LICENSE, A COPY OF WHICH IS AVAILABLE AT
+ * HTTP://WWW.OPENLDAP.ORG/LICENSE.HTML OR IN THE FILE "LICENSE" IN THE
+ * TOP-LEVEL DIRECTORY OF THE DISTRIBUTION. ANY USE OR EXPLOITATION OF THIS
+ * WORK OTHER THAN AS AUTHORIZED IN VERSION 2.0.1 OF THE OPENLDAP PUBLIC
+ * LICENSE, OR OTHER PRIOR WRITTEN CONSENT FROM NOVELL, COULD SUBJECT THE
+ * PERPETRATOR TO CRIMINAL AND CIVIL LIABILITY. 
+ *---
+ * Note: A verbatim copy of version 2.0.1 of the OpenLDAP Public License
+ * can be found in the file "build/LICENSE-2.0.1" in this distribution
+ * of OpenLDAP Software.
  */
 
 #include "portable.h"
 
 #include "ldap-int.h"
 
+/* LDAPv3 Controls (RFC 4511)
+ *
+ *     Controls ::= SEQUENCE OF control Control  
+ *
+ *     Control ::= SEQUENCE { 
+ *             controlType             LDAPOID,
+ *             criticality             BOOLEAN DEFAULT FALSE,
+ *             controlValue    OCTET STRING OPTIONAL
+ *     }
+ */
 
 /*
  * ldap_int_put_controls
@@ -38,6 +64,7 @@ ldap_int_put_controls(
        LDAPControl *const *c;
 
        assert( ld != NULL );
+       assert( LDAP_VALID( ld ) );
        assert( ber != NULL );
 
        if( ctrls == NULL ) {
@@ -109,7 +136,7 @@ ldap_int_put_controls(
        return LDAP_SUCCESS;
 }
 
-int ldap_int_get_controls(
+int ldap_pvt_get_controls(
        BerElement *ber,
        LDAPControl ***ctrls )
 {
@@ -186,33 +213,27 @@ int ldap_int_get_controls(
 
                tag = ber_scanf( ber, "{a" /*}*/, &tctrl->ldctl_oid );
 
-               if( tag != LBER_ERROR ) {
-                       tag = ber_peek_tag( ber, &len );
+               if( tag == LBER_ERROR ) {
+                       *ctrls = NULL;
+                       ldap_controls_free( tctrls );
+                       return LDAP_DECODING_ERROR;
                }
 
+               tag = ber_peek_tag( ber, &len );
+
                if( tag == LBER_BOOLEAN ) {
                        ber_int_t crit;
                        tag = ber_scanf( ber, "b", &crit );
                        tctrl->ldctl_iscritical = crit ? (char) 0 : (char) ~0;
-               }
-
-               if( tag != LBER_ERROR ) {
                        tag = ber_peek_tag( ber, &len );
                }
 
                if( tag == LBER_OCTETSTRING ) {
                        tag = ber_scanf( ber, "o", &tctrl->ldctl_value );
-
                } else {
                        tctrl->ldctl_value.bv_val = NULL;
                }
 
-               if( tag == LBER_ERROR ) {
-                       *ctrls = NULL;
-                       ldap_controls_free( tctrls );
-                       return LDAP_DECODING_ERROR;
-               }
-
                *ctrls = tctrls;
        }
                
@@ -225,9 +246,7 @@ int ldap_int_get_controls(
 void
 ldap_control_free( LDAPControl *c )
 {
-#ifdef LDAP_MEMORY_DEBUG
-       assert( c != NULL );
-#endif
+       LDAP_MEMORY_DEBUG_ASSERT( c != NULL );
 
        if ( c != NULL ) {
                if( c->ldctl_oid != NULL) {
@@ -248,9 +267,7 @@ ldap_control_free( LDAPControl *c )
 void
 ldap_controls_free( LDAPControl **controls )
 {
-#ifdef LDAP_MEMORY_DEBUG
-       assert( controls != NULL );
-#endif
+       LDAP_MEMORY_DEBUG_ASSERT( controls != NULL );
 
        if ( controls != NULL ) {
                int i;
@@ -284,7 +301,7 @@ ldap_controls_dup( LDAPControl *const *controls )
                return NULL;
        }
 
-       new = (LDAPControl **) LDAP_MALLOC( i * sizeof(LDAPControl *) );
+       new = (LDAPControl **) LDAP_MALLOC( (i+1) * sizeof(LDAPControl *) );
 
        if( new == NULL ) {
                /* memory allocation failure */
@@ -364,30 +381,26 @@ ldap_control_dup( const LDAPControl *c )
        return new;
 }
 
+
+LDAPControl *
+ldap_find_control(
+       LDAP_CONST char *oid,
+       LDAPControl **ctrls )
+{
+       if( ctrls == NULL || *ctrls == NULL ) {
+               return NULL;
+       }
+
+       for( ; *ctrls != NULL; ctrls++ ) {
+               if( strcmp( (*ctrls)->ldctl_oid, oid ) == 0 ) {
+                       return *ctrls;
+               }
+       }
+
+       return NULL;
+}
+
 /*
- * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
- * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
- */
-/* Adapted for inclusion into OpenLDAP by Kurt D. Zeilenga */
-/*---
- * This notice applies to changes, created by or for Novell, Inc.,
- * to preexisting works for which notices appear elsewhere in this file.
- *
- * Copyright (C) 1999, 2000 Novell, Inc. All Rights Reserved.
- *
- * THIS WORK IS SUBJECT TO U.S. AND INTERNATIONAL COPYRIGHT LAWS AND TREATIES.
- * USE, MODIFICATION, AND REDISTRIBUTION OF THIS WORK IS SUBJECT TO VERSION
- * 2.0.1 OF THE OPENLDAP PUBLIC LICENSE, A COPY OF WHICH IS AVAILABLE AT
- * HTTP://WWW.OPENLDAP.ORG/LICENSE.HTML OR IN THE FILE "LICENSE" IN THE
- * TOP-LEVEL DIRECTORY OF THE DISTRIBUTION. ANY USE OR EXPLOITATION OF THIS
- * WORK OTHER THAN AS AUTHORIZED IN VERSION 2.0.1 OF THE OPENLDAP PUBLIC
- * LICENSE, OR OTHER PRIOR WRITTEN CONSENT FROM NOVELL, COULD SUBJECT THE
- * PERPETRATOR TO CRIMINAL AND CIVIL LIABILITY. 
- *---
- * Modification to OpenLDAP source by Novell, Inc.
- * June 2000 sfs  Added control utilities
- */
-/*---
    ldap_create_control
    
    Internal function to create an LDAP control from the encoded BerElement.
@@ -411,25 +424,21 @@ ldap_create_control(
        LDAPControl **ctrlp )
 {
        LDAPControl *ctrl;
-       struct berval *bvalp;
 
-       if ( requestOID == NULL || ctrlp == NULL ) {
-               return LDAP_PARAM_ERROR;
-       }
+       assert( requestOID != NULL );
+       assert( ber != NULL );
+       assert( ctrlp != NULL );
 
        ctrl = (LDAPControl *) LDAP_MALLOC( sizeof(LDAPControl) );
        if ( ctrl == NULL ) {
                return LDAP_NO_MEMORY;
        }
 
-       if ( ber_flatten( ber, &bvalp ) == LBER_ERROR ) {
+       if ( ber_flatten2( ber, &ctrl->ldctl_value, 1 ) == -1 ) {
                LDAP_FREE( ctrl );
                return LDAP_NO_MEMORY;
        }
 
-       ctrl->ldctl_value = *bvalp;
-       ber_memfree( bvalp );
-
        ctrl->ldctl_oid = LDAP_STRDUP( requestOID );
        ctrl->ldctl_iscritical = iscritical;
 
@@ -453,6 +462,7 @@ int ldap_int_client_controls( LDAP *ld, LDAPControl **ctrls )
        LDAPControl *const *c;
 
        assert( ld != NULL );
+       assert( LDAP_VALID( ld ) );
 
        if( ctrls == NULL ) {
                /* use default server controls */