]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/dn.c
make sure NULL pointers are not dereferenced
[openldap] / servers / slapd / dn.c
index 0f4c1e93961020f06d57f345d88ce7d3b0d1370f..be7b0aea0fa6d5c72cb7d1448a75125c0da4389c 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2005 The OpenLDAP Foundation.
+ * Copyright 1998-2006 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -53,6 +53,8 @@
 
 #define        AVA_PRIVATE( ava ) ( ( AttributeDescription * )(ava)->la_private )
 
+int slap_DN_strict = SLAP_AD_NOINSERT;
+
 static int
 LDAPRDN_validate( LDAPRDN rdn )
 {
@@ -75,7 +77,7 @@ LDAPRDN_validate( LDAPRDN rdn )
                        if ( rc != LDAP_SUCCESS ) {
                                rc = slap_bv2undef_ad( &ava->la_attr,
                                        &ad, &text,
-                                       SLAP_AD_PROXIED|SLAP_AD_NOINSERT );
+                                       SLAP_AD_PROXIED|slap_DN_strict );
                                if ( rc != LDAP_SUCCESS ) {
                                        return LDAP_INVALID_SYNTAX;
                                }
@@ -139,7 +141,7 @@ LDAPDN_validate( LDAPDN dn )
                                if ( rc != LDAP_SUCCESS ) {
                                        rc = slap_bv2undef_ad( &ava->la_attr,
                                                &ad, &text,
-                                               SLAP_AD_PROXIED|SLAP_AD_NOINSERT );
+                                               SLAP_AD_PROXIED|slap_DN_strict );
                                        if ( rc != LDAP_SUCCESS ) {
                                                return LDAP_INVALID_SYNTAX;
                                        }
@@ -356,7 +358,7 @@ LDAPRDN_rewrite( LDAPRDN rdn, unsigned flags, void *ctx )
                        if ( rc != LDAP_SUCCESS ) {
                                rc = slap_bv2undef_ad( &ava->la_attr,
                                        &ad, &text,
-                                       SLAP_AD_PROXIED|SLAP_AD_NOINSERT );
+                                       SLAP_AD_PROXIED|slap_DN_strict );
                                if ( rc != LDAP_SUCCESS ) {
                                        return LDAP_INVALID_SYNTAX;
                                }
@@ -386,7 +388,9 @@ LDAPRDN_rewrite( LDAPRDN rdn, unsigned flags, void *ctx )
                } else { /* normalization */
                        validf = ad->ad_type->sat_syntax->ssyn_validate;
                        mr = ad->ad_type->sat_equality;
-                       if( mr ) normf = mr->smr_normalize;
+                       if( mr && (!( mr->smr_usage & SLAP_MR_MUTATION_NORMALIZER ))) {
+                               normf = mr->smr_normalize;
+                       }
                }
 
                if ( validf ) {
@@ -486,7 +490,7 @@ LDAPDN_rewrite( LDAPDN dn, unsigned flags, void *ctx )
                                if ( rc != LDAP_SUCCESS ) {
                                        rc = slap_bv2undef_ad( &ava->la_attr,
                                                &ad, &text,
-                                               SLAP_AD_PROXIED|SLAP_AD_NOINSERT );
+                                               SLAP_AD_PROXIED|slap_DN_strict );
                                        if ( rc != LDAP_SUCCESS ) {
                                                return LDAP_INVALID_SYNTAX;
                                        }
@@ -516,7 +520,9 @@ LDAPDN_rewrite( LDAPDN dn, unsigned flags, void *ctx )
                        } else { /* normalization */
                                validf = ad->ad_type->sat_syntax->ssyn_validate;
                                mr = ad->ad_type->sat_equality;
-                               if( mr ) normf = mr->smr_normalize;
+                               if( mr && (!( mr->smr_usage & SLAP_MR_MUTATION_NORMALIZER ))) {
+                                       normf = mr->smr_normalize;
+                               }
                        }
 
                        if ( validf ) {
@@ -1300,7 +1306,7 @@ rdn_validate( struct berval *rdn )
 
 /* build_new_dn:
  *
- * Used by ldbm/bdb2 back_modrdn to create the new dn of entries being
+ * Used by back-bdb back_modrdn to create the new dn of entries being
  * renamed.
  *
  * new_dn = parent (p_dn) + separator + rdn (newrdn) + null.
@@ -1315,7 +1321,7 @@ build_new_dn( struct berval * new_dn,
        char *ptr;
 
        if ( parent_dn == NULL || parent_dn->bv_len == 0 ) {
-               ber_dupbv( new_dn, newrdn );
+               ber_dupbv_x( new_dn, newrdn, memctx );
                return;
        }