]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/overlays/rwmmap.c
ITS#5747: Only use C99 flexible array member when supported
[openldap] / servers / slapd / overlays / rwmmap.c
index c5c9142090add4b970eaccd8922dad65dfddcc0b..ad03d87effddc4ccf1c98be167fff91dedb434f3 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1999-2007 The OpenLDAP Foundation.
+ * Copyright 1999-2008 The OpenLDAP Foundation.
  * Portions Copyright 1999-2003 Howard Chu.
  * Portions Copyright 2000-2003 Pierangelo Masarati.
  * All rights reserved.
@@ -32,7 +32,6 @@
 
 #include "slap.h"
 #include "rwm.h"
-#include "lutil.h"
 
 #undef ldap_debug      /* silence a warning in ldap-int.h */
 #include "../../../libraries/libldap/ldap-int.h"
@@ -82,7 +81,9 @@ rwm_map_init( struct ldapmap *lm, struct ldapmapping **m )
                return LDAP_NO_MEMORY;
        }
 
-       /* FIXME: I don't think this is needed any more... */
+       /* NOTE: this is needed to make sure that
+        *      rwm-map attribute *
+        * does not  filter out all attributes including objectClass */
        rc = slap_str2ad( "objectClass", &mapping[0].m_src_ad, &text );
        if ( rc != LDAP_SUCCESS ) {
                ch_free( mapping );
@@ -380,7 +381,6 @@ map_attr_value(
 {
        struct berval           vtmp = BER_BVNULL;
        int                     freeval = 0;
-       char                    uuid[ LDAP_LUTIL_UUIDSTR_BUFSIZE ];
        AttributeDescription    *ad = *adp;
        struct ldapmapping      *mapping = NULL;
 
@@ -422,13 +422,14 @@ map_attr_value(
                                return -1;
                        }
 
-               } else if ( ad->ad_type->sat_syntax == slap_schema.si_ad_entryUUID->ad_type->sat_syntax ) {
-                       vtmp.bv_len = lutil_uuidstr_from_normalized( value->bv_val,
-                               value->bv_len, uuid, LDAP_LUTIL_UUIDSTR_BUFSIZE );
-                       if ( vtmp.bv_len < 0 ) {
+               } else if ( ad->ad_type->sat_equality->smr_usage & SLAP_MR_MUTATION_NORMALIZER ) {
+                       if ( ad->ad_type->sat_equality->smr_normalize(
+                               (SLAP_MR_DENORMALIZE|SLAP_MR_VALUE_OF_ASSERTION_SYNTAX),
+                               NULL, NULL, value, &vtmp, NULL ) )
+                       {
                                return -1;
                        }
-                       vtmp.bv_val = uuid;
+                       freeval = 1;
 
                } else if ( ad == slap_schema.si_ad_objectClass
                                || ad == slap_schema.si_ad_structuralObjectClass )
@@ -494,6 +495,10 @@ rwm_int_filter_map_rewrite(
                return LDAP_OTHER;
        }
 
+       if ( f->f_choice & SLAPD_FILTER_UNDEFINED ) {
+               goto computed;
+       }
+
        switch ( f->f_choice & SLAPD_FILTER_MASK ) {
        case LDAP_FILTER_EQUALITY:
                ad = f->f_av_desc;
@@ -705,7 +710,7 @@ rwm_int_filter_map_rewrite(
 
        case -1:
 computed:;
-               filter_free_x( op, f );
+               filter_free_x( op, f, 0 );
                f->f_choice = SLAPD_FILTER_COMPUTED;
                f->f_result = SLAPD_COMPARE_UNDEFINED;
                /* fallthru */