diff --git a/CHANGES b/CHANGES
index 56f6f22ac375b88649343bb9d56007f1f0c846ac..f07fa8db676da02349c023929f067594630c6a31 100644
--- a/CHANGES
+++ b/CHANGES
@@ -16,6 +16,7 @@ OpenLDAP 2.4.20 Engineering
 	Build Environment
 		Fixed slapd MAXPATHLEN handling (ITS#6342)
 		Fixed test057 handling of memberof/refint (ITS#6343)
+		Fixed slapd test error ignoring (ITS#6345)
 	Documentation
 		ldap_get_dn(3) typos (ITS#5366)
 		slapd.conf(5) note hex server IDs (ITS#6297)
diff --git a/tests/progs/slapd-common.c b/tests/progs/slapd-common.c
index 06e1060efbd68a1faa3cee32f68e5c3c61c5581a..a4b51b0f66a707bc13489787b100dc7eac09ea4f 100644
--- a/tests/progs/slapd-common.c
+++ b/tests/progs/slapd-common.c
@@ -38,13 +38,17 @@ pid_t pid;
 static char progname[ BUFSIZ ];
 tester_t progtype;
 
-#define	TESTER_SERVER_LAST	(LDAP_OTHER + 1)
-#define TESTER_CLIENT_LAST	(- LDAP_REFERRAL_LIMIT_EXCEEDED + 1)
-static int ignore_server[ TESTER_SERVER_LAST ];
-static int ignore_client[ TESTER_CLIENT_LAST ];
+/*
+ * ignore_count[] is indexed by result code:
+ * negative for OpenLDAP client-side errors, positive for protocol codes.
+ */
+#define	TESTER_CLIENT_FIRST	LDAP_REFERRAL_LIMIT_EXCEEDED /* negative */
+#define	TESTER_SERVER_LAST	LDAP_OTHER
+static int ignore_base	[ -TESTER_CLIENT_FIRST + TESTER_SERVER_LAST + 1 ];
+#define    ignore_count	(ignore_base - TESTER_CLIENT_FIRST)
 
-static struct {
-	char	*name;
+static const struct {
+	const char *name;
 	int	err;
 } ignore_str2err[] = {
 	{ "OPERATIONS_ERROR",		LDAP_OPERATIONS_ERROR },
@@ -130,15 +134,9 @@ tester_ignore_str2err( const char *err )
 
 	if ( strcmp( err, "ALL" ) == 0 ) {
 		for ( i = 0; ignore_str2err[ i ].name != NULL; i++ ) {
-			int	err = ignore_str2err[ i ].err;
-
-			if ( err > 0 ) {
-				ignore_server[ err ] = 1;
-
-			} else if ( err < 0 ) {
-				ignore_client[ -err ] = 1;
-			}
+			ignore_count[ ignore_str2err[ i ].err ] = 1;
 		}
+		ignore_count[ LDAP_SUCCESS ] = 0;
 
 		return 0;
 	}
@@ -156,11 +154,8 @@ tester_ignore_str2err( const char *err )
 		if ( strcmp( err, ignore_str2err[ i ].name ) == 0 ) {
 			int	err = ignore_str2err[ i ].err;
 
-			if ( err > 0 ) {
-				ignore_server[ err ] = ignore;
-
-			} else if ( err < 0 ) {
-				ignore_client[ -err ] = ignore;
+			if ( err != LDAP_SUCCESS ) {
+				ignore_count[ err ] = ignore;
 			}
 
 			return err;
@@ -191,26 +186,10 @@ tester_ignore_err( int err )
 {
 	int rc = 1;
 
-	if ( err > 0 ) {
-		if ( err < TESTER_SERVER_LAST ) {
-			rc = ignore_server[ err ];
-			if ( rc > 0 ) {
-				ignore_server[ err ]++;
-
-			} else if ( rc < 0 ) {
-				ignore_server[ err ]--;
-			}
-		}
-
-	} else if ( err < 0 ) {
-		if ( -err < TESTER_CLIENT_LAST ) {
-			rc = ignore_client[ -err ];
-			if ( rc > 0 ) {
-				ignore_client[ -err ]++;
-
-			} else if ( rc < 0 ) {
-				ignore_server[ err ]--;
-			}
+	if ( err && TESTER_CLIENT_FIRST <= err && err <= TESTER_SERVER_LAST ) {
+		rc = ignore_count[ err ];
+		if ( rc != 0 ) {
+			ignore_count[ err ] = rc + (rc > 0 ? 1 : -1);
 		}
 	}
 
@@ -319,4 +298,3 @@ tester_error( const char *msg )
 {
 	fprintf( stderr, "%s: %s\n", progname, msg );
 }
-