[389-commits] Branch '389-ds-base-1.2.11' - 3 commits - ldap/servers

Richard Allen Megginson rmeggins at fedoraproject.org
Thu Jul 19 21:35:24 UTC 2012


 ldap/servers/plugins/syntaxes/nameoptuid.c |    3 -
 ldap/servers/plugins/syntaxes/string.c     |   61 +++++++++++++++++++++++------
 ldap/servers/slapd/attr.c                  |    6 ++
 ldap/servers/slapd/attrlist.c              |    6 +-
 ldap/servers/slapd/back-ldbm/index.c       |    4 +
 ldap/servers/slapd/back-ldbm/ldbm_add.c    |    2 
 ldap/servers/slapd/entry.c                 |    4 -
 ldap/servers/slapd/entrywsi.c              |    6 +-
 ldap/servers/slapd/slapi-plugin.h          |   10 ++++
 ldap/servers/slapd/slapi-private.h         |    4 -
 ldap/servers/slapd/utf8compare.c           |   19 +++++++--
 ldap/servers/slapd/value.c                 |    3 -
 ldap/servers/slapd/valueset.c              |    4 -
 13 files changed, 101 insertions(+), 31 deletions(-)

New commits:
commit 8e72028edfe2f17482c183cad23e74d83a1835d7
Author: Noriko Hosoi <nhosoi at totoro.usersys.redhat.com>
Date:   Tue Jul 17 18:53:54 2012 -0700

    12813: Uninitialized pointer read
    string_values2keys (plugins/syntaxes/string.c)
    Commit 2bac5ab553395550af33bf92082877ef6b4c5427 missed to set
    an value bvp for the newly added case ((syntax & SYNTAX_DN) &&
    (value_flags & SLAPI_ATTR_FLAG_NORMALIZED_CES)), which caused
    the uninitialized pointer read. This patch sets bvp for all
    3 cases.
    (cherry picked from commit 40013a5277599aeba62cb0996bbf9860e2acbe34)

diff --git a/ldap/servers/plugins/syntaxes/string.c b/ldap/servers/plugins/syntaxes/string.c
index 8d04746..e5bdc18 100644
--- a/ldap/servers/plugins/syntaxes/string.c
+++ b/ldap/servers/plugins/syntaxes/string.c
@@ -605,6 +605,7 @@ string_values2keys( Slapi_PBlock *pb, Slapi_Value **bvals,
 				/* This dn value is case-normalized */
 				value_flags &= ~SLAPI_ATTR_FLAG_NORMALIZED_CES;
 				value_flags |= SLAPI_ATTR_FLAG_NORMALIZED_CIS;
+				bvp = slapi_value_get_berval(bvdup);
 			} else {
 				bvp = slapi_value_get_berval(*bvlp);
 			}


commit a4f6ecb1bee63298a98f10dfac0a7c4e1a78b2b5
Author: Noriko Hosoi <nhosoi at redhat.com>
Date:   Fri Jul 13 11:56:30 2012 -0700

    Trac Ticket #346 - Slow ldapmodify operation time for large quantities of multi-valued attribute values
    
    https://fedorahosted.org/389/ticket/346
    
    Fix Description:
    Fix in "commit c0151f78509c35250095da6e2785842337963008" takes
    advantage of the knowledge on normalized attribute DNs.  When
    generating index keys from the attribute value, it has to be
    case normalized, but the attribute DN is normalized w/o the
    cases lowered.  This patch introduces attribute flags to
    distinguish the 2 cases:
      SLAPI_ATTR_FLAG_NORMALIZED_CES - normalized but not case-
                                       normalized.
      SLAPI_ATTR_FLAG_NORMALIZED_CIS - case-normalized
    And SLAPI_ATTR_FLAG_NORMALIZED is the combination of the 2
    macros.
    (cherry picked from commit 2bac5ab553395550af33bf92082877ef6b4c5427)

