From e2b8468f459647261812f542485f3481d39bd26c Mon Sep 17 00:00:00 2001 From: Noriko Hosoi Date: Fri, 7 Mar 2014 12:29:55 -0800 Subject: [PATCH] Ticket #47735 - e_uniqueid fails to set if an entry is a conflict entry Bug Description: When an entry is turned to be a conflict entry, its nsUniqueId has a mdcsn info as a subtype like this: nsUniqueId;mdcsn-5319136f000200010000: c5e0d787-a58f11e3-b7f9dfd1-acc3d5e4 In this case, the attribute type is assigned to the berval "type" as follows: type.bv_val = "nsUniqueId;mdcsn-5319136f000200010000" type.bv_len = 37 The subtyped stateinfo is processed in str2entry_state_information_from_type, which modifies type.bv_val to "nsUniqueId", but type.bv_len remains 37. str2entry_fast has this logic to set e_uniqueid, where the nsUniqueId with stateinfo fails to set the value to e_uniqueid. if ( type.bv_len == 10 && PL_strncasecmp (type.bv_val, "nsUniqueId", type.bv_len) == 0 ){ Fix Description: This patch resets the length of the type with the basetype length 10 before the if expression is called for setting e_uniqueid. https://fedorahosted.org/389/ticket/47735 Reviewed by rmeggins@redhat.com (Thank you, Rich!!) (cherry picked from commit 07bd2259cc45c9d5c193b15faaf0d0c60e1b723c) (cherry picked from commit 6e0ffbe1bdde99cfd71a5617d89482eef4696c7f) (cherry picked from commit d4350bd0724c37040a4aaf361a10918c925b7605) --- ldap/servers/slapd/entry.c | 60 +++++++++++++++++++++++++++------------------- 1 file changed, 36 insertions(+), 24 deletions(-) diff --git a/ldap/servers/slapd/entry.c b/ldap/servers/slapd/entry.c index 60e1dfe..0d018a9 100644 --- a/ldap/servers/slapd/entry.c +++ b/ldap/servers/slapd/entry.c @@ -95,10 +95,22 @@ struct attrs_in_extension attrs_in_extension[] = /* * WARNING: s gets butchered... the base type remains. */ -void -str2entry_state_information_from_type(char *s,CSNSet **csnset,CSN **attributedeletioncsn,CSN **maxcsn,int *value_state,int *attr_state) +static void +str2entry_state_information_from_type(struct berval *atype, + CSNSet **csnset, + CSN **attributedeletioncsn, + CSN **maxcsn, + int *value_state, + int *attr_state) { - char *p= strchr(s, ';'); + char *p = 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) @@ -243,19 +255,20 @@ str2entry_fast( const char *rawdn, const Slapi_RDN *srdn, char *s, int flags, in } if ( slapi_ldif_parse_line( s, &type, &value, &freeval ) < 0 ) { - LDAPDebug( LDAP_DEBUG_TRACE, - "<= str2entry_fast NULL (parse_line)\n", 0, 0, 0 ); + LDAPDebug0Args(LDAP_DEBUG_TRACE, "<= str2entry_fast NULL (parse_line)\n"); continue; } /* * Extract the attribute and value CSNs from the attribute type. - */ + */ csn_free(&attributedeletioncsn); /* JCM - Do this more efficiently */ csnset_free(&valuecsnset); value_state= VALUE_NOTFOUND; attr_state= ATTRIBUTE_NOTFOUND; - str2entry_state_information_from_type(type.bv_val,&valuecsnset,&attributedeletioncsn,&maxcsn,&value_state,&attr_state); + str2entry_state_information_from_type(&type, + &valuecsnset, &attributedeletioncsn, + &maxcsn, &value_state, &attr_state); if(!read_stateinfo) { /* We are not maintaining state information */ @@ -393,8 +406,7 @@ str2entry_fast( const char *rawdn, const Slapi_RDN *srdn, char *s, int flags, in } /* retrieve uniqueid */ - if ( type.bv_len == SLAPI_ATTR_UNIQUEID_LENGTH && PL_strncasecmp (type.bv_val, SLAPI_ATTR_UNIQUEID, type.bv_len) == 0 ){ - + if ((type.bv_len == SLAPI_ATTR_UNIQUEID_LENGTH) && (PL_strcasecmp (type.bv_val, SLAPI_ATTR_UNIQUEID) == 0)) { if (e->e_uniqueid != NULL){ LDAPDebug (LDAP_DEBUG_TRACE, "str2entry_fast: entry has multiple uniqueids %s " @@ -752,22 +764,21 @@ str2entry_dupcheck( const char *rawdn, char *s, int flags, int read_stateinfo ) char *valuecharptr=NULL; struct berval bvvalue; int rc; - entry_attrs *ea = NULL; - int tree_attr_checking = 0; - int big_entry_attr_presence_check = 0; - int check_for_duplicate_values = - ( 0 != ( flags & SLAPI_STR2ENTRY_REMOVEDUPVALS )); - Slapi_Value *value = 0; - CSN *attributedeletioncsn= NULL; - CSNSet *valuecsnset= NULL; - CSN *maxcsn= NULL; - char *normdn = NULL; - int strict = 0; + entry_attrs *ea = NULL; + int tree_attr_checking = 0; + int big_entry_attr_presence_check = 0; + int check_for_duplicate_values = ( 0 != ( flags & SLAPI_STR2ENTRY_REMOVEDUPVALS )); + Slapi_Value *value = 0; + CSN *attributedeletioncsn= NULL; + CSNSet *valuecsnset= NULL; + CSN *maxcsn= NULL; + char *normdn = NULL; + int strict = 0; /* Check if we should be performing strict validation. */ strict = config_get_dn_validate_strict(); - LDAPDebug( LDAP_DEBUG_TRACE, "=> str2entry_dupcheck\n", 0, 0, 0 ); + LDAPDebug0Args(LDAP_DEBUG_TRACE, "=> str2entry_dupcheck\n"); e = slapi_entry_alloc(); slapi_entry_init(e,NULL,NULL); @@ -808,7 +819,9 @@ str2entry_dupcheck( const char *rawdn, char *s, int flags, int read_stateinfo ) csnset_free(&valuecsnset); value_state= VALUE_NOTFOUND; attr_state= VALUE_NOTFOUND; - str2entry_state_information_from_type(type,&valuecsnset,&attributedeletioncsn,&maxcsn,&value_state,&attr_state); + str2entry_state_information_from_type(&bvtype, + &valuecsnset, &attributedeletioncsn, + &maxcsn, &value_state, &attr_state); if(!read_stateinfo) { /* We are not maintaining state information */ @@ -916,8 +929,7 @@ str2entry_dupcheck( const char *rawdn, char *s, int flags, int read_stateinfo ) } /* retrieve uniqueid */ - if ( strcasecmp (type, SLAPI_ATTR_UNIQUEID) == 0 ){ - + if ((bvtype.bv_len == SLAPI_ATTR_UNIQUEID_LENGTH) && (PL_strcasecmp (type, SLAPI_ATTR_UNIQUEID) == 0)) { if (e->e_uniqueid != NULL){ LDAPDebug (LDAP_DEBUG_TRACE, "str2entry_dupcheck: entry has multiple uniqueids %s " -- 1.8.1.4