diff options
Diffstat (limited to 'ldap/servers/slapd/entry.c')
-rw-r--r-- | ldap/servers/slapd/entry.c | 84 |
1 files changed, 53 insertions, 31 deletions
diff --git a/ldap/servers/slapd/entry.c b/ldap/servers/slapd/entry.c index 87765d50..0cb856eb 100644 --- a/ldap/servers/slapd/entry.c +++ b/ldap/servers/slapd/entry.c @@ -274,14 +274,19 @@ str2entry_fast( const char *rawdn, char *s, int flags, int read_stateinfo ) if ( rawdn ) { if ( NULL == slapi_entry_get_dn_const( e )) { - normdn = slapi_create_dn_string("%s", rawdn); - if (NULL == normdn) { - LDAPDebug1Arg(LDAP_DEBUG_TRACE, - "str2entry_fast: Invalid DN: %s\n", rawdn); - slapi_entry_free( e ); - if (retmalloc) slapi_ch_free_string(&valuecharptr); - if (freetype) slapi_ch_free_string(&type); - return NULL; + if (flags & SLAPI_STR2ENTRY_USE_OBSOLETE_DNFORMAT) { + normdn = + slapi_ch_strdup(slapi_dn_normalize_original(rawdn)); + } else { + normdn = slapi_create_dn_string("%s", rawdn); + if (NULL == normdn) { + LDAPDebug1Arg(LDAP_DEBUG_TRACE, + "str2entry_fast: Invalid DN: %s\n", rawdn); + slapi_entry_free( e ); + if (retmalloc) slapi_ch_free_string(&valuecharptr); + if (freetype) slapi_ch_free_string(&type); + return NULL; + } } /* normdn is consumed in e */ slapi_entry_set_dn(e, normdn); @@ -291,14 +296,19 @@ str2entry_fast( const char *rawdn, char *s, int flags, int read_stateinfo ) /* normdn is just referred in slapi_entry_set_rdn. */ slapi_entry_set_rdn(e, normdn); } else { - normdn = slapi_create_dn_string("%s", rawdn); - if (NULL == normdn) { - LDAPDebug1Arg(LDAP_DEBUG_TRACE, - "str2entry_fast: Invalid DN: %s\n", rawdn); - slapi_entry_free( e ); - if (retmalloc) slapi_ch_free_string(&valuecharptr); - if (freetype) slapi_ch_free_string(&type); - return NULL; + if (flags & SLAPI_STR2ENTRY_USE_OBSOLETE_DNFORMAT) { + normdn = + slapi_ch_strdup(slapi_dn_normalize_original(rawdn)); + } else { + normdn = slapi_create_dn_string("%s", rawdn); + if (NULL == normdn) { + LDAPDebug1Arg(LDAP_DEBUG_TRACE, + "str2entry_fast: Invalid DN: %s\n", rawdn); + slapi_entry_free( e ); + if (retmalloc) slapi_ch_free_string(&valuecharptr); + if (freetype) slapi_ch_free_string(&type); + return NULL; + } } /* normdn is just referred in slapi_entry_set_rdn. */ slapi_entry_set_rdn(e, normdn); @@ -321,7 +331,12 @@ str2entry_fast( const char *rawdn, char *s, int flags, int read_stateinfo ) if (freetype) slapi_ch_free_string(&type); continue; } - normdn = slapi_create_dn_string("%s", valuecharptr); + if (flags & SLAPI_STR2ENTRY_USE_OBSOLETE_DNFORMAT) { + normdn = + slapi_ch_strdup(slapi_dn_normalize_original(valuecharptr)); + } else { + normdn = slapi_create_dn_string("%s", valuecharptr); + } if (NULL == normdn) { LDAPDebug1Arg(LDAP_DEBUG_TRACE, "str2entry_fast: Invalid DN: %s\n", valuecharptr); @@ -429,21 +444,27 @@ str2entry_fast( const char *rawdn, char *s, int flags, int read_stateinfo ) return NULL; } } - rc = slapi_dn_normalize_ext(valuecharptr, 0, &dn_aval, &dnlen); - if (rc < 0) { - /* Give up normalizing the attribute value */ - LDAPDebug2Args(LDAP_DEBUG_TRACE, + if (flags & SLAPI_STR2ENTRY_USE_OBSOLETE_DNFORMAT) { + dn_aval = slapi_dn_normalize_original(valuecharptr); + slapi_value_set(value, dn_aval, strlen(dn_aval)); + } else { + rc = slapi_dn_normalize_ext(valuecharptr, + 0, &dn_aval, &dnlen); + if (rc < 0) { + /* Give up normalizing the attribute value */ + LDAPDebug2Args(LDAP_DEBUG_TRACE, "str2entry_fast: Invalid DN value: %s: %s\n", type, valuecharptr); - dn_aval = valuecharptr; - dnlen = valuelen; - } - slapi_value_set(value, dn_aval, dnlen); - if (rc > 0) { /* if rc == 0, valuecharptr is passed in */ - slapi_ch_free_string(&dn_aval); - } else if (rc == 0) { /* rc == 0; valuecharptr is passed in; - not null terminated */ - *(dn_aval + dnlen) = '\0'; + dn_aval = valuecharptr; + dnlen = valuelen; + } + slapi_value_set(value, dn_aval, dnlen); + if (rc > 0) { /* if rc == 0, valuecharptr is passed in */ + slapi_ch_free_string(&dn_aval); + } else if (rc == 0) { /* rc == 0; valuecharptr is passed in; + not null terminated */ + *(dn_aval + dnlen) = '\0'; + } } } else { slapi_value_set(value, valuecharptr, valuelen); @@ -1263,6 +1284,7 @@ free_and_return: ( SLAPI_STR2ENTRY_IGNORE_STATE \ | SLAPI_STR2ENTRY_EXPAND_OBJECTCLASSES \ | SLAPI_STR2ENTRY_TOMBSTONE_CHECK \ + | SLAPI_STR2ENTRY_USE_OBSOLETE_DNFORMAT \ ) #define SLAPI_STRENTRY_FLAGS_HANDLED_BY_STR2ENTRY_FAST \ @@ -1288,7 +1310,7 @@ slapi_str2entry( char *s, int flags ) * slower but more forgiving str2entry_dupcheck() function. */ if ( 0 != ( flags & SLAPI_STR2ENTRY_NOT_WELL_FORMED_LDIF ) || - 0 != ( flags & ~SLAPI_STRENTRY_FLAGS_HANDLED_BY_STR2ENTRY_FAST )) + 0 != ( flags & ~SLAPI_STRENTRY_FLAGS_HANDLED_BY_STR2ENTRY_FAST )) { e= str2entry_dupcheck( NULL/*dn*/, s, flags, read_stateinfo ); } |