diff --git a/ldap/servers/plugins/syntaxes/string.c b/ldap/servers/plugins/syntaxes/string.c
index 5c78d6a..8d04746 100644
--- a/ldap/servers/plugins/syntaxes/string.c
+++ b/ldap/servers/plugins/syntaxes/string.c
@@ -448,21 +448,31 @@ string_values2keys( Slapi_PBlock *pb, Slapi_Value **bvals,
 
 		for ( bvlp = bvals, nbvlp = nbvals; bvlp && *bvlp; bvlp++, nbvlp++ )
 		{
+			unsigned long value_flags = slapi_value_get_flags(*bvlp);
 			c = slapi_ch_strdup(slapi_value_get_string(*bvlp));
 			/* if the NORMALIZED flag is set, skip normalizing */
-			if (!(slapi_value_get_flags(*bvlp) & SLAPI_ATTR_FLAG_NORMALIZED)) {
+			if (!(value_flags & SLAPI_ATTR_FLAG_NORMALIZED)) {
 				/* 3rd arg: 1 - trim leading blanks */
 				value_normalize_ext( c, syntax, 1, &alt );
+				value_flags |= SLAPI_ATTR_FLAG_NORMALIZED;
+			} else if ((syntax & SYNTAX_DN) &&
+			           (value_flags & SLAPI_ATTR_FLAG_NORMALIZED_CES)) {
+				/* This dn value is normalized, but not case-normalized. */
+				slapi_dn_ignore_case(c);
+				/* This dn value is case-normalized */
+				value_flags &= ~SLAPI_ATTR_FLAG_NORMALIZED_CES;
+				value_flags |= SLAPI_ATTR_FLAG_NORMALIZED_CIS;
 			}
 			if (alt) {
 				slapi_ch_free_string(&c);
-		    	*nbvlp = slapi_value_new_string_passin(alt);
+				*nbvlp = slapi_value_new_string_passin(alt);
 				alt = NULL;
 			} else {
-		    	*nbvlp = slapi_value_new_string_passin(c);
+				*nbvlp = slapi_value_new_string_passin(c);
+				c = NULL;
 			}
 			/* new value is normalized */
-			slapi_value_set_flags(*nbvlp, slapi_value_get_flags(*bvlp)|SLAPI_ATTR_FLAG_NORMALIZED);
+			slapi_value_set_flags(*nbvlp, value_flags);
 		}
 		*ivals = nbvals;
 		break;
@@ -570,8 +580,9 @@ string_values2keys( Slapi_PBlock *pb, Slapi_Value **bvals,
 
 		bvdup= slapi_value_new(); 
 		for ( bvlp = bvals; bvlp && *bvlp; bvlp++ ) {
+			unsigned long value_flags = slapi_value_get_flags(*bvlp);
 			/* 3rd arg: 1 - trim leading blanks */
-			if (!(slapi_value_get_flags(*bvlp) & SLAPI_ATTR_FLAG_NORMALIZED)) {
+			if (!(value_flags & SLAPI_ATTR_FLAG_NORMALIZED)) {
 				c = slapi_ch_strdup(slapi_value_get_string(*bvlp));
 				value_normalize_ext( c, syntax, 1, &alt );
 				if (alt) {
@@ -583,6 +594,17 @@ string_values2keys( Slapi_PBlock *pb, Slapi_Value **bvals,
 					c = NULL;
 				}
 				bvp = slapi_value_get_berval(bvdup);
+				value_flags |= SLAPI_ATTR_FLAG_NORMALIZED;
+			} else if ((syntax & SYNTAX_DN) &&
+			           (value_flags & SLAPI_ATTR_FLAG_NORMALIZED_CES)) {
+				/* This dn value is normalized, but not case-normalized. */
+				c = slapi_ch_strdup(slapi_value_get_string(*bvlp));
+				slapi_dn_ignore_case(c);
+				slapi_value_set_string_passin(bvdup, c);
+				c = NULL;
+				/* This dn value is case-normalized */
+				value_flags &= ~SLAPI_ATTR_FLAG_NORMALIZED_CES;
+				value_flags |= SLAPI_ATTR_FLAG_NORMALIZED_CIS;
 			} else {
 				bvp = slapi_value_get_berval(*bvlp);
 			}
@@ -595,7 +617,7 @@ string_values2keys( Slapi_PBlock *pb, Slapi_Value **bvals,
 				}
 				buf[substrlens[INDEX_SUBSTRBEGIN]] = '\0';
 				(*ivals)[n] = slapi_value_new_string(buf);
-				slapi_value_set_flags((*ivals)[n], slapi_value_get_flags(*bvlp)|SLAPI_ATTR_FLAG_NORMALIZED);
+				slapi_value_set_flags((*ivals)[n], value_flags);
 				n++;
 			}
 
@@ -608,7 +630,7 @@ string_values2keys( Slapi_PBlock *pb, Slapi_Value **bvals,
 				}
 				buf[substrlens[INDEX_SUBSTRMIDDLE]] = '\0';
 				(*ivals)[n] = slapi_value_new_string(buf);
-				slapi_value_set_flags((*ivals)[n], slapi_value_get_flags(*bvlp)|SLAPI_ATTR_FLAG_NORMALIZED);
+				slapi_value_set_flags((*ivals)[n], value_flags);
 				n++;
 			}
 
@@ -621,7 +643,7 @@ string_values2keys( Slapi_PBlock *pb, Slapi_Value **bvals,
 				buf[substrlens[INDEX_SUBSTREND] - 1] = '$';
 				buf[substrlens[INDEX_SUBSTREND]] = '\0';
 				(*ivals)[n] = slapi_value_new_string(buf);
-				slapi_value_set_flags((*ivals)[n], slapi_value_get_flags(*bvlp)|SLAPI_ATTR_FLAG_NORMALIZED);
+				slapi_value_set_flags((*ivals)[n], value_flags);
 				n++;
 			}
 		}
@@ -674,8 +696,16 @@ string_assertion2keys_ava(
                 alt = NULL;
             }
             tmpval->bv.bv_len=strlen(tmpval->bv.bv_val);
+            flags |= SLAPI_ATTR_FLAG_NORMALIZED;
+        } else if ((syntax & SYNTAX_DN) &&
+                   (flags & SLAPI_ATTR_FLAG_NORMALIZED_CES)) {
+            /* This dn value is normalized, but not case-normalized. */
+            slapi_dn_ignore_case(tmpval->bv.bv_val);
+            /* This dn value is case-normalized */
+            flags &= ~SLAPI_ATTR_FLAG_NORMALIZED_CES;
+            flags |= SLAPI_ATTR_FLAG_NORMALIZED_CIS;
         }
-        slapi_value_set_flags(tmpval, flags|SLAPI_ATTR_FLAG_NORMALIZED);
+        slapi_value_set_flags(tmpval, flags);
         break;
 	case LDAP_FILTER_EQUALITY:
 		(*ivals) = (Slapi_Value **) slapi_ch_malloc( 2 * sizeof(Slapi_Value *) );
@@ -689,8 +719,16 @@ string_assertion2keys_ava(
 				(*ivals)[0]->bv.bv_len = strlen( (*ivals)[0]->bv.bv_val );
 				alt = NULL;
 			}
-			slapi_value_set_flags((*ivals)[0], flags|SLAPI_ATTR_FLAG_NORMALIZED);
-		}
+			flags |= SLAPI_ATTR_FLAG_NORMALIZED;
+		} else if ((syntax & SYNTAX_DN) &&
+		           (flags & SLAPI_ATTR_FLAG_NORMALIZED_CES)) {
+            /* This dn value is normalized, but not case-normalized. */
+			slapi_dn_ignore_case((*ivals)[0]->bv.bv_val);
+			/* This dn value is case-normalized */
+			flags &= ~SLAPI_ATTR_FLAG_NORMALIZED_CES;
+			flags |= SLAPI_ATTR_FLAG_NORMALIZED_CIS;
+		}
+		slapi_value_set_flags((*ivals)[0], flags);
 		(*ivals)[1] = NULL;
 		break;
 
