]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/controls.c
ITS#2657: authzid (and assertion) should apply to most everything
[openldap] / libraries / libldap / controls.c
index f3af141e1ea29c73ce025ceb104139fb37d23a78..d61be4e43641df908ba0f9469385a437c1a90fef 100644 (file)
@@ -1,8 +1,12 @@
 /* $OpenLDAP$ */
 /*
- * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
  */
+/*
+ * Portions Copyright (C) The Internet Society (1997)
+ * ASN.1 fragments are from RFC 2251; see RFC for full legal notices.
+ */
 
 /* LDAPv3 Controls (RFC2251)
  *
@@ -187,33 +191,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;
        }
                
@@ -366,7 +364,7 @@ ldap_control_dup( const LDAPControl *c )
 }
 
 /*
- * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
  */
 /* Adapted for inclusion into OpenLDAP by Kurt D. Zeilenga */
@@ -388,6 +386,10 @@ ldap_control_dup( const LDAPControl *c )
  * Modification to OpenLDAP source by Novell, Inc.
  * June 2000 sfs  Added control utilities
  */
+/* 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.
+ */
 /*---
    ldap_create_control
    
@@ -412,7 +414,6 @@ ldap_create_control(
        LDAPControl **ctrlp )
 {
        LDAPControl *ctrl;
-       struct berval *bvalp;
 
        assert( requestOID != NULL );
        assert( ber != NULL );
@@ -423,14 +424,11 @@ ldap_create_control(
                return LDAP_NO_MEMORY;
        }
 
-       if ( ber_flatten( ber, &bvalp ) == -1 ) {
+       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;