[389-commits] ldap/servers

Noriko Hosoi nhosoi at fedoraproject.org
Tue Apr 17 18:07:18 UTC 2012


 ldap/servers/plugins/acl/acl.c               |   16 +++++++++----
 ldap/servers/plugins/acl/acllist.c           |    4 +--
 ldap/servers/plugins/chainingdb/cb_add.c     |    2 -
 ldap/servers/plugins/chainingdb/cb_compare.c |    2 -
 ldap/servers/plugins/chainingdb/cb_delete.c  |    2 -
 ldap/servers/plugins/chainingdb/cb_modify.c  |    2 -
 ldap/servers/plugins/chainingdb/cb_modrdn.c  |   32 ++-------------------------
 ldap/servers/plugins/chainingdb/cb_search.c  |    4 +--
 ldap/servers/plugins/referint/referint.c     |    6 +++--
 ldap/servers/plugins/replication/urp.c       |    1 
 ldap/servers/plugins/retrocl/retrocl_po.c    |    1 
 ldap/servers/plugins/uiduniq/7bit.c          |    4 +--
 ldap/servers/plugins/uiduniq/uid.c           |    1 
 ldap/servers/slapd/auditlog.c                |    1 
 ldap/servers/slapd/back-ldbm/ldbm_modrdn.c   |    4 +++
 ldap/servers/slapd/modrdn.c                  |    7 +++++
 ldap/servers/slapd/plugin_acl.c              |    5 +++-
 17 files changed, 46 insertions(+), 48 deletions(-)

New commits:
commit 178fe6a74c793b3c6adc71f571bba40a6271325c
Author: Noriko Hosoi <nhosoi at totoro.usersys.redhat.com>
Date:   Tue Apr 17 09:59:15 2012 -0700

    Trac Ticket #338 - letters in object's cn get converted to
    lowercase when renaming object
    
    https://fedorahosted.org/389/ticket/338
    
    Fix description: The value of newrdn was normalized as dn then
    decapitalized.  The decapitalization was not just needed but
    the cause of the reported bug.
    
    This patch removes the decapitalization call (slapi_dn_ignore_case)
    and adds slapi_dn_ignore_case to acl_access_allowed_modrdn (acl.c)
    and referint_postop_modrdn (referint/referint.c).
    
    Additionally, unnecessary code is being removed from chaining_
    back_modrdn (chainingdb/cb_modrdn.c).