diff --git a/ldap/servers/slapd/attrlist.c b/ldap/servers/slapd/attrlist.c
index 4ae5fcf..e365f3d 100644
--- a/ldap/servers/slapd/attrlist.c
+++ b/ldap/servers/slapd/attrlist.c
@@ -292,7 +292,7 @@ int attrlist_replace(Slapi_Attr **alist, const char *type, struct berval **vals)
         valuearray_init_bervalarray(vals, &values);
         if (slapi_attr_is_dn_syntax_attr(*a)) {
             valuearray_dn_normalize_value(values);
-            (*a)->a_flags |= SLAPI_ATTR_FLAG_NORMALIZED;
+            (*a)->a_flags |= SLAPI_ATTR_FLAG_NORMALIZED_CES;
         }
         rc = attr_replace(*a, values);
     }
@@ -319,7 +319,7 @@ int attrlist_replace_with_flags(Slapi_Attr **alist, const char *type, struct ber
         valuearray_init_bervalarray_with_flags(vals, &values, flags);
         if (slapi_attr_is_dn_syntax_attr(*a)) {
             valuearray_dn_normalize_value(values);
-            (*a)->a_flags |= SLAPI_ATTR_FLAG_NORMALIZED;
+            (*a)->a_flags |= SLAPI_ATTR_FLAG_NORMALIZED_CES;
         }
         rc = attr_replace(*a, values);
     }
