diff --git a/servers/slapd/passwd.c b/servers/slapd/passwd.c
index a262a9911aa74009a485b084d9ad4139f9e2d982..265681c4a4aa34e303646cf56642dadc6bbccd94 100644
--- a/servers/slapd/passwd.c
+++ b/servers/slapd/passwd.c
@@ -415,33 +415,37 @@ slap_passwd_check(
 	struct berval		*bv;
 	AccessControlState	acl_state = ACL_STATE_INIT;
 
-#if defined( SLAPD_CRYPT ) || defined( SLAPD_SPASSWD )
-	ldap_pvt_thread_mutex_lock( &passwd_mutex );
-#ifdef SLAPD_SPASSWD
-	lutil_passwd_sasl_conn = op->o_conn->c_sasl_authctx;
-#endif
-#endif
-
 	for ( bv = a->a_vals; bv->bv_val != NULL; bv++ ) {
+		int	rc;
+
 		/* if e is provided, check access */
 		if ( e && access_allowed( op, e, a->a_desc, bv,
 					ACL_AUTH, &acl_state ) == 0 )
 		{
 			continue;
 		}
-		
-		if ( !lutil_passwd( bv, cred, NULL, text ) ) {
-			result = 0;
-			break;
-		}
-	}
 
 #if defined( SLAPD_CRYPT ) || defined( SLAPD_SPASSWD )
+		ldap_pvt_thread_mutex_lock( &passwd_mutex );
 #ifdef SLAPD_SPASSWD
-	lutil_passwd_sasl_conn = NULL;
+		lutil_passwd_sasl_conn = op->o_conn->c_sasl_authctx;
 #endif
-	ldap_pvt_thread_mutex_unlock( &passwd_mutex );
 #endif
+	
+		rc = lutil_passwd( bv, cred, NULL, text );
+
+#if defined( SLAPD_CRYPT ) || defined( SLAPD_SPASSWD )
+#ifdef SLAPD_SPASSWD
+		lutil_passwd_sasl_conn = NULL;
+#endif
+		ldap_pvt_thread_mutex_unlock( &passwd_mutex );
+#endif
+
+		if ( !rc ) {
+			result = 0;
+			break;
+		}
+	}
 
 	return result;
 }