summaryrefslogtreecommitdiffstats
path: root/ldap/servers/slapd/entry.c
diff options
context:
space:
mode:
Diffstat (limited to 'ldap/servers/slapd/entry.c')
-rw-r--r--ldap/servers/slapd/entry.c84
1 files changed, 53 insertions, 31 deletions
diff --git a/ldap/servers/slapd/entry.c b/ldap/servers/slapd/entry.c
index 0a8c40d5..62315c84 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 );
}