diff --git a/ldap/servers/slapd/back-ldbm/index.c b/ldap/servers/slapd/back-ldbm/index.c
index 43b68f5..a5c6ac5 100644
--- a/ldap/servers/slapd/back-ldbm/index.c
+++ b/ldap/servers/slapd/back-ldbm/index.c
@@ -455,7 +455,9 @@ index_addordel_entry(
                     /* skip "entrydn" */
                     continue;
                 } else {
-                    slapi_values_set_flags(svals, SLAPI_ATTR_FLAG_NORMALIZED);
+                    /* entrydn is case-normalized */
+                    slapi_values_set_flags(svals,
+                                           SLAPI_ATTR_FLAG_NORMALIZED_CIS);
                 }
             }
             result = index_addordel_values_sv( be, type, svals, NULL,
diff --git a/ldap/servers/slapd/back-ldbm/ldbm_add.c b/ldap/servers/slapd/back-ldbm/ldbm_add.c
index 18390c2..158dc8e 100644
--- a/ldap/servers/slapd/back-ldbm/ldbm_add.c
+++ b/ldap/servers/slapd/back-ldbm/ldbm_add.c
@@ -1189,7 +1189,7 @@ add_update_entrydn_operational_attributes(struct backentry *ep)
     bv.bv_val = (void*)backentry_get_ndn(ep);
     bv.bv_len = strlen( bv.bv_val );
     entry_replace_values_with_flags( ep->ep_entry, LDBM_ENTRYDN_STR, bvp,
-                                     SLAPI_ATTR_FLAG_NORMALIZED );
+                                     SLAPI_ATTR_FLAG_NORMALIZED_CIS );
 }
 
 /*
diff --git a/ldap/servers/slapd/entry.c b/ldap/servers/slapd/entry.c
index eb39c24..6339a6f 100644
--- a/ldap/servers/slapd/entry.c
+++ b/ldap/servers/slapd/entry.c
@@ -3359,7 +3359,7 @@ slapi_entry_add_values_sv(Slapi_Entry *e,
 		attrlist_find_or_create(alist, type, &a);
 		if (slapi_attr_is_dn_syntax_attr(*a)) {
 			valuearray_dn_normalize_value(vals);
-			(*a)->a_flags |= SLAPI_ATTR_FLAG_NORMALIZED;
+			(*a)->a_flags |= SLAPI_ATTR_FLAG_NORMALIZED_CES;
 		}
 		rc= attr_add_valuearray(*a,vals,slapi_entry_get_dn_const(e));
     }
diff --git a/ldap/servers/slapd/entrywsi.c b/ldap/servers/slapd/entrywsi.c
index 2f2cfd3..0419864 100644
--- a/ldap/servers/slapd/entrywsi.c
+++ b/ldap/servers/slapd/entrywsi.c
@@ -442,7 +442,7 @@ entry_add_present_values_wsi(Slapi_Entry *e, const char *type, struct berval **b
 		/* Check if the type of the to-be-added values has DN syntax or not. */
 		if (slapi_attr_is_dn_syntax_attr(a)) {
 			valuearray_dn_normalize_value(valuestoadd);
-			a->a_flags |= SLAPI_ATTR_FLAG_NORMALIZED;
+			a->a_flags |= SLAPI_ATTR_FLAG_NORMALIZED_CES;
 		}
 		if(urp)
 		{
@@ -564,7 +564,7 @@ entry_delete_present_values_wsi(Slapi_Entry *e, const char *type, struct berval
 			 * or not. */
 			if (slapi_attr_is_dn_syntax_attr(a)) {
 				valuearray_dn_normalize_value(valuestodelete);
-				a->a_flags |= SLAPI_ATTR_FLAG_NORMALIZED;
+				a->a_flags |= SLAPI_ATTR_FLAG_NORMALIZED_CES;
 			}
 			if(urp)
 			{
diff --git a/ldap/servers/slapd/slapi-plugin.h b/ldap/servers/slapd/slapi-plugin.h
index a7eb84c..3377c64 100644
--- a/ldap/servers/slapd/slapi-plugin.h
+++ b/ldap/servers/slapd/slapi-plugin.h
@@ -177,7 +177,15 @@ NSPR_API(PRUint32) PR_fprintf(struct PRFileDesc* fd, const char *fmt, ...)
  * \see slapi_value_set_flags()
  * \see slapi_values_set_flags()
  */
-#define SLAPI_ATTR_FLAG_NORMALIZED	0x0200	/* the attr value is normalized */
+/* the attr value is normalized */
+#define SLAPI_ATTR_FLAG_NORMALIZED \
+        (SLAPI_ATTR_FLAG_NORMALIZED_CES|SLAPI_ATTR_FLAG_NORMALIZED_CIS)
+#define SLAPI_ATTR_FLAG_NORMALIZED_CES 0x0200 /* the attr value is normalized,
+                                                 but not case-normalized.
+                                                 Used for DN. */
+#define SLAPI_ATTR_FLAG_NORMALIZED_CIS 0x0400 /* the attr value is normalized 
+                                                 including case.
+                                                 Used for DN. */
 
 /* operation flags */
 #define SLAPI_OP_FLAG_INTERNAL		0x00020 /* An operation generated by the core server or a plugin. */
diff --git a/ldap/servers/slapd/value.c b/ldap/servers/slapd/value.c
index 6d30f63..73e5d20 100644
--- a/ldap/servers/slapd/value.c
+++ b/ldap/servers/slapd/value.c
@@ -595,7 +595,7 @@ value_dn_normalize_value(Slapi_Value *value)
 		value->bv.bv_val = slapi_ch_strdup(slapi_sdn_get_dn(sdn));
 		value->bv.bv_len = slapi_sdn_get_ndn_len(sdn);
 		slapi_sdn_free(&sdn);
-		slapi_value_set_flags(value, SLAPI_ATTR_FLAG_NORMALIZED);
+		slapi_value_set_flags(value, SLAPI_ATTR_FLAG_NORMALIZED_CES);
 	} else {
 		rc = 1;
 		slapi_ch_free((void **)&sdn); /* free just Slapi_DN */


commit 9b9d97ca73b4113eae6877ed0dff7c34bc2f8830
Author: Noriko Hosoi <nhosoi at redhat.com>
Date:   Wed Jul 11 17:37:02 2012 -0700

    Trac Ticket #346 - Slow ldapmodify operation time for large quantities of multi-valued attribute values
    
    https://fedorahosted.org/389/ticket/346
    
    Fix description:
    1) Set SLAPI_ATTR_FLAG_NORMALIZED to a_flag for the already
       normalized dn values.  Then, let slapi_attr_value_find
       pass the flag to plugin_call_syntax_filter_ava, where
       dn normalization is skipped based on the knowledge.
    2) To avoid the confusion, rename value_normalize_value and
       valuearray_normalize_value to value_dn_normalize_value and
       valuearray_dn_normalize_value, respectively.
    3) In slapi_has8thBit, instead of checking the 8th bit one byte
       by one byte, check 4 bytes at one time.
    (cherry picked from commit c0151f78509c35250095da6e2785842337963008)
    (cherry picked from commit 89f13859bf753ab8fc858a5a005cdce920be2359)

