]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/overlays/unique.c
More for prev commit - set entryCSN as well.
[openldap] / servers / slapd / overlays / unique.c
index 7120b1f69ba3c2a6cded1c2e7877d94296dc7ddd..5802b4a9d1e5aa96cf0cbb5d069835bef45d217b 100644 (file)
@@ -301,7 +301,8 @@ static char *build_filter(
        unique_data *ud,
        AttributeDescription *ad,
        BerVarray b,
-       char *kp
+       char *kp,
+       void *ctx
 )
 {
        unique_attrs *up;
@@ -332,9 +333,11 @@ static char *build_filter(
                        for ( i = 0; b[i].bv_val; i++ ) {
                                struct berval   bv;
 
-                               ldap_bv2escaped_filter_value( &b[i], &bv );
+                               ldap_bv2escaped_filter_value_x( &b[i], &bv, 1, ctx );
                                kp += sprintf( kp, "(%s=%s)", ad->ad_cname.bv_val, bv.bv_val );
-                               ldap_memfree( bv.bv_val );
+                               if ( bv.bv_val != b[i].bv_val ) {
+                                       ber_memfree_x( bv.bv_val, ctx );
+                               }
                        }
                } else if ( ud->strict ) {
                        kp += sprintf( kp, "(%s=*)", ad->ad_cname.bv_val );
@@ -440,7 +443,7 @@ static int unique_add(
        kp = key + sprintf(key, "(|");
 
        for(a = op->ora_e->e_attrs; a; a = a->a_next) {
-               kp = build_filter(ud, a->a_desc, a->a_vals, kp);
+               kp = build_filter(ud, a->a_desc, a->a_vals, kp, op->o_tmpmemctx);
        }
 
        sprintf(kp, ")");
@@ -492,7 +495,7 @@ static int unique_modify(
 
        for(m = op->orm_modlist; m; m = m->sml_next) {
                if ((m->sml_op & LDAP_MOD_OP) == LDAP_MOD_DELETE) continue;
-               kp = build_filter(ud, m->sml_desc, m->sml_values, kp);
+               kp = build_filter(ud, m->sml_desc, m->sml_values, kp, op->o_tmpmemctx);
        }
 
        sprintf(kp, ")");
@@ -555,7 +558,7 @@ static int unique_modrdn(
 
        for(i = 0; newrdn[i]; i++) {
                bv[0] = newrdn[i]->la_value;
-               kp = build_filter(ud, newrdn[i]->la_private, bv, kp);
+               kp = build_filter(ud, newrdn[i]->la_private, bv, kp, op->o_tmpmemctx);
        }
 
        sprintf(kp, ")");
@@ -570,7 +573,7 @@ static int unique_modrdn(
 ** it expects to be called automagically during dynamic module initialization
 */
 
-int unique_init() {
+int unique_initialize() {
 
        /* statically declared just after the #includes at top */
        unique.on_bi.bi_type = "unique";
@@ -588,7 +591,7 @@ int unique_init() {
 
 #if SLAPD_OVER_UNIQUE == SLAPD_MOD_DYNAMIC && defined(PIC)
 int init_module(int argc, char *argv[]) {
-       return unique_init();
+       return unique_initialize();
 }
 #endif