This is a multi-part message in MIME format.
--------------080405020304060402030808
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: 7bit

Fixing this for unique_add seams easy enough (see preliminary attached 
patch) - fixing it for modrdn/modify seems to be another difficulty 
level as in order to properly apply the filter I think the full 
modifications have to be applied...

If wanted I can produce a patch for this as well, but I would like to 
know if that is appreciated and if my plan for fixing looks sensible:
- Pull the "modification simulation" code out of constraint.c (line 
959:1040 and some more in 2.4.16) into constraints.c
- Add a overlay-int.h
- Make constraint.c and unique.c use that

As I dont really know the openldap codebase my analysis could be 
completely wrong - I would appreciate some feedback.

Andres



--------------080405020304060402030808
Content-Type: text/x-diff;
 name="slapd-unique-overlay-spurious-failure-fix-add.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: attachment;
 filename="slapd-unique-overlay-spurious-failure-fix-add.patch"

--- openldap-2.4.16.saved/servers/slapd/overlays/unique.c       2009-04-23 
23:51:37.925387747 +0200
+++ openldap-2.4.16/servers/slapd/overlays/unique.c     2009-04-26 
01:58:54.566927667 +0200
@@ -1071,6 +1071,24 @@
                             && !dnIsSuffix( &op->o_req_ndn, &uri->ndn ))
                                continue;
 
+                       if (uri->filter.bv_val && uri->filter.bv_len){
+                               Filter *f = str2filter_x(op,
+                                                        uri->filter.bv_val);
+                               if(f == NULL) {
+                                       op->o_bd->bd_info = (BackendInfo *) 
on->on_info;
+                                       send_ldap_error(op, rs, LDAP_OTHER,
+                                                       "unique_search invalid 
filter");
+                                       return(rs->sr_err);
+                               }
+
+                               if(test_filter(NULL, op->ora_e, f) == 
LDAP_COMPARE_FALSE){
+                                       Debug(LDAP_DEBUG_TRACE, "==> 
unique_add_skip<%s>\n",
+                                             op->o_req_dn.bv_val, 0, 0);
+                                       continue;
+                               }
+                               filter_free_x(op, f, 1);
+                       }
+
                        if(!(a = op->ora_e->e_attrs)) {
                                op->o_bd->bd_info = (BackendInfo *) on->on_info;
                                send_ldap_error(op, rs, LDAP_INVALID_SYNTAX,

--------------080405020304060402030808--


Reply via email to