-
-done :
-
- for ( ml = modlist; ml != NULL; ml = mlnext ) {
- mlnext = ml->sml_next;
- free( ml );
- }
-
- return;
-}
-
-
-static
-int slap_mods_check_syncrepl(
- Operation *op,
- Modifications **mlp,
- const char **text,
- char *textbuf,
- size_t textlen,
- void *ctx )
-{
- int rc;
- Backend *be = op->o_bd;
- syncinfo_t *si = ( syncinfo_t * ) be->syncinfo;
- AttributeDescription** descs;
- int i;
- Modifications *prevml = NULL;
- Modifications *nextml = NULL;
- Modifications *ml = *mlp;
-
- while ( ml != NULL ) {
- AttributeDescription *ad = NULL;
-
- /* convert to attribute description */
- rc = slap_bv2ad( &ml->sml_type, &ml->sml_desc, text );
-
- if( rc != LDAP_SUCCESS ) {
- snprintf( textbuf, textlen, "%s: %s",
- ml->sml_type.bv_val, *text );
- *text = textbuf;
- return rc;
- }
-
- ad = ml->sml_desc;
-
- if ( si->lastmod == LASTMOD_REQ ) {
- descs = del_descs_lastmod;
- } else {
- descs = del_descs;
- }
-
- for ( i = 0; descs[i] != NULL; i++ ) {
- if ( ad == descs[i] ) {
- if ( prevml == NULL ) {
- mlp = &ml->sml_next;
- prevml = NULL;
- } else {
- prevml->sml_next = ml->sml_next;
- }
- slap_mod_free( &ml->sml_mod, 0 );
- nextml = ml->sml_next;
- free( ml );
- ml = nextml;
- continue;
- }
- }
-
- if( slap_syntax_is_binary( ad->ad_type->sat_syntax )
- && !slap_ad_is_binary( ad )) {
- /* attribute requires binary transfer */
- snprintf( textbuf, textlen,
- "%s: requires ;binary transfer",
- ml->sml_type.bv_val );
- *text = textbuf;
- return LDAP_UNDEFINED_TYPE;
- }
-
- if( !slap_syntax_is_binary( ad->ad_type->sat_syntax )
- && slap_ad_is_binary( ad )) {
- /* attribute requires binary transfer */
- snprintf( textbuf, textlen,
- "%s: disallows ;binary transfer",
- ml->sml_type.bv_val );
- *text = textbuf;
- return LDAP_UNDEFINED_TYPE;
- }
-
- if( slap_ad_is_tag_range( ad )) {
- /* attribute requires binary transfer */
- snprintf( textbuf, textlen,
- "%s: inappropriate use of tag range option",
- ml->sml_type.bv_val );
- *text = textbuf;
- return LDAP_UNDEFINED_TYPE;
- }
-
- if ( is_at_obsolete( ad->ad_type ) &&
- ( ml->sml_op == LDAP_MOD_ADD || ml->sml_values != NULL ) ) {
- /*
- * attribute is obsolete,
- * only allow replace/delete with no values
- */
- snprintf( textbuf, textlen,
- "%s: attribute is obsolete",
- ml->sml_type.bv_val );
- *text = textbuf;
- return LDAP_CONSTRAINT_VIOLATION;
- }
-
- /*
- * check values
- */
- if( ml->sml_values != NULL ) {
- ber_len_t nvals;
- slap_syntax_validate_func *validate =
- ad->ad_type->sat_syntax->ssyn_validate;
- slap_syntax_transform_func *pretty =
- ad->ad_type->sat_syntax->ssyn_pretty;
-
- if( !pretty && !validate ) {
- *text = "no validator for syntax";
- snprintf( textbuf, textlen,
- "%s: no validator for syntax %s",
- ml->sml_type.bv_val,
- ad->ad_type->sat_syntax->ssyn_oid );
- *text = textbuf;
- return LDAP_INVALID_SYNTAX;
- }
-
- /*
- * check that each value is valid per syntax
- * and pretty if appropriate
- */
- for( nvals = 0; ml->sml_values[nvals].bv_val; nvals++ ) {
- struct berval pval = {0, NULL};
- if( pretty ) {
- rc = pretty( ad->ad_type->sat_syntax,
- &ml->sml_values[nvals], &pval, ctx );
- } else {
- rc = validate( ad->ad_type->sat_syntax,
- &ml->sml_values[nvals] );
- }
-
- if( rc != 0 ) {
- snprintf( textbuf, textlen,
- "%s: value #%ld invalid per syntax",
- ml->sml_type.bv_val, (long) nvals );
- *text = textbuf;
- return LDAP_INVALID_SYNTAX;
- }
-
- if( pretty ) {
- ber_memfree( ml->sml_values[nvals].bv_val );
- ml->sml_values[nvals] = pval;
- }
- }
-
- /*
- * a rough single value check... an additional check is needed
- * to catch add of single value to existing single valued attribute
- */
- if ((ml->sml_op == LDAP_MOD_ADD || ml->sml_op == LDAP_MOD_REPLACE)
- && nvals > 1 && is_at_single_value( ad->ad_type )) {
- snprintf( textbuf, textlen,
- "%s: multiple values provided",
- ml->sml_type.bv_val );
- *text = textbuf;
- return LDAP_CONSTRAINT_VIOLATION;
- }
-
- if( nvals && ad->ad_type->sat_equality &&
- ad->ad_type->sat_equality->smr_normalize ) {
- ml->sml_nvalues = ch_malloc( (nvals+1)*sizeof(struct berval) );
- for( nvals = 0; ml->sml_values[nvals].bv_val; nvals++ ) {
- rc = ad->ad_type->sat_equality->smr_normalize( 0,
- ad->ad_type->sat_syntax, ad->ad_type->sat_equality,
- &ml->sml_values[nvals], &ml->sml_nvalues[nvals], ctx );
- if( rc ) {
-#ifdef NEW_LOGGING
- LDAP_LOG( OPERATION, DETAIL1,
- "str2entry: NULL (ssyn_normalize %d)\n", rc, 0, 0 );
-#else
- Debug( LDAP_DEBUG_ANY,
- "<= str2entry NULL (ssyn_normalize %d)\n", rc, 0, 0 );
-#endif
- snprintf( textbuf, textlen,
- "%s: value #%ld normalization failed",
- ml->sml_type.bv_val, (long) nvals );
- *text = textbuf;
- return rc;
- }
- }
- ml->sml_nvalues[nvals].bv_val = NULL;
- ml->sml_nvalues[nvals].bv_len = 0;
- }
- }
- prevml = ml;
- ml = ml->sml_next;