]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-ldbm/alias.c
Use dnIsSuffix
[openldap] / servers / slapd / back-ldbm / alias.c
index bb41e99aeb31733cde0242f2b6f3473c0629f20f..c2d4354fe1bb97a85ea9668f9a1d8b7f234f5a57 100644 (file)
@@ -1,6 +1,6 @@
 /* $OpenLDAP$ */
 /*
- * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
  */
 
 static char* get_alias_dn(
        Entry *e,
        int *err,
-       char **errmsg );
+       const char **errmsg );
 
 static char* new_superior(
-       char *dn,
-       char *oldSup,
-       char *newSup );
+       const char *dn,
+       const char *oldSup,
+       const char *newSup );
 
 static int dnlist_subordinate(
        char** dnlist,
-       char *dn );
+       const char *dn );
 
 Entry *deref_internal_r(
        Backend*        be,
        Entry*          alias,
-       char*           dn,
+       struct berval*  dn_in,
        int*            err,
        Entry**         matched,
-       char**          text )
+       const char**            text )
 {
+       char *dn;
        struct ldbminfo *li = (struct ldbminfo *) be->be_private;
        Entry *entry;
        Entry *sup;
        unsigned depth;
        char **dnlist;
 
-       assert( ( alias != NULL && dn == NULL ) || ( alias == NULL && dn != NULL ) );
+       assert( ( alias != NULL && dn_in == NULL )
+               || ( alias == NULL && dn_in != NULL ) );
 
        *matched = NULL;
-       *err = LDAP_SUCCESS;
+       *err = LDAP_NO_SUCH_OBJECT;
        *text = NULL;
 
        if( alias == NULL ) {
-               dn = ch_strdup( dn );
+               dn = ch_strdup( dn_in->bv_val );
                entry = dn2entry_r( be, dn, &sup );
 
        } else {
@@ -93,6 +95,7 @@ Entry *deref_internal_r(
 
                        /* check if aliasDN is a subordinate of any DN in our list */
                        if( dnlist_subordinate( dnlist, aliasDN ) ) {
+                               ch_free( aliasDN );
                                *matched = entry;
                                entry = NULL;
                                *err = LDAP_ALIAS_PROBLEM;
@@ -103,6 +106,7 @@ Entry *deref_internal_r(
                        /* attempt to dereference alias */
 
                        newe = dn2entry_r( be, aliasDN, &sup );
+                       ch_free( aliasDN );
 
                        if( newe != NULL ) {
                                free( dn );
@@ -111,7 +115,6 @@ Entry *deref_internal_r(
                                dn = ch_strdup( entry->e_ndn );
                                charray_add( &dnlist, dn );
                                continue;
-
                        }
                        
                        if ( sup != NULL ) {
@@ -155,6 +158,7 @@ Entry *deref_internal_r(
                        }
 
                        aliasDN = new_superior( dn, sup->e_ndn, supDN );
+                       free(supDN);
 
                        if( aliasDN == NULL ) {
                                free(aliasDN);
@@ -213,9 +217,15 @@ Entry *deref_internal_r(
 static char* get_alias_dn(
        Entry *e,
        int *err,
-       char **errmsg )
+       const char **errmsg )
 {      
-       Attribute *a = attr_find( e->e_attrs, "aliasedobjectname" );
+       int rc;
+       struct berval ndn;
+       Attribute *a;
+       AttributeDescription *aliasedObjectName
+               = slap_schema.si_ad_aliasedObjectName;
+
+       a = attr_find( e->e_attrs, aliasedObjectName );
 
        if( a == NULL ) {
                /*
@@ -244,13 +254,20 @@ static char* get_alias_dn(
                return NULL;
        }
 
-       return a->a_vals[0]->bv_val;
+       rc = dnNormalize2( NULL, a->a_vals[0], &ndn );
+       if( rc != LDAP_SUCCESS ) {
+               *err = LDAP_ALIAS_PROBLEM;
+               *errmsg = "alias aliasedObjectName value is invalid";
+               return NULL;
+       }
+
+       return ndn.bv_val;
 }
 
-char* new_superior(
-       char *dn,
-       char *oldSup,
-       char *newSup )
+static char* new_superior(
+       const char *dn,
+       const char *oldSup,
+       const char *newSup )
 {
        char *newDN;
        size_t dnlen, olen, nlen;
@@ -262,8 +279,8 @@ char* new_superior(
 
        newDN = ch_malloc( dnlen - olen + nlen + 1 );
 
-       memcpy( newDN, dn, dnlen - olen );
-       memcpy( &newDN[dnlen - olen], newSup, nlen );
+       AC_MEMCPY( newDN, dn, dnlen - olen );
+       AC_MEMCPY( &newDN[dnlen - olen], newSup, nlen );
        newDN[dnlen - olen + nlen] = '\0';
 
        return newDN;
@@ -271,7 +288,7 @@ char* new_superior(
 
 static int dnlist_subordinate(
        char** dnlist,
-       char *dn )
+       const char *dn )
 {
        int i;
        assert( dnlist );