From 689710e2cacff1e51d11de9823a3a30d9229ad76 Mon Sep 17 00:00:00 2001
From: Pierangelo Masarati <ando@openldap.org>
Date: Sat, 14 Dec 2002 16:34:59 +0000
Subject: [PATCH] Dunno in advance how many controls will be set by a client

---
 clients/tools/common.c | 22 +++++++++++++++-------
 1 file changed, 15 insertions(+), 7 deletions(-)

diff --git a/clients/tools/common.c b/clients/tools/common.c
index afcc937411..51dc01ff21 100644
--- a/clients/tools/common.c
+++ b/clients/tools/common.c
@@ -640,8 +640,14 @@ tool_bind( LDAP *ld )
 void
 tool_server_controls( LDAP *ld, LDAPControl *extra_c, int count )
 {
-	int i = 0, j, crit, err;
-	LDAPControl c[3], *ctrls[10];
+	int i = 0, j, crit = 0, err;
+	LDAPControl c[3], **ctrls;
+
+	ctrls = (LDAPControl **)malloc( sizeof(c) + (count + 1)*sizeof(LDAPControl *) );
+	if ( ctrls == NULL ) {
+		fprintf( stderr, "No memory\n" );
+		exit( EXIT_FAILURE );
+	}
 
 	if ( authzid ) {
 		c[i].ldctl_oid = LDAP_CONTROL_PROXY_AUTHZ;
@@ -676,14 +682,16 @@ tool_server_controls( LDAP *ld, LDAPControl *extra_c, int count )
 
 	err = ldap_set_option( ld, LDAP_OPT_SERVER_CONTROLS, ctrls );
 
-	if( err != LDAP_OPT_SUCCESS ) {
-		for ( j = crit = 0; j < i; j++ )
+	if ( err != LDAP_OPT_SUCCESS ) {
+		for ( j = 0; j < i; j++ )
 			if ( ctrls[j]->ldctl_iscritical )
 				crit = 1;
 		fprintf( stderr, "Could not set %scontrols\n",
 				 crit ? "critical " : "" );
-		if ( crit ) {
-			exit( EXIT_FAILURE );
-		}
+	}
+
+ 	free( ctrls );
+	if ( crit ) {
+		exit( EXIT_FAILURE );
 	}
 }
-- 
GitLab