]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-ldbm/compare.c
Apply back-ldbm/search.c matched initialization bugfix from -devel
[openldap] / servers / slapd / back-ldbm / compare.c
index 4757a29b9228684dbfb6e834b74ed8fa0c66e857..29f654751c90fb625c1e8ada77d927b4032a27fa 100644 (file)
@@ -1,14 +1,15 @@
 /* compare.c - ldbm backend compare routine */
 
+#include "portable.h"
+
 #include <stdio.h>
-#include <string.h>
-#include <sys/types.h>
-#include <sys/socket.h>
+
+#include <ac/socket.h>
+#include <ac/string.h>
+
 #include "slap.h"
 #include "back-ldbm.h"
-
-extern Entry           *dn2entry();
-extern Attribute       *attr_find();
+#include "proto-back-ldbm.h"
 
 int
 ldbm_back_compare(
@@ -23,33 +24,38 @@ ldbm_back_compare(
        char            *matched;
        Entry           *e;
        Attribute       *a;
-       int             i;
+       int             rc;
 
-       if ( (e = dn2entry( be, dn, &matched )) == NULL ) {
+       /* get entry with reader lock */
+       if ( (e = dn2entry_r( be, dn, &matched )) == NULL ) {
                send_ldap_result( conn, op, LDAP_NO_SUCH_OBJECT, matched, "" );
+
+               if(matched == NULL) free(matched);
                return( 1 );
        }
 
+       /* check for deleted */
        if ( ! access_allowed( be, conn, op, e, ava->ava_type, &ava->ava_value,
            op->o_dn, ACL_COMPARE ) ) {
                send_ldap_result( conn, op, LDAP_INSUFFICIENT_ACCESS, "", "" );
-               cache_return_entry( &li->li_cache, e );
-               return( 1 );
+               rc = 1;
+               goto return_results;
        }
 
        if ( (a = attr_find( e->e_attrs, ava->ava_type )) == NULL ) {
                send_ldap_result( conn, op, LDAP_NO_SUCH_ATTRIBUTE, "", "" );
-               cache_return_entry( &li->li_cache, e );
-               return( 1 );
+               rc = 1;
+               goto return_results;
        }
 
-       if ( value_find( a->a_vals, &ava->ava_value, a->a_syntax, 1 ) == 0 ) {
+       if ( value_find( a->a_vals, &ava->ava_value, a->a_syntax, 1 ) == 0 ) 
                send_ldap_result( conn, op, LDAP_COMPARE_TRUE, "", "" );
-               cache_return_entry( &li->li_cache, e );
-               return( 0 );
-       }
+       else
+               send_ldap_result( conn, op, LDAP_COMPARE_FALSE, "", "" );
+
+       rc = 0;
 
-       send_ldap_result( conn, op, LDAP_COMPARE_FALSE, "", "" );
-       cache_return_entry( &li->li_cache, e );
-       return( 0 );
+return_results:;
+       cache_return_entry_r( &li->li_cache, e );
+       return( rc );
 }