diff --git a/ldap/servers/plugins/syntaxes/nameoptuid.c b/ldap/servers/plugins/syntaxes/nameoptuid.c
index e6341e1..af31db9 100644
--- a/ldap/servers/plugins/syntaxes/nameoptuid.c
+++ b/ldap/servers/plugins/syntaxes/nameoptuid.c
@@ -170,8 +170,7 @@ nameoptuid_filter_ava(
 			syntax |= SYNTAX_NORM_FILT;
 		}
 	}
-	return( string_filter_ava( bvfilter, bvals, syntax,
-	    ftype, retVal ) );
+	return( string_filter_ava( bvfilter, bvals, syntax, ftype, retVal ) );
 }
 
 
diff --git a/ldap/servers/slapd/attr.c b/ldap/servers/slapd/attr.c
index eab20e5..fe68ab7 100644
--- a/ldap/servers/slapd/attr.c
+++ b/ldap/servers/slapd/attr.c
@@ -411,7 +411,11 @@ slapi_attr_value_find( const Slapi_Attr *a, const struct berval *v )
 
 	ava.ava_type = a->a_type;
 	ava.ava_value = *v;
-	ava.ava_private = NULL;
+	if (a->a_flags & SLAPI_ATTR_FLAG_NORMALIZED) {
+	    ava.ava_private = &a->a_flags;
+	} else {
+	    ava.ava_private = NULL;
+	}
 	return(plugin_call_syntax_filter_ava( a, LDAP_FILTER_EQUALITY, &ava ));
 }
 
