From eccef780fcd843d6c5daafc10686da331b6447e7 Mon Sep 17 00:00:00 2001
From: Kurt Zeilenga <kurt@openldap.org>
Date: Mon, 1 Oct 2001 21:20:29 +0000
Subject: [PATCH] Add idl_check() code from HEAD

---
 CHANGES                       |  1 +
 servers/slapd/back-ldbm/idl.c | 64 +++++++++++++++++++++++++++++++++++
 2 files changed, 65 insertions(+)

diff --git a/CHANGES b/CHANGES
index c437c9b8a2..20c0fe1a02 100644
--- a/CHANGES
+++ b/CHANGES
@@ -11,6 +11,7 @@ OpenLDAP 2.0.16 Engineering
 	Updated -lldap_r pthread stack size
 	Updated slapd acl assert checks
 	Removed -lldbm use of Berkeley CDB
+	Added back-ldbm idl_check() code
 	Build environment
 		Updated ltconfig for MacOS X 10.1 (ITS#1361)
 		Updated slapd.conf with ACL example
diff --git a/servers/slapd/back-ldbm/idl.c b/servers/slapd/back-ldbm/idl.c
index 81f1954f57..0ade40a580 100644
--- a/servers/slapd/back-ldbm/idl.c
+++ b/servers/slapd/back-ldbm/idl.c
@@ -45,6 +45,27 @@ static void cont_free( Datum *cont )
 	ch_free( cont->dptr );
 }
 
+#ifdef LDBM_DEBUG_IDL
+static void idl_check(ID_BLOCK *idl)
+{
+	int i;
+	ID_BLOCK last;
+
+	if( ID_BLOCK_INDIRECT(idl) || ID_BLOCK_ALLIDS(idl)
+		|| ID_BLOCK_NIDS(idl) <= 1 )
+	{
+		return;
+	}
+
+	for( last = ID_BLOCK_ID(idl, 0), i = 1;
+		i < ID_BLOCK_NIDS(idl);
+		last = ID_BLOCK_ID(idl, i), i++ )
+	{
+		assert (last < ID_BLOCK_ID(idl, i) );
+	}
+}
+#endif
+
 /* Allocate an ID_BLOCK with room for nids ids */
 ID_BLOCK *
 idl_alloc( unsigned int nids )
@@ -210,6 +231,10 @@ idl_fetch(
 	}
 	free( (char *) tmp );
 
+#ifdef LDBM_DEBUG_IDL
+	idl_check(idl);
+#endif
+
 	Debug( LDAP_DEBUG_TRACE, "<= idl_fetch %ld ids (%ld max)\n",
 	       ID_BLOCK_NIDS(idl), ID_BLOCK_NMAX(idl), 0 );
 	return( idl );
@@ -229,6 +254,10 @@ idl_store(
 	Datum	data;
 	struct ldbminfo *li = (struct ldbminfo *) be->be_private;
 
+#ifdef LDBM_DEBUG_IDL
+	idl_check(idl);
+#endif
+
 	ldbm_datum_init( data );
 
 	/* Debug( LDAP_DEBUG_TRACE, "=> idl_store\n", 0, 0, 0 ); */
@@ -293,6 +322,11 @@ idl_split_block(
 	    (char *) &ID_BLOCK_ID(b, nr),
 		nl * sizeof(ID) );
 	ID_BLOCK_NIDS(*left) = nl + (nr == 0 ? 0 : 1);
+
+#ifdef LDBM_DEBUG_IDL
+	idl_check(*right);
+	idl_check(*left);
+#endif
 }
 
 
@@ -703,6 +737,10 @@ idl_insert( ID_BLOCK **idl, ID id, unsigned int maxids )
 		'\0',
 	    (ID_BLOCK_NMAX(*idl) - ID_BLOCK_NIDS(*idl)) * sizeof(ID) );
 
+#ifdef LDBM_DEBUG_IDL
+	idl_check(*idl);
+#endif
+
 	return( i == 0 ? 1 : 0 );	/* inserted - first id changed or not */
 }
 
@@ -837,6 +875,10 @@ idl_dup( ID_BLOCK *idl )
 		(char *) idl,
 		(ID_BLOCK_NMAX(idl) + ID_BLOCK_IDS_OFFSET) * sizeof(ID) );
 
+#ifdef LDBM_DEBUG_IDL
+	idl_check(new);
+#endif
+
 	return( new );
 }
 
@@ -874,6 +916,11 @@ idl_intersection(
 
 	n = idl_dup( idl_min( a, b ) );
 
+#ifdef LDBM_DEBUG_IDL
+	idl_check(a);
+	idl_check(b);
+#endif
+
 	for ( ni = 0, ai = 0, bi = 0; ai < ID_BLOCK_NIDS(a); ai++ ) {
 		for ( ;
 			bi < ID_BLOCK_NIDS(b) && ID_BLOCK_ID(b, bi) < ID_BLOCK_ID(a, ai);
@@ -897,6 +944,10 @@ idl_intersection(
 	}
 	ID_BLOCK_NIDS(n) = ni;
 
+#ifdef LDBM_DEBUG_IDL
+	idl_check(n);
+#endif
+
 	return( n );
 }
 
@@ -924,6 +975,11 @@ idl_union(
 		return( idl_allids( be ) );
 	}
 
+#ifdef LDBM_DEBUG_IDL
+	idl_check(a);
+	idl_check(b);
+#endif
+
 	if ( ID_BLOCK_NIDS(b) < ID_BLOCK_NIDS(a) ) {
 		n = a;
 		a = b;
@@ -956,6 +1012,10 @@ idl_union(
 	}
 	ID_BLOCK_NIDS(n) = ni;
 
+#ifdef LDBM_DEBUG_IDL
+	idl_check(n);
+#endif
+
 	return( n );
 }
 
@@ -1033,6 +1093,10 @@ idl_notin(
 	}
 	ID_BLOCK_NIDS(n) = ni;
 
+#ifdef LDBM_DEBUG_IDL
+	idl_check(n);
+#endif
+
 	return( n );
 }
 
-- 
GitLab