diff --git a/ldap/servers/plugins/acl/acl.c b/ldap/servers/plugins/acl/acl.c
index c8a221e..5a7b446 100644
--- a/ldap/servers/plugins/acl/acl.c
+++ b/ldap/servers/plugins/acl/acl.c
@@ -118,6 +118,7 @@ acl_access_allowed_modrdn(
 {
 	int retCode ;
 	char *newrdn;
+	char *ci_newrdn;
 	const char *oldrdn;
 	Slapi_DN *target_sdn = NULL;
 	int deleteoldrdn = 0;
@@ -139,8 +140,11 @@ acl_access_allowed_modrdn(
 	slapi_pblock_get( pb, SLAPI_MODRDN_TARGET_SDN, &target_sdn );
 	slapi_pblock_get( pb, SLAPI_MODRDN_NEWRDN, &newrdn );
 
+	ci_newrdn = slapi_ch_strdup(newrdn);
+	slapi_dn_ignore_case(ci_newrdn);
 	/* Check can add the new naming attribute */
-	retCode = check_rdn_access( pb, e, newrdn, ACLPB_SLAPI_ACL_WRITE_ADD) ;
+	retCode = check_rdn_access( pb, e, ci_newrdn, ACLPB_SLAPI_ACL_WRITE_ADD) ;
+	slapi_ch_free_string(&ci_newrdn);
 	if ( retCode != LDAP_SUCCESS ) {
 		slapi_log_error( SLAPI_LOG_ACL, plugin_name,
 			"modrdn:write permission to add new naming attribute not allowed\n");
@@ -150,7 +154,7 @@ acl_access_allowed_modrdn(
 	/* Check can delete the new naming attribute--if required */
 	slapi_pblock_get( pb, SLAPI_MODRDN_DELOLDRDN, &deleteoldrdn );
 	if ( deleteoldrdn ) {
-		oldrdn = slapi_sdn_get_dn(target_sdn);
+		oldrdn = slapi_sdn_get_ndn(target_sdn);
 		retCode = check_rdn_access( pb, e, oldrdn, ACLPB_SLAPI_ACL_WRITE_DEL) ;
 		if ( retCode != LDAP_SUCCESS ) {
 			slapi_log_error( SLAPI_LOG_ACL, plugin_name,
@@ -1793,8 +1797,10 @@ acl_modified (Slapi_PBlock *pb, int optype, char *n_dn, void *change)
 
 		/* Change the acls */
 		acllist_acicache_WRITE_LOCK();		
+		/* acllist_moddn_aci_needsLock expects normalized new_DN, 
+		 * which is no need to be case-ignored */
 		acllist_moddn_aci_needsLock ( e_sdn, new_DN );
-		acllist_acicache_WRITE_UNLOCK();		
+		acllist_acicache_WRITE_UNLOCK();
 
 		/* deallocat the parent_DN */
 		if (parent_DN != NULL)  {
@@ -1987,7 +1993,7 @@ acl__resource_match_aci( Acl_PBlock *aclpb, aci_t *aci, int skip_attrEval, int *
 	int						rv;			/* return value */
 	/* Assume that resource matches */
 	int						matches = ACL_TRUE;
-	int						attr_matched;
+	int						attr_matched = ACL_TRUE;
 	int						attr_matched_in_targetattrfilters = 0;
 	int						dn_matched;
 	char					*res_attr;
@@ -2713,7 +2719,7 @@ acl__TestRights(Acl_PBlock *aclpb,int access, char **right, char ** map_generic,
 	char			*acl_tag;
 	int			expr_num;
 	char			*testRights[2];
-	aci_t			*aci;
+	aci_t			*aci = NULL;
 	int			numHandles = 0;
 	
 	TNF_PROBE_0_DEBUG(acl__TestRights_start,"ACL","");
diff --git a/ldap/servers/plugins/acl/acllist.c b/ldap/servers/plugins/acl/acllist.c
index 8eb39b9..9b5363a 100644
--- a/ldap/servers/plugins/acl/acllist.c
+++ b/ldap/servers/plugins/acl/acllist.c
@@ -889,7 +889,7 @@ acllist_acicache_WRITE_LOCK( )
 }
 
 /* This routine must be called with the acicache write lock taken */
-/* newdn is normalized & case-ignored */
+/* newdn is normalized (no need to be case-ignored) */
 int
 acllist_moddn_aci_needsLock ( Slapi_DN *oldsdn, char *newdn )
 {
@@ -919,7 +919,7 @@ acllist_moddn_aci_needsLock ( Slapi_DN *oldsdn, char *newdn )
 
 	/* Now set the new DN */	
 	slapi_sdn_done ( head->acic_sdn );
- 	slapi_sdn_set_ndn_byval ( head->acic_sdn, newdn );
+ 	slapi_sdn_set_normdn_byval ( head->acic_sdn, newdn );
 
 	aciListHead->acic_sdn = NULL;
 	__acllist_free_aciContainer ( &aciListHead );
diff --git a/ldap/servers/plugins/chainingdb/cb_add.c b/ldap/servers/plugins/chainingdb/cb_add.c
index 116ac92..07b90fa 100644
--- a/ldap/servers/plugins/chainingdb/cb_add.c
+++ b/ldap/servers/plugins/chainingdb/cb_add.c
@@ -69,7 +69,7 @@ chaining_back_add ( Slapi_PBlock *pb )
 	const char		*dn = NULL;
 	Slapi_DN		*sdn = NULL;
 	char			*cnxerrbuf=NULL;
-	time_t 			endtime;
+	time_t 			endtime = 0;
 	cb_outgoing_conn	*cnx;
 	
 	if ( (rc=cb_forward_operation(pb)) != LDAP_SUCCESS ) {
diff --git a/ldap/servers/plugins/chainingdb/cb_compare.c b/ldap/servers/plugins/chainingdb/cb_compare.c
index 16f6c7b..594c4bb 100644
--- a/ldap/servers/plugins/chainingdb/cb_compare.c
+++ b/ldap/servers/plugins/chainingdb/cb_compare.c
@@ -67,7 +67,7 @@ chaining_back_compare ( Slapi_PBlock *pb )
 	const char 		*dn = NULL;
 	Slapi_DN		*sdn = NULL; 
 	char 			*cnxerrbuf=NULL;
-	time_t 			endtime;
+	time_t 			endtime = 0;
 	cb_outgoing_conn	*cnx;
 
 	if ( LDAP_SUCCESS != (rc=cb_forward_operation(pb) )) {
diff --git a/ldap/servers/plugins/chainingdb/cb_delete.c b/ldap/servers/plugins/chainingdb/cb_delete.c
index 87a69a2..09972b2 100644
--- a/ldap/servers/plugins/chainingdb/cb_delete.c
+++ b/ldap/servers/plugins/chainingdb/cb_delete.c
@@ -66,7 +66,7 @@ chaining_back_delete ( Slapi_PBlock *pb )
 	Slapi_DN		*sdn = NULL;
 	char 			*matched_msg, *error_msg;
 	char			*cnxerrbuf=NULL;
-	time_t 			endtime;
+	time_t 			endtime = 0;
 	cb_outgoing_conn	*cnx;
 
 	if ( LDAP_SUCCESS != (rc=cb_forward_operation(pb) )) {
diff --git a/ldap/servers/plugins/chainingdb/cb_modify.c b/ldap/servers/plugins/chainingdb/cb_modify.c
index aa914b9..06e6b82 100644
--- a/ldap/servers/plugins/chainingdb/cb_modify.c
+++ b/ldap/servers/plugins/chainingdb/cb_modify.c
@@ -69,7 +69,7 @@ chaining_back_modify ( Slapi_PBlock *pb )
 	Slapi_DN		*sdn = NULL;
 	char 			*matched_msg, *error_msg;
 	char 			*cnxerrbuf=NULL;
-	time_t 			endtime;
+	time_t 			endtime = 0;
 	cb_outgoing_conn	*cnx;
 
 	if ( LDAP_SUCCESS != (rc=cb_forward_operation(pb) )) {
diff --git a/ldap/servers/plugins/chainingdb/cb_modrdn.c b/ldap/servers/plugins/chainingdb/cb_modrdn.c
index b6b882b..1ce6c60 100644
--- a/ldap/servers/plugins/chainingdb/cb_modrdn.c
+++ b/ldap/servers/plugins/chainingdb/cb_modrdn.c
@@ -62,16 +62,13 @@ chaining_back_modrdn ( Slapi_PBlock *pb )
         char                **referrals=NULL;
         LDAPMessage         *res;
         char                *matched_msg, *error_msg;
-        char                *newdn = NULL;
-        const char          *pdn = NULL;
         char                *ndn = NULL;
         Slapi_DN            *sdn = NULL;
-        Slapi_DN            *psdn = NULL;
         int                 deleteoldrdn = 0;
         Slapi_DN            *newsuperior = NULL;
         char                *newrdn = NULL;
         char                * cnxerrbuf=NULL;
-        time_t              endtime;
+        time_t              endtime = 0;
         cb_outgoing_conn    *cnx;
 
         if ( LDAP_SUCCESS != (rc=cb_forward_operation(pb) )) {
@@ -90,36 +87,13 @@ chaining_back_modrdn ( Slapi_PBlock *pb )
         }
 
         slapi_pblock_get( pb, SLAPI_MODRDN_TARGET_SDN, &sdn );
+        /* newrdn is passed to ldap_rename, which does not require case-ignored
+         * newrdn. */
         slapi_pblock_get( pb, SLAPI_MODRDN_NEWRDN, &newrdn );
         slapi_pblock_get( pb, SLAPI_MODRDN_NEWSUPERIOR_SDN, &newsuperior );
         slapi_pblock_get( pb, SLAPI_MODRDN_DELOLDRDN, &deleteoldrdn );
 
         ndn = (char *)slapi_sdn_get_ndn(sdn);
-
-        /*
-         * Construct the new dn
-         */
-        psdn = slapi_sdn_new();
-        slapi_sdn_get_parent(sdn, psdn);
-        pdn = slapi_sdn_get_ndn(psdn);
-
-        if ( pdn ) {
-            /* parent + rdn + separator(s) + null */
-            newdn = slapi_ch_smprintf("%s,%s", newrdn, pdn);
-        } else {
-            newdn = slapi_ch_strdup( newrdn );
-        }
-        slapi_sdn_free(&psdn);
-
-	/*
-	 * Make sure the current backend is managing
-	 * the new dn. We won't support moving entries
-	 * across backend this way.
-	 * Done in the front-end.
-	 */
-
-	slapi_ch_free((void **)&newdn);
-
 	if (cb->local_acl && !cb->associated_be_is_disabled) {
 		/* 
 		* Check local acls
diff --git a/ldap/servers/plugins/chainingdb/cb_search.c b/ldap/servers/plugins/chainingdb/cb_search.c
index 92eb2ea..a27e767 100644
--- a/ldap/servers/plugins/chainingdb/cb_search.c
+++ b/ldap/servers/plugins/chainingdb/cb_search.c
@@ -77,7 +77,7 @@ chainingdb_build_candidate_list ( Slapi_PBlock *pb )
 	char                    **referrals=NULL;
 	char			*cnxerrbuf=NULL;
 	time_t 			endbefore=0;
-	time_t			endtime;
+	time_t			endtime = 0;
 	cb_outgoing_conn	*cnx;
 
 	slapi_pblock_get( pb, SLAPI_BACKEND, &be );
@@ -459,7 +459,7 @@ chainingdb_next_search_entry ( Slapi_PBlock *pb )
 	char 			**referrals=NULL;
 	cb_backend_instance 	* cb=NULL;
 	Slapi_Backend		* be;
-	time_t			endtime;
+	time_t			endtime = 0;
 
 	matched_msg=error_msg=NULL;
 
diff --git a/ldap/servers/plugins/referint/referint.c b/ldap/servers/plugins/referint/referint.c
index fcb70fb..e8d4ead 100644
--- a/ldap/servers/plugins/referint/referint.c
+++ b/ldap/servers/plugins/referint/referint.c
@@ -296,8 +296,7 @@ referint_postop_modrdn( Slapi_PBlock *pb )
 	}else if(delay == 0){
 	  /* no delay */
 	  /* call function to update references to entry */
-	  rc = update_integrity(argv, sdn, newrdn,
-	                        newsuperior, logChanges);
+	  rc = update_integrity(argv, sdn, newrdn, newsuperior, logChanges);
 	}else{
 	  /* write the entry to integrity log */
 	  writeintegritylog(pb, argv[1], sdn, newrdn, newsuperior, NULL /* slapi_get_requestor_sdn(pb) */);
@@ -412,6 +411,7 @@ _update_one_per_mod(Slapi_DN *entrySDN,      /* DN of the searched entry */
         }
         /* newRDN and superior are already normalized. */
         newDN = slapi_ch_smprintf("%s,%s", newRDN, superior);
+        slapi_dn_ignore_case(newDN);
         /* 
          * Compare the modified dn with the value of 
          * the target attribute of referint to find out
@@ -590,7 +590,9 @@ _update_all_per_mod(Slapi_DN *entrySDN,      /* DN of the searched entry */
             /* no need to free superior */
             superior = slapi_dn_find_parent(origDN);
         }
+        /* newRDN and superior are already normalized. */
         newDN = slapi_ch_smprintf("%s,%s", newRDN, superior);
+        slapi_dn_ignore_case(newDN);
         /* 
          * Compare the modified dn with the value of 
          * the target attribute of referint to find out
diff --git a/ldap/servers/plugins/replication/urp.c b/ldap/servers/plugins/replication/urp.c
index 7000b0e..a0168fb 100644
--- a/ldap/servers/plugins/replication/urp.c
+++ b/ldap/servers/plugins/replication/urp.c
@@ -320,6 +320,7 @@ urp_modrdn_operation( Slapi_PBlock *pb )
 
 	/* The DN CSN is older than the Operation CSN. Apply the operation */
 	target_sdn = slapi_entry_get_sdn_const (target_entry);
+	/* newrdn is no need to be case-ignored (get_rdn_plus_uniqueid) */
 	slapi_pblock_get(pb, SLAPI_MODRDN_NEWRDN, &newrdn);
 	slapi_pblock_get(pb, SLAPI_TARGET_UNIQUEID, &op_uniqueid);
    	slapi_pblock_get(pb, SLAPI_MODRDN_PARENT_ENTRY, &parent_entry);
diff --git a/ldap/servers/plugins/retrocl/retrocl_po.c b/ldap/servers/plugins/retrocl/retrocl_po.c
index 29ce79f..c3d1c41 100644
--- a/ldap/servers/plugins/retrocl/retrocl_po.c
+++ b/ldap/servers/plugins/retrocl/retrocl_po.c
@@ -638,6 +638,7 @@ int retrocl_postob (Slapi_PBlock *pb,int optype)
     case OP_DELETE:
     	break;
     case OP_MODRDN:
+    	/* newrdn is used just for logging; no need to be normalized */
     	(void)slapi_pblock_get( pb, SLAPI_MODRDN_NEWRDN, &newrdn );
     	(void)slapi_pblock_get( pb, SLAPI_MODRDN_DELOLDRDN, &flag );
     	(void)slapi_pblock_get( pb, SLAPI_MODIFY_MODS, &modrdn_mods );
diff --git a/ldap/servers/plugins/uiduniq/7bit.c b/ldap/servers/plugins/uiduniq/7bit.c
index 1b263f8..fbcc530 100644
--- a/ldap/servers/plugins/uiduniq/7bit.c
+++ b/ldap/servers/plugins/uiduniq/7bit.c
@@ -606,8 +606,8 @@ preop_modrdn(Slapi_PBlock *pb)
 
     /* NOTE: strdup on the rdn, since it will be freed when
      * the entry is freed */
-
-    slapi_entry_set_dn(e, slapi_ch_strdup(rdn));
+    /* slapi_entry_set_normdn expects rdn normalized, but not decapitalized */
+    slapi_entry_set_normdn(e, slapi_ch_strdup(rdn));
 
     err = slapi_entry_add_rdn_values(e);
     if (err)
diff --git a/ldap/servers/plugins/uiduniq/uid.c b/ldap/servers/plugins/uiduniq/uid.c
index 25bc4e9..bc91523 100644
--- a/ldap/servers/plugins/uiduniq/uid.c
+++ b/ldap/servers/plugins/uiduniq/uid.c
@@ -946,6 +946,7 @@ preop_modrdn(Slapi_PBlock *pb)
     }
 
     /* Apply the rename operation to the dummy entry. */
+    /* slapi_entry_rename does not expect rdn normalized */
     err = slapi_entry_rename(e, rdn, deloldrdn, slapi_sdn_get_dn(superior));
     if (err != LDAP_SUCCESS) { result = uid_op_error(36); break; }
 
diff --git a/ldap/servers/slapd/auditlog.c b/ldap/servers/slapd/auditlog.c
index 0128f2f..79cd407 100644
--- a/ldap/servers/slapd/auditlog.c
+++ b/ldap/servers/slapd/auditlog.c
@@ -91,6 +91,7 @@ write_audit_log_entry( Slapi_PBlock *pb )
         break;
     
     case SLAPI_OPERATION_MODDN:
+        /* newrdn: change is just for logging -- case does not matter. */
         slapi_pblock_get( pb, SLAPI_MODRDN_NEWRDN, &change );
         slapi_pblock_get( pb, SLAPI_MODRDN_DELOLDRDN, &flag );
         break;
diff --git a/ldap/servers/slapd/back-ldbm/ldbm_modrdn.c b/ldap/servers/slapd/back-ldbm/ldbm_modrdn.c
index 08a8841..300dca1 100644
--- a/ldap/servers/slapd/back-ldbm/ldbm_modrdn.c
+++ b/ldap/servers/slapd/back-ldbm/ldbm_modrdn.c
@@ -162,6 +162,8 @@ ldbm_back_modrdn( Slapi_PBlock *pb )
     inst = (ldbm_instance *) be->be_instance_info;
     {
         char *newrdn/* , *newsuperiordn */;
+        /* newrdn is normalized, bu tno need to be case-ignored as 
+         * it's passed to slapi_sdn_init_normdn_byref */
         slapi_pblock_get( pb, SLAPI_MODRDN_NEWRDN, &newrdn );
         slapi_pblock_get( pb, SLAPI_MODRDN_NEWSUPERIOR_SDN, &dn_newsuperiordn );
         slapi_sdn_init_normdn_byref(&dn_newrdn, newrdn);
@@ -229,6 +231,8 @@ ldbm_back_modrdn( Slapi_PBlock *pb )
         {
             /* see if an entry with the new name already exists */
             done_with_pblock_entry(pb,SLAPI_MODRDN_EXISTING_ENTRY); /* Could be through this multiple times */
+            /* newrdn is normalized, bu tno need to be case-ignored as 
+             * it's passed to slapi_sdn_init_normdn_byref */
             slapi_pblock_get(pb, SLAPI_MODRDN_NEWRDN, &newrdn);
             slapi_sdn_init_normdn_byref(&dn_newrdn, newrdn);
             newdn= moddn_get_newdn(pb,sdn, &dn_newrdn, dn_newsuperiordn);
diff --git a/ldap/servers/slapd/modrdn.c b/ldap/servers/slapd/modrdn.c
index 2c8aae8..98ab777 100644
--- a/ldap/servers/slapd/modrdn.c
+++ b/ldap/servers/slapd/modrdn.c
@@ -191,7 +191,6 @@ do_modrdn( Slapi_PBlock *pb )
 		slapi_ch_free_string( &rawnewsuperior );
 		goto free_and_return;
 	}
-	slapi_dn_ignore_case( newrdn );
 	slapi_ch_free_string( &rawnewrdn );
 
 	if (rawnewsuperior) {
@@ -218,6 +217,8 @@ do_modrdn( Slapi_PBlock *pb )
 	 */ 
 	parent = slapi_dn_parent(slapi_sdn_get_ndn(&sdn));
 	newdn = slapi_ch_smprintf("%s,%s", newrdn, parent);
+	/* slapi_sdn_init_normdn_passin expects normalized but NOT
+	 * decapitalized dn */
 	slapi_sdn_init_normdn_passin(&snewdn, newdn); /* newdn is normalized */
 	if (0 == slapi_sdn_compare(&sdn, snewsuperior) ||
 	    0 == slapi_sdn_compare(&snewdn, snewsuperior)) {
@@ -560,6 +561,7 @@ op_shared_rename(Slapi_PBlock *pb, int passin_args)
 	}
 
 	/* check if created attributes are used in the new RDN */
+	/* check_rdn_for_created_attrs ignores the cases */
 	if (check_rdn_for_created_attrs((const char *)newrdn)) {
 		send_ldap_result(pb, LDAP_INVALID_DN_SYNTAX, NULL, "invalid attribute in RDN", 0, NULL);
 		goto free_and_return_nolock;
@@ -607,6 +609,8 @@ op_shared_rename(Slapi_PBlock *pb, int passin_args)
 	 * appropriate one, or send a referral to our "referral server"
 	 * if we don't hold it.
 	 */
+	/* slapi_mapping_tree_select_and_check ignores the case of newdn
+	 * which is generated using newrdn above. */
 	if ((err = slapi_mapping_tree_select_and_check(pb, newdn, &be, &referral, errorbuf)) != LDAP_SUCCESS)
 	{
 		send_ldap_result(pb, err, NULL, errorbuf, 0, NULL);
@@ -707,6 +711,7 @@ free_and_return_nolock:
 		} else {
 			slapi_pblock_get(pb, SLAPI_MODRDN_TARGET_SDN, &sdn);
 			slapi_sdn_free(&sdn);
+			/* get newrdn to free the string */
 			slapi_pblock_get(pb, SLAPI_MODRDN_NEWRDN, &newrdn);
 			slapi_ch_free_string(&newrdn);
 			slapi_pblock_get(pb, SLAPI_MODRDN_NEWSUPERIOR_SDN, &newsuperiorsdn);
diff --git a/ldap/servers/slapd/plugin_acl.c b/ldap/servers/slapd/plugin_acl.c
index 24dcc76..b878156 100644
--- a/ldap/servers/slapd/plugin_acl.c
+++ b/ldap/servers/slapd/plugin_acl.c
@@ -157,7 +157,10 @@ plugin_call_acl_mods_update ( Slapi_PBlock *pb, int optype )
 			sdn = slapi_entry_get_sdn(te);
 		}
 		break;
-    	  case SLAPI_OPERATION_MODRDN:
+	  case SLAPI_OPERATION_MODRDN:
+		/* newrdn: "change" is normalized but not case-ignored */
+		/* The acl plugin expects normalized newrdn, but no need to be case-
+		 * ignored. */
 		(void)slapi_pblock_get( pb, SLAPI_MODRDN_NEWRDN, &change );
 		break;
 	}




More information about the 389-commits mailing list