diff --git a/ldap/servers/slapd/attrlist.c b/ldap/servers/slapd/attrlist.c
index cdf9e6b..4ae5fcf 100644
--- a/ldap/servers/slapd/attrlist.c
+++ b/ldap/servers/slapd/attrlist.c
@@ -291,7 +291,8 @@ int attrlist_replace(Slapi_Attr **alist, const char *type, struct berval **vals)
         attrlist_find_or_create(alist, type, &a);
         valuearray_init_bervalarray(vals, &values);
         if (slapi_attr_is_dn_syntax_attr(*a)) {
-            valuearray_normalize_value(values);
+            valuearray_dn_normalize_value(values);
+            (*a)->a_flags |= SLAPI_ATTR_FLAG_NORMALIZED;
         }
         rc = attr_replace(*a, values);
     }
@@ -317,7 +318,8 @@ int attrlist_replace_with_flags(Slapi_Attr **alist, const char *type, struct ber
         attrlist_find_or_create(alist, type, &a);
         valuearray_init_bervalarray_with_flags(vals, &values, flags);
         if (slapi_attr_is_dn_syntax_attr(*a)) {
-            valuearray_normalize_value(values);
+            valuearray_dn_normalize_value(values);
+            (*a)->a_flags |= SLAPI_ATTR_FLAG_NORMALIZED;
         }
         rc = attr_replace(*a, values);
     }
diff --git a/ldap/servers/slapd/entry.c b/ldap/servers/slapd/entry.c
index 76654cd..eb39c24 100644
--- a/ldap/servers/slapd/entry.c
+++ b/ldap/servers/slapd/entry.c
@@ -2132,7 +2132,6 @@ slapi_entry_dup( const Slapi_Entry *e )
 
 	/* Copy flags as well */
 	ec->e_flags = e->e_flags;
-	
 	ENTRY_DUMP(ec,"slapi_entry_dup");
 	return( ec );
 }
@@ -3359,7 +3358,8 @@ slapi_entry_add_values_sv(Slapi_Entry *e,
 		Slapi_Attr **alist= &e->e_attrs;
 		attrlist_find_or_create(alist, type, &a);
 		if (slapi_attr_is_dn_syntax_attr(*a)) {
-			valuearray_normalize_value(vals);
+			valuearray_dn_normalize_value(vals);
+			(*a)->a_flags |= SLAPI_ATTR_FLAG_NORMALIZED;
 		}
 		rc= attr_add_valuearray(*a,vals,slapi_entry_get_dn_const(e));
     }
diff --git a/ldap/servers/slapd/entrywsi.c b/ldap/servers/slapd/entrywsi.c
index 8c6a122..2f2cfd3 100644
--- a/ldap/servers/slapd/entrywsi.c
+++ b/ldap/servers/slapd/entrywsi.c
@@ -441,7 +441,8 @@ entry_add_present_values_wsi(Slapi_Entry *e, const char *type, struct berval **b
 		a->a_flags |= flags;
 		/* Check if the type of the to-be-added values has DN syntax or not. */
 		if (slapi_attr_is_dn_syntax_attr(a)) {
-			valuearray_normalize_value(valuestoadd);
+			valuearray_dn_normalize_value(valuestoadd);
+			a->a_flags |= SLAPI_ATTR_FLAG_NORMALIZED;
 		}
 		if(urp)
 		{
@@ -562,7 +563,8 @@ entry_delete_present_values_wsi(Slapi_Entry *e, const char *type, struct berval
 			/* Check if the type of the to-be-deleted values has DN syntax 
 			 * or not. */
 			if (slapi_attr_is_dn_syntax_attr(a)) {
-				valuearray_normalize_value(valuestodelete);
+				valuearray_dn_normalize_value(valuestodelete);
+				a->a_flags |= SLAPI_ATTR_FLAG_NORMALIZED;
 			}
 			if(urp)
 			{
diff --git a/ldap/servers/slapd/slapi-private.h b/ldap/servers/slapd/slapi-private.h
index 75f8e8f..f995e30 100644
--- a/ldap/servers/slapd/slapi-private.h
+++ b/ldap/servers/slapd/slapi-private.h
@@ -369,7 +369,7 @@ const CSN *value_get_csn( const Slapi_Value *value, CSNType t );
 const CSNSet *value_get_csnset ( const Slapi_Value *value);
 Slapi_Value *value_remove_csn( Slapi_Value *value, CSNType t);
 int value_contains_csn( const Slapi_Value *value, CSN *csn);
-int value_normalize_value(Slapi_Value *value);
+int value_dn_normalize_value(Slapi_Value *value);
 
 /* dn.c */
 /* this functions should only be used for dns allocated on the stack */
@@ -835,7 +835,7 @@ void valuearray_add_value_fast(Slapi_Value ***vals, Slapi_Value *addval, int nva
 void valuearray_add_valuearray( Slapi_Value ***vals, Slapi_Value **addvals, PRUint32 flags );
 void valuearray_add_valuearray_fast( Slapi_Value ***vals, Slapi_Value **addvals, int nvals, int naddvals, int *maxvals, int exact, int passin );
 int valuearray_find(const Slapi_Attr *a, Slapi_Value **va, const Slapi_Value *v);
-int valuearray_normalize_value(Slapi_Value **vals);
+int valuearray_dn_normalize_value(Slapi_Value **vals);
 
 /*
  * proxyauth.c
diff --git a/ldap/servers/slapd/utf8compare.c b/ldap/servers/slapd/utf8compare.c
index f595ed6..e336ccb 100644
--- a/ldap/servers/slapd/utf8compare.c
+++ b/ldap/servers/slapd/utf8compare.c
@@ -60,14 +60,27 @@ typedef struct sUpperLowerTbl {
 int
 slapi_has8thBit(unsigned char *s)
 {
-    unsigned char *p, *tail;
-    tail = s + strlen((char *)s);
-    for (p = s; p < tail; p++) {
+#define MY8THBITWIDTH 4 /* sizeof(PRUint32) */
+#define MY8THBITFILTER 0x80808080
+    unsigned char *p, *stail, *ltail;
+    PRUint32 *uip;
+    size_t len = strlen((const char *)s);
+    ltail = s + len;
+    stail = ltail - (len % MY8THBITWIDTH);
+    for (p = s; p < stail; p += MY8THBITWIDTH) {
+        uip = (PRUint32 *)p;
+        if (MY8THBITFILTER & *uip) {
+             return 1;
+        }
+    }
+    for (; p < ltail; p++) {
         if (0x80 & *p) {
              return 1;
         }
     }
     return 0;
+#undef MY8THBITWIDTH
+#undef MY8THBITFILTER
 }
 
 /*
diff --git a/ldap/servers/slapd/value.c b/ldap/servers/slapd/value.c
index 0d2a29b..6d30f63 100644
--- a/ldap/servers/slapd/value.c
+++ b/ldap/servers/slapd/value.c
@@ -581,7 +581,7 @@ value_dump( const Slapi_Value *value, const char *text)
 #endif
 
 int
-value_normalize_value(Slapi_Value *value)
+value_dn_normalize_value(Slapi_Value *value)
 {
 	Slapi_DN *sdn = NULL;
 	int rc = 0;
@@ -595,6 +595,7 @@ value_normalize_value(Slapi_Value *value)
 		value->bv.bv_val = slapi_ch_strdup(slapi_sdn_get_dn(sdn));
 		value->bv.bv_len = slapi_sdn_get_ndn_len(sdn);
 		slapi_sdn_free(&sdn);
+		slapi_value_set_flags(value, SLAPI_ATTR_FLAG_NORMALIZED);
 	} else {
 		rc = 1;
 		slapi_ch_free((void **)&sdn); /* free just Slapi_DN */
diff --git a/ldap/servers/slapd/valueset.c b/ldap/servers/slapd/valueset.c
index 6a3a205..a91256c 100644
--- a/ldap/servers/slapd/valueset.c
+++ b/ldap/servers/slapd/valueset.c
@@ -1444,13 +1444,13 @@ valueset_update_csn_for_valuearray(Slapi_ValueSet *vs, const Slapi_Attr *a, Slap
 }
 
 int
-valuearray_normalize_value(Slapi_Value **vals)
+valuearray_dn_normalize_value(Slapi_Value **vals)
 {
 	int rc = 0;
 	Slapi_Value **vp = NULL;
 
 	for (vp = vals; vp && *vp; vp++) {
-		rc |= value_normalize_value(*vp);
+		rc |= value_dn_normalize_value(*vp);
 	}
 
 	return rc;




More information about the 389-commits mailing list