Преглед изворни кода

Ticket #47735 - e_uniqueid fails to set if an entry is a conflict entry

Description: In commit e2b8468f459647261812f542485f3481d39bd26c,
to get the base type length when a state info is stripped from
the attribute type, the fix in str2entry_state_information_from_type
blindly returned the base type length for the ordinary sub-typed
attributes.  This patch fixes it so that only when the state info
is removed, the length is reset.

https://fedorahosted.org/389/ticket/47735

Reviewed by [email protected] (Thank you, Rich!!)
Noriko Hosoi пре 11 година
родитељ
комит
a7ac181d60
1 измењених фајлова са 13 додато и 3 уклоњено
  1. 13 3
      ldap/servers/slapd/entry.c

+ 13 - 3
ldap/servers/slapd/entry.c

@@ -144,13 +144,11 @@ str2entry_state_information_from_type(struct berval *atype,
                                       int *attr_state)
 {
 	char *p = NULL;
+	char *semicolonp = NULL;
 	if ((NULL == atype) || (NULL == atype->bv_val)) {
 		return;
 	}
 	p = PL_strchr(atype->bv_val, ';');
-	if (p) {
-		atype->bv_len = p - atype->bv_val;
-	}
 	*value_state= VALUE_PRESENT;
 	*attr_state= ATTRIBUTE_PRESENT;
 	while(p!=NULL)
@@ -209,19 +207,31 @@ str2entry_state_information_from_type(struct berval *atype,
 					csn_init_by_csn ( *maxcsn, *attributedeletioncsn );
 				}
 			}
+			if (NULL == semicolonp) {
+				semicolonp = p; /* the first semicolon */
+			}
 		}
 		else if(strncmp(p+1,"deletedattribute", 16)==0)
 		{
 			p[0]='\0';
 			*attr_state= ATTRIBUTE_DELETED;
+			if (NULL == semicolonp) {
+				semicolonp = p; /* the first semicolon */
+			}
 		}
 		else if(strncmp(p+1,"deleted", 7)==0)
 		{
 			p[0]='\0';
 			*value_state= VALUE_DELETED;
+			if (NULL == semicolonp) {
+				semicolonp = p; /* the first semicolon */
+			}
 		}
 		p= strchr(p+1, ';');
 	}
+	if (semicolonp) {
+		atype->bv_len = semicolonp - atype->bv_val;
+	}
 }
 
 /* rawdn is not consumed.  Caller needs to free it. */