]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/dn.c
More for ITS#6045: clear o_callback as well.
[openldap] / servers / slapd / dn.c
index b71dfc95f618cabf591dce774030e5e0938392bb..331035b9cc318cec02aff565bf7a7d27c221af37 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2007 The OpenLDAP Foundation.
+ * Copyright 1998-2009 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -220,10 +220,7 @@ rdnValidate(
 /*
  * AVA sorting inside a RDN
  *
- * rule: sort attributeTypes in alphabetical order; in case of multiple
- * occurrences of the same attributeType, sort values in byte order
- * (use memcmp, which implies alphabetical order in case of IA5 value;
- * this should guarantee the repeatability of the operation).
+ * Rule: sort attributeTypes in alphabetical order.
  *
  * Note: the sorting can be slightly improved by sorting first
  * by attribute type length, then by alphabetical order.
@@ -250,21 +247,8 @@ AVA_Sort( LDAPRDN rdn, int nAVAs )
                        ava_j = rdn[ j ];
                        a = strcmp( ava_i->la_attr.bv_val, ava_j->la_attr.bv_val );
 
-                       if ( a == 0 ) {
-                               int             d;
-
-                               d = ava_i->la_value.bv_len - ava_j->la_value.bv_len;
-
-                               a = memcmp( ava_i->la_value.bv_val, 
-                                               ava_j->la_value.bv_val,
-                                               d <= 0 ? ava_i->la_value.bv_len 
-                                                       : ava_j->la_value.bv_len );
-
-                               if ( a == 0 ) {
-                                       a = d;
-                               }
-                       }
-                       /* Duplicates are not allowed */
+                       /* RFC4512 does not allow multiple AVAs
+                        * with the same attribute type in RDN (ITS#5968) */
                        if ( a == 0 )
                                return LDAP_INVALID_DN_SYNTAX;
 
@@ -439,7 +423,7 @@ dnNormalize(
        assert( val != NULL );
        assert( out != NULL );
 
-       Debug( LDAP_DEBUG_TRACE, ">>> dnNormalize: <%s>\n", val->bv_val, 0, 0 );
+       Debug( LDAP_DEBUG_TRACE, ">>> dnNormalize: <%s>\n", val->bv_val ? val->bv_val : "", 0, 0 );
 
        if ( val->bv_len != 0 ) {
                LDAPDN          dn = NULL;
@@ -478,7 +462,7 @@ dnNormalize(
                ber_dupbv_x( out, val, ctx );
        }
 
-       Debug( LDAP_DEBUG_TRACE, "<<< dnNormalize: <%s>\n", out->bv_val, 0, 0 );
+       Debug( LDAP_DEBUG_TRACE, "<<< dnNormalize: <%s>\n", out->bv_val ? out->bv_val : "", 0, 0 );
 
        return LDAP_SUCCESS;
 }
@@ -495,7 +479,7 @@ rdnNormalize(
        assert( val != NULL );
        assert( out != NULL );
 
-       Debug( LDAP_DEBUG_TRACE, ">>> dnNormalize: <%s>\n", val->bv_val, 0, 0 );
+       Debug( LDAP_DEBUG_TRACE, ">>> dnNormalize: <%s>\n", val->bv_val ? val->bv_val : "", 0, 0 );
        if ( val->bv_len != 0 ) {
                LDAPRDN         rdn = NULL;
                int             rc;
@@ -536,7 +520,7 @@ rdnNormalize(
                ber_dupbv_x( out, val, ctx );
        }
 
-       Debug( LDAP_DEBUG_TRACE, "<<< dnNormalize: <%s>\n", out->bv_val, 0, 0 );
+       Debug( LDAP_DEBUG_TRACE, "<<< dnNormalize: <%s>\n", out->bv_val ? out->bv_val : "", 0, 0 );
 
        return LDAP_SUCCESS;
 }
@@ -551,7 +535,7 @@ dnPretty(
        assert( val != NULL );
        assert( out != NULL );
 
-       Debug( LDAP_DEBUG_TRACE, ">>> dnPretty: <%s>\n", val->bv_val, 0, 0 );
+       Debug( LDAP_DEBUG_TRACE, ">>> dnPretty: <%s>\n", val->bv_val ? val->bv_val : "", 0, 0 );
 
        if ( val->bv_len == 0 ) {
                ber_dupbv_x( out, val, ctx );
@@ -593,7 +577,7 @@ dnPretty(
                }
        }
 
-       Debug( LDAP_DEBUG_TRACE, "<<< dnPretty: <%s>\n", out->bv_val, 0, 0 );
+       Debug( LDAP_DEBUG_TRACE, "<<< dnPretty: <%s>\n", out->bv_val ? out->bv_val : "", 0, 0 );
 
        return LDAP_SUCCESS;
 }
@@ -608,7 +592,7 @@ rdnPretty(
        assert( val != NULL );
        assert( out != NULL );
 
-       Debug( LDAP_DEBUG_TRACE, ">>> dnPretty: <%s>\n", val->bv_val, 0, 0 );
+       Debug( LDAP_DEBUG_TRACE, ">>> rdnPretty: <%s>\n", val->bv_val ? val->bv_val : "", 0, 0 );
 
        if ( val->bv_len == 0 ) {
                ber_dupbv_x( out, val, ctx );
@@ -652,7 +636,7 @@ rdnPretty(
                }
        }
 
-       Debug( LDAP_DEBUG_TRACE, "<<< dnPretty: <%s>\n", out->bv_val, 0, 0 );
+       Debug( LDAP_DEBUG_TRACE, "<<< dnPretty: <%s>\n", out->bv_val ? out->bv_val : "", 0, 0 );
 
        return LDAP_SUCCESS;
 }
@@ -671,7 +655,7 @@ dnPrettyNormalDN(
 
        Debug( LDAP_DEBUG_TRACE, ">>> dn%sDN: <%s>\n", 
                        flags == SLAP_LDAPDN_PRETTY ? "Pretty" : "Normal", 
-                       val->bv_val, 0 );
+                       val->bv_val ? val->bv_val : "", 0 );
 
        if ( val->bv_len == 0 ) {
                return LDAP_SUCCESS;
@@ -718,7 +702,7 @@ dnPrettyNormal(
        struct berval *normal,
        void *ctx)
 {
-       Debug( LDAP_DEBUG_TRACE, ">>> dnPrettyNormal: <%s>\n", val->bv_val, 0, 0 );
+       Debug( LDAP_DEBUG_TRACE, ">>> dnPrettyNormal: <%s>\n", val->bv_val ? val->bv_val : "", 0, 0 );
 
        assert( val != NULL );
        assert( pretty != NULL );
@@ -786,7 +770,8 @@ dnPrettyNormal(
        }
 
        Debug( LDAP_DEBUG_TRACE, "<<< dnPrettyNormal: <%s>, <%s>\n",
-               pretty->bv_val, normal->bv_val, 0 );
+               pretty->bv_val ? pretty->bv_val : "",
+               normal->bv_val ? normal->bv_val : "", 0 );
 
        return LDAP_SUCCESS;
 }
@@ -1076,7 +1061,7 @@ dn_rdnlen(
 
        p = ber_bvchr( dn_in, ',' );
 
-       return p ? p - dn_in->bv_val : dn_in->bv_len;
+       return p ? (ber_len_t) (p - dn_in->bv_val) : dn_in->bv_len;
 }