]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-bdb/compare.c
Fix cache consistency problems on txn retry
[openldap] / servers / slapd / back-bdb / compare.c
index 25c8cf4f9554480bd81db6913ce5238dda08b2ba..4f2ab650c55517873d53e7e772fc737b8b8e2e77 100644 (file)
@@ -1,7 +1,7 @@
 /* compare.c - bdb backend compare routine */
 /* $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
  */
 
@@ -34,7 +34,15 @@ bdb_compare(
        u_int32_t       locker;
        DB_LOCK         lock;
 
-       LOCK_ID ( bdb->bi_dbenv, &locker );
+       rc = LOCK_ID(bdb->bi_dbenv, &locker);
+       switch(rc) {
+       case 0:
+               break;
+       default:
+               send_ldap_result( conn, op, rc=LDAP_OTHER,
+                       NULL, "internal error", NULL, NULL );
+               return rc;
+       }
 
 dn2entry_retry:
        /* get entry */
@@ -102,9 +110,9 @@ dn2entry_retry:
                goto done;
        }
 
-       if ( ! access_allowed( be, conn, op, e,
-               ava->aa_desc, &ava->aa_value, ACL_COMPARE, NULL ) )
-       {
+       rc = access_allowed( be, conn, op, e,
+               ava->aa_desc, &ava->aa_value, ACL_COMPARE, NULL );
+       if ( ! rc ) {
                rc = LDAP_INSUFFICIENT_ACCESS;
                goto return_results;
        }
@@ -117,11 +125,17 @@ dn2entry_retry:
        {
                rc = LDAP_COMPARE_FALSE;
 
-               if ( value_find( ava->aa_desc, a->a_vals, &ava->aa_value ) == 0 ) {
+#ifdef SLAP_NVALUES
+               if ( value_find_ex( ava->aa_desc,
+                       SLAP_MR_ATTRIBUTE_VALUE_NORMALIZED_MATCH,
+                       a->a_vals, &ava->aa_value ) == 0 )
+#else
+               if ( value_find( ava->aa_desc, a->a_vals, &ava->aa_value ) == 0 )
+#endif
+               {
                        rc = LDAP_COMPARE_TRUE;
                        break;
                }
-
        }
 
 return_results: