X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fentry.c;h=a494a04424360f2b0b85932c792c9fd08647091e;hb=1bae6d28e5d764ce52a2ba62838534420a0a3fa3;hp=346bb87b83b8c0fcc76b0825b4d0c1313aea542c;hpb=88990a5c6ab659906acb9961d79cecd45671b6d7;p=openldap diff --git a/servers/slapd/entry.c b/servers/slapd/entry.c index 346bb87b83..a494a04424 100644 --- a/servers/slapd/entry.c +++ b/servers/slapd/entry.c @@ -45,9 +45,7 @@ str2entry( char *s ) Entry *e; char *type; struct berval vals[2]; -#ifdef SLAP_NVALUES struct berval nvals[2], *nvalsp; -#endif AttributeDescription *ad; const char *text; char *next; @@ -239,47 +237,40 @@ str2entry( char *s ) } } -#ifdef SLAP_NVALUES nvalsp = NULL; nvals[0].bv_val = NULL; -#if 0 if( ad->ad_type->sat_equality && - ad->ad_type->sat_equality->smr_match && - ad->ad_type->sat_syntax->ssyn_normalize ) + ad->ad_type->sat_equality->smr_normalize ) { - rc = ad->ad_type->sat_syntax->ssyn_normalize( + rc = ad->ad_type->sat_equality->smr_normalize( + SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX, ad->ad_type->sat_syntax, + ad->ad_type->sat_equality, &vals[0], &nvals[0] ); if( rc ) { #ifdef NEW_LOGGING LDAP_LOG( OPERATION, DETAIL1, - "str2entry: NULL (ssyn_normalize %d)\n" , rc, 0, 0 ); + "str2entry: NULL (smr_normalize %d)\n" , rc, 0, 0 ); #else Debug( LDAP_DEBUG_ANY, - "<= str2entry NULL (ssyn_normalize %d)\n", rc, 0, 0 ); + "<= str2entry NULL (smr_normalize %d)\n", rc, 0, 0 ); +#endif entry_free( e ); free( vals[0].bv_val ); free( type ); return NULL; } -#endif nvals[1].bv_len = 0; nvals[1].bv_val = NULL; nvalsp = &nvals[0]; } -#endif -#endif -#ifdef SLAP_NVALUES rc = attr_merge( e, ad, vals, nvalsp ); -#else - rc = attr_merge( e, ad, vals ); -#endif if( rc != 0 ) { #ifdef NEW_LOGGING LDAP_LOG( OPERATION, DETAIL1, @@ -296,9 +287,7 @@ str2entry( char *s ) free( type ); free( vals[0].bv_val ); -#ifdef SLAP_NVALUES free( nvals[0].bv_val ); -#endif } /* check to make sure there was a dn: line */ @@ -545,6 +534,17 @@ int entry_encode(Entry *e, struct berval *bv) } len += entry_lenlen(i); siz += sizeof(struct berval); /* empty berval at end */ + if (a->a_nvals != a->a_vals) { + for (i=0; a->a_nvals[i].bv_val; i++) { + siz += sizeof(struct berval); + len += a->a_nvals[i].bv_len + 1; + len += entry_lenlen(a->a_nvals[i].bv_len); + } + len += entry_lenlen(i); /* i nvals */ + siz += sizeof(struct berval); + } else { + len += entry_lenlen(0); /* 0 nvals */ + } } len += 1; /* NUL byte at end */ len += entry_lenlen(siz); @@ -572,11 +572,23 @@ int entry_encode(Entry *e, struct berval *bv) entry_putlen(&ptr, i); for (i=0; a->a_vals[i].bv_val; i++) { entry_putlen(&ptr, a->a_vals[i].bv_len); - memcpy(ptr, a->a_vals[i].bv_val, + AC_MEMCPY(ptr, a->a_vals[i].bv_val, a->a_vals[i].bv_len); ptr += a->a_vals[i].bv_len; *ptr++ = '\0'; } + if (a->a_nvals != a->a_vals) { + entry_putlen(&ptr, i); + for (i=0; a->a_nvals[i].bv_val; i++) { + entry_putlen(&ptr, a->a_nvals[i].bv_len); + AC_MEMCPY(ptr, a->a_nvals[i].bv_val, + a->a_nvals[i].bv_len); + ptr += a->a_nvals[i].bv_len; + *ptr++ = '\0'; + } + } else { + entry_putlen(&ptr, 0); + } } } *ptr = '\0'; @@ -585,7 +597,7 @@ int entry_encode(Entry *e, struct berval *bv) /* Retrieve an Entry that was stored using entry_encode above. * We malloc a single block with the size stored above for the Entry - * and all if its Attributes. We also must lookup the stored + * and all of its Attributes. We also must lookup the stored * attribute names to get AttributeDescriptions. To detect if the * attributes of an Entry are later modified, we note that e->e_attr * is always a constant offset from (e). @@ -596,7 +608,7 @@ int entry_encode(Entry *e, struct berval *bv) */ int entry_decode(struct berval *bv, Entry **e) { - int i, j; + int i, j, count; int rc; Attribute *a; Entry *x; @@ -669,7 +681,7 @@ int entry_decode(struct berval *bv, Entry **e) bptr = (BerVarray)(a+1); a->a_vals = bptr; a->a_flags = 0; - j = entry_getlen(&ptr); + count = j = entry_getlen(&ptr); while (j) { i = entry_getlen(&ptr); @@ -682,9 +694,27 @@ int entry_decode(struct berval *bv, Entry **e) bptr->bv_val = NULL; bptr->bv_len = 0; bptr++; + + j = entry_getlen(&ptr); + if (j) { + a->a_nvals = bptr; + while (j) { + i = entry_getlen(&ptr); + bptr->bv_len = i; + bptr->bv_val = (char *)ptr; + ptr += i+1; + bptr++; + j--; + } + bptr->bv_val = NULL; + bptr->bv_len = 0; + bptr++; + } else { + a->a_nvals = a->a_vals; + } } - if (a) - a->a_next = NULL; + + if (a) a->a_next = NULL; #ifdef NEW_LOGGING LDAP_LOG( OPERATION, DETAIL1, "entry_decode: %s\n", x->e_dn, 0, 0 ); #else