/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 1998-2007 The OpenLDAP Foundation.
+ * Copyright 1998-2009 The OpenLDAP Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
struct berval dn = BER_BVNULL;
char textbuf[ SLAP_TEXT_BUFLEN ];
size_t textlen = sizeof( textbuf );
+#ifdef LDAP_DEBUG
+ Modifications *tmp;
+#endif
- Debug( LDAP_DEBUG_TRACE, "do_modify\n", 0, 0, 0 );
-
+ Debug( LDAP_DEBUG_TRACE, "%s do_modify\n",
+ op->o_log_prefix, 0, 0 );
/*
* Parse the modify request. It looks like this:
*
*/
if ( ber_scanf( op->o_ber, "{m" /*}*/, &dn ) == LBER_ERROR ) {
- Debug( LDAP_DEBUG_ANY, "do_modify: ber_scanf failed\n", 0, 0, 0 );
-
+ Debug( LDAP_DEBUG_ANY, "%s do_modify: ber_scanf failed\n",
+ op->o_log_prefix, 0, 0 );
send_ldap_discon( op, rs, LDAP_PROTOCOL_ERROR, "decoding error" );
return SLAPD_DISCONNECT;
}
- Debug( LDAP_DEBUG_ARGS, "do_modify: dn (%s)\n", dn.bv_val, 0, 0 );
+ Debug( LDAP_DEBUG_ARGS, "%s do_modify: dn (%s)\n",
+ op->o_log_prefix, dn.bv_val, 0 );
rs->sr_err = slap_parse_modlist( op, rs, op->o_ber, &op->oq_modify );
if ( rs->sr_err != LDAP_SUCCESS ) {
- Debug( LDAP_DEBUG_ANY, "do_modify: slap_parse_modlist failed err=%d msg=%s\n",
- rs->sr_err, rs->sr_text, 0 );
+ Debug( LDAP_DEBUG_ANY, "%s do_modify: slap_parse_modlist failed err=%d msg=%s\n",
+ op->o_log_prefix, rs->sr_err, rs->sr_text );
goto cleanup;
}
if( get_ctrls( op, rs, 1 ) != LDAP_SUCCESS ) {
- Debug( LDAP_DEBUG_ANY, "do_modify: get_ctrls failed\n", 0, 0, 0 );
+ Debug( LDAP_DEBUG_ANY, "%s do_modify: get_ctrls failed\n",
+ op->o_log_prefix, 0, 0 );
goto cleanup;
}
rs->sr_err = dnPrettyNormal( NULL, &dn, &op->o_req_dn, &op->o_req_ndn,
op->o_tmpmemctx );
if( rs->sr_err != LDAP_SUCCESS ) {
- Debug( LDAP_DEBUG_ANY,
- "do_modify: invalid dn (%s)\n", dn.bv_val, 0, 0 );
+ Debug( LDAP_DEBUG_ANY, "%s do_modify: invalid dn (%s)\n",
+ op->o_log_prefix, dn.bv_val, 0 );
send_ldap_error( op, rs, LDAP_INVALID_DN_SYNTAX, "invalid DN" );
goto cleanup;
}
- rs->sr_err = slap_mods_check( op, op->orm_modlist,
- &rs->sr_text, textbuf, textlen, NULL );
-
- if ( rs->sr_err != LDAP_SUCCESS ) {
- send_ldap_result( op, rs );
- goto cleanup;
- }
-
- op->o_bd = frontendDB;
- rs->sr_err = frontendDB->be_modify( op, rs );
-
-#ifdef LDAP_X_TXN
- if( rs->sr_err == LDAP_X_TXN_SPECIFY_OKAY ) {
- /* skip cleanup */
- return rs->sr_err;
- }
-#endif
-
-cleanup:
- op->o_tmpfree( op->o_req_dn.bv_val, op->o_tmpmemctx );
- op->o_tmpfree( op->o_req_ndn.bv_val, op->o_tmpmemctx );
- if ( op->orm_modlist != NULL ) slap_mods_free( op->orm_modlist, 1 );
-
- return rs->sr_err;
-}
-
-int
-fe_op_modify( Operation *op, SlapReply *rs )
-{
-#ifdef LDAP_DEBUG
- Modifications *tmp;
-#endif
- int manageDSAit;
- BackendDB *op_be, *bd = op->o_bd;
- char textbuf[ SLAP_TEXT_BUFLEN ];
- size_t textlen = sizeof( textbuf );
-
- if ( BER_BVISEMPTY( &op->o_req_ndn ) ) {
- Debug( LDAP_DEBUG_ANY, "do_modify: root dse!\n", 0, 0, 0 );
-
- send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM,
- "modify upon the root DSE not supported" );
- goto cleanup;
-
- } else if ( bvmatch( &op->o_req_ndn, &frontendDB->be_schemandn ) ) {
- Debug( LDAP_DEBUG_ANY, "do_modify: subschema subentry!\n", 0, 0, 0 );
-
- send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM,
- "modification of subschema subentry not supported" );
- goto cleanup;
- }
+ op->orm_no_opattrs = 0;
#ifdef LDAP_DEBUG
- Debug( LDAP_DEBUG_ARGS, "modifications:\n", 0, 0, 0 );
+ Debug( LDAP_DEBUG_ARGS, "%s modifications:\n",
+ op->o_log_prefix, 0, 0 );
for ( tmp = op->orm_modlist; tmp != NULL; tmp = tmp->sml_next ) {
Debug( LDAP_DEBUG_ARGS, "\t%s: %s\n",
}
#endif /* LDAP_DEBUG */
- manageDSAit = get_manageDSAit( op );
+ rs->sr_err = slap_mods_check( op, op->orm_modlist,
+ &rs->sr_text, textbuf, textlen, NULL );
+
+ if ( rs->sr_err != LDAP_SUCCESS ) {
+ send_ldap_result( op, rs );
+ goto cleanup;
+ }
+
+ op->o_bd = frontendDB;
+ rs->sr_err = frontendDB->be_modify( op, rs );
+
+#ifdef LDAP_X_TXN
+ if( rs->sr_err == LDAP_X_TXN_SPECIFY_OKAY ) {
+ /* skip cleanup */
+ return rs->sr_err;
+ }
+#endif
+
+cleanup:
+ op->o_tmpfree( op->o_req_dn.bv_val, op->o_tmpmemctx );
+ op->o_tmpfree( op->o_req_ndn.bv_val, op->o_tmpmemctx );
+ if ( op->orm_modlist != NULL ) slap_mods_free( op->orm_modlist, 1 );
+
+ return rs->sr_err;
+}
+
+int
+fe_op_modify( Operation *op, SlapReply *rs )
+{
+ BackendDB *op_be, *bd = op->o_bd;
+ char textbuf[ SLAP_TEXT_BUFLEN ];
+ size_t textlen = sizeof( textbuf );
+
+ if ( BER_BVISEMPTY( &op->o_req_ndn ) ) {
+ Debug( LDAP_DEBUG_ANY, "%s do_modify: root dse!\n",
+ op->o_log_prefix, 0, 0 );
+ send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM,
+ "modify upon the root DSE not supported" );
+ goto cleanup;
+
+ } else if ( bvmatch( &op->o_req_ndn, &frontendDB->be_schemandn ) ) {
+ Debug( LDAP_DEBUG_ANY, "%s do_modify: subschema subentry!\n",
+ op->o_log_prefix, 0, 0 );
+ send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM,
+ "modification of subschema subentry not supported" );
+ goto cleanup;
+ }
/*
* We could be serving multiple database backends. Select the
* appropriate one, or send a referral to our "referral server"
* if we don't hold it.
*/
- op->o_bd = select_backend( &op->o_req_ndn, manageDSAit, 1 );
+ op->o_bd = select_backend( &op->o_req_ndn, 1 );
if ( op->o_bd == NULL ) {
op->o_bd = bd;
rs->sr_ref = referral_rewrite( default_referral,
/* If we've got a glued backend, check the real backend */
op_be = op->o_bd;
if ( SLAP_GLUE_INSTANCE( op->o_bd )) {
- op->o_bd = select_backend( &op->o_req_ndn, manageDSAit, 0 );
+ op->o_bd = select_backend( &op->o_req_ndn, 0 );
}
/* check restrictions */
if ( op->orm_increment && !SLAP_INCREMENT( op->o_bd ) ) {
send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM,
"modify/increment not supported in context" );
+ goto cleanup;
}
/*
continue;
}
+ if ( ml->sml_flags & SLAP_MOD_INTERNAL ) {
+ continue;
+ }
+
if ( get_relax( op ) ) {
if ( ml->sml_desc->ad_type->sat_flags & SLAP_AT_MANAGEABLE ) {
ml->sml_flags |= SLAP_MOD_MANAGING;
ml->sml_values[nvals] = pval;
}
}
+ ml->sml_values[nvals].bv_len = 0;
+ ml->sml_numvals = nvals;
/*
* a rough single value check... an additional check is needed
"%s: value #%ld normalization failed",
ml->sml_type.bv_val, (long) nvals );
*text = textbuf;
+ BER_BVZERO( &ml->sml_nvalues[nvals] );
return rc;
}
}
/* check for duplicates, but ignore Deletes.
*/
if( nvals > 1 && ml->sml_op != LDAP_MOD_DELETE ) {
-#define SLAP_MODS_CHECK_QUICKSORT
-#ifndef SLAP_MODS_CHECK_QUICKSORT
- int i, j, rc, match;
- MatchingRule *mr = ad->ad_type->sat_equality;
-
- for ( i = 1; i < nvals ; i++ ) {
- /* test asserted values against themselves */
- for( j = 0; j < i; j++ ) {
- rc = ordered_value_match( &match, ml->sml_desc, mr,
- SLAP_MR_EQUALITY
- | SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX
- | SLAP_MR_ASSERTED_VALUE_NORMALIZED_MATCH
- | SLAP_MR_ATTRIBUTE_VALUE_NORMALIZED_MATCH,
- ml->sml_nvalues
- ? &ml->sml_nvalues[i]
- : &ml->sml_values[i],
- ml->sml_nvalues
- ? &ml->sml_nvalues[j]
- : &ml->sml_values[j],
- text );
- if ( rc == LDAP_SUCCESS && match == 0 ) {
- /* value exists already */
- snprintf( textbuf, textlen,
- "%s: value #%d provided more than once",
- ml->sml_desc->ad_cname.bv_val, j );
- *text = textbuf;
- return LDAP_TYPE_OR_VALUE_EXISTS;
-
- } else if ( rc != LDAP_SUCCESS ) {
- return rc;
- }
- }
+ int i;
+ rc = slap_sort_vals( ml, text, &i, ctx );
+ if ( rc == LDAP_TYPE_OR_VALUE_EXISTS ) {
+ /* value exists already */
+ snprintf( textbuf, textlen,
+ "%s: value #%d provided more than once",
+ ml->sml_desc->ad_cname.bv_val, i );
+ *text = textbuf;
}
-#else /* SLAP_MODS_CHECK_QUICKSORT */
+ if ( rc )
+ return rc;
+ }
+ } else {
+ ml->sml_numvals = 0;
+ }
+ }
-/* Quicksort + Insertion sort for small arrays */
+ return LDAP_SUCCESS;
+}
+
+/* Sort a set of values. An (Attribute *) may be used interchangeably here
+ * instead of a (Modifications *) structure.
+ *
+ * Uses Quicksort + Insertion sort for small arrays
+ */
+
+int
+slap_sort_vals(
+ Modifications *ml,
+ const char **text,
+ int *dup,
+ void *ctx )
+{
+ AttributeDescription *ad;
+ MatchingRule *mr;
+ int istack[sizeof(int)*16];
+ int i, j, k, l, ir, jstack, match, *ix, itmp, nvals, rc;
+ int is_norm;
+ struct berval a, *cv;
#define SMALL 8
#define SWAP(a,b,tmp) tmp=(a);(a)=(b);(b)=tmp
#define COMP(a,b) match=0; rc = ordered_value_match( &match, \
- ml->sml_desc, mr, SLAP_MR_EQUALITY \
+ ad, mr, SLAP_MR_EQUALITY \
| SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX \
| SLAP_MR_ASSERTED_VALUE_NORMALIZED_MATCH \
| SLAP_MR_ATTRIBUTE_VALUE_NORMALIZED_MATCH, \
&(a), &(b), text );
- MatchingRule *mr = ad->ad_type->sat_equality;
- int istack[sizeof(int)*16];
- int i, j, k, l, ir, jstack, match, *ix, itmp;
- struct berval a, *cv;
-
-/* If PRESERVE_ORDER is defined only the index array is sorted; the
- * actual values are left in their incoming order. Otherwise, the
- * only reason to keep the index array is to identify the offending
- * value when duplicates are found.
- */
-#define PRESERVE_ORDER
-#ifndef PRESERVE_ORDER
- struct berval va, *v, *nv, bvtmp;
-
-#define IX(x) x
-#define EXCH(x,y) SWAP(ix[x],ix[y],itmp); SWAP(cv[x],cv[y],bvtmp); \
- if (nv) {SWAP(v[x],v[y],bvtmp);}
-#define SETA(x) itmp = ix[x]; a = cv[x]; if (nv) va=v[x]
-#define GETA(x) ix[x] = itmp; cv[x] = a; if (nv) v[x]=va
-#define SET(x,y) ix[x] = ix[y]; cv[x] = cv[y]; if (nv) v[x]=v[y]
-
- v = ml->sml_values;
- nv = ml->sml_nvalues;
-
-#else /* PRESERVE_ORDER */
-
#define IX(x) ix[x]
#define EXCH(x,y) SWAP(ix[x],ix[y],itmp)
#define SETA(x) itmp = ix[x]; a = cv[itmp]
#define GETA(x) ix[x] = itmp;
#define SET(x,y) ix[x] = ix[y]
-#endif /* PRESERVE_ORDER */
-
- cv = ml->sml_nvalues ? ml->sml_nvalues : ml->sml_values;
- if ( ad == slap_schema.si_ad_objectClass )
- mr = NULL; /* shortcut matching */
-
- /* record indices to preserve input ordering */
- ix = slap_sl_malloc( nvals * sizeof(int), ctx );
- for (i=0; i<nvals; i++) ix[i] = i;
-
- ir = nvals-1;
- l = 0;
- jstack = 0;
-
- for(;;) {
- if (ir - l < SMALL) { /* Insertion sort */
- match=1;
- for (j=l+1;j<=ir;j++) {
- SETA(j);
- for (i=j-1;i>=0;i--) {
- COMP(cv[IX(i)], a);
- if ( match <= 0 )
- break;
- SET(i+1,i);
- }
- GETA(i+1);
- if ( match == 0 ) goto done;
- }
- if ( jstack == 0 ) break;
- if ( match == 0 ) break;
- ir = istack[jstack--];
- l = istack[jstack--];
- } else {
- k = (l + ir) >> 1; /* Choose median of left, center, right */
- EXCH(k, l+1);
- COMP( cv[IX(l)], cv[IX(ir)] );
- if ( match > 0 ) {
- EXCH(l, ir);
- } else if ( match == 0 ) {
- i = ir;
- break;
- }
- COMP( cv[IX(l+1)], cv[IX(ir)] );
- if ( match > 0 ) {
- EXCH(l+1, ir);
- } else if ( match == 0 ) {
- i = ir;
- break;
- }
- COMP( cv[IX(l)], cv[IX(l+1)] );
- if ( match > 0 ) {
- EXCH(l, l+1);
- } else if ( match == 0 ) {
- i = l;
- break;
- }
- i = l+1;
- j = ir;
- a = cv[IX(i)];
- for(;;) {
- do {
- i++;
- COMP( cv[IX(i)], a );
- } while( match < 0 );
- while( match > 0 ) {
- j--;
- COMP( cv[IX(j)], a );
- }
- if (j < i) {
- match = 1;
- break;
- }
- if ( match == 0 ) {
- i = l+1;
- break;
- }
- EXCH(i,j);
- }
- if ( match == 0 )
- break;
- EXCH(l+1,j);
- jstack += 2;
- if (ir-i+1 >= j) {
- istack[jstack] = ir;
- istack[jstack-1] = i;
- ir = j;
- } else {
- istack[jstack] = j;
- istack[jstack-1] = l;
- l = i;
- }
- }
- }
-done:
- if ( i >= 0 )
- j = ix[i];
+ ad = ml->sml_desc;
+ nvals = ml->sml_numvals;
- slap_sl_free( ix, ctx );
+ /* For Modifications, sml_nvalues is NULL if normalization wasn't needed.
+ * For Attributes, sml_nvalues == sml_values when normalization isn't needed.
+ */
+ if ( ml->sml_nvalues && ml->sml_nvalues != ml->sml_values ) {
+ cv = ml->sml_nvalues;
+ is_norm = 1;
+ } else {
+ cv = ml->sml_values;
+ is_norm = 0;
+ }
- if ( rc != LDAP_SUCCESS ) {
- return rc;
- } else if ( match == 0 ) {
- /* value exists already */
- assert( i >= 0 );
- assert( i < nvals );
- snprintf( textbuf, textlen,
- "%s: value #%d provided more than once",
- ml->sml_desc->ad_cname.bv_val, j );
- *text = textbuf;
- return LDAP_TYPE_OR_VALUE_EXISTS;
+ if ( ad == slap_schema.si_ad_objectClass )
+ mr = NULL; /* shortcut matching */
+ else
+ mr = ad->ad_type->sat_equality;
+
+ /* record indices to preserve input ordering */
+ ix = slap_sl_malloc( nvals * sizeof(int), ctx );
+ for (i=0; i<nvals; i++) ix[i] = i;
+
+ ir = nvals-1;
+ l = 0;
+ jstack = 0;
+
+ for(;;) {
+ if (ir - l < SMALL) { /* Insertion sort */
+ match=1;
+ for (j=l+1;j<=ir;j++) {
+ SETA(j);
+ for (i=j-1;i>=0;i--) {
+ COMP(cv[IX(i)], a);
+ if ( match <= 0 )
+ break;
+ SET(i+1,i);
+ }
+ GETA(i+1);
+ if ( match == 0 ) goto done;
+ }
+ if ( jstack == 0 ) break;
+ if ( match == 0 ) break;
+ ir = istack[jstack--];
+ l = istack[jstack--];
+ } else {
+ k = (l + ir) >> 1; /* Choose median of left, center, right */
+ EXCH(k, l+1);
+ COMP( cv[IX(l)], cv[IX(ir)] );
+ if ( match > 0 ) {
+ EXCH(l, ir);
+ } else if ( match == 0 ) {
+ i = ir;
+ break;
+ }
+ COMP( cv[IX(l+1)], cv[IX(ir)] );
+ if ( match > 0 ) {
+ EXCH(l+1, ir);
+ } else if ( match == 0 ) {
+ i = ir;
+ break;
+ }
+ COMP( cv[IX(l)], cv[IX(l+1)] );
+ if ( match > 0 ) {
+ EXCH(l, l+1);
+ } else if ( match == 0 ) {
+ i = l;
+ break;
+ }
+ i = l+1;
+ j = ir;
+ a = cv[IX(i)];
+ for(;;) {
+ do {
+ i++;
+ COMP( cv[IX(i)], a );
+ } while( match < 0 );
+ while( match > 0 ) {
+ j--;
+ COMP( cv[IX(j)], a );
+ }
+ if (j < i) {
+ match = 1;
+ break;
}
-#endif /* SLAP_MODS_CHECK_QUICKSORT */
+ if ( match == 0 ) {
+ i = l+1;
+ break;
+ }
+ EXCH(i,j);
+ }
+ if ( match == 0 )
+ break;
+ EXCH(l+1,j);
+ jstack += 2;
+ if (ir-i+1 >= j) {
+ istack[jstack] = ir;
+ istack[jstack-1] = i;
+ ir = j;
+ } else {
+ istack[jstack] = j;
+ istack[jstack-1] = l;
+ l = i;
}
}
}
+ done:
+ if ( match == 0 && i >= 0 )
+ *dup = ix[i];
+
+ /* For sorted attributes, put the values in index order */
+ if ( rc == LDAP_SUCCESS && match &&
+ ( ad->ad_type->sat_flags & SLAP_AT_SORTED_VAL )) {
+ BerVarray tmpv = slap_sl_malloc( sizeof( struct berval ) * nvals, ctx );
+ for ( i = 0; i<nvals; i++ )
+ tmpv[i] = cv[ix[i]];
+ for ( i = 0; i<nvals; i++ )
+ cv[i] = tmpv[i];
+ /* Check if the non-normalized array needs to move too */
+ if ( is_norm ) {
+ cv = ml->sml_values;
+ for ( i = 0; i<nvals; i++ )
+ tmpv[i] = cv[ix[i]];
+ for ( i = 0; i<nvals; i++ )
+ cv[i] = tmpv[i];
+ }
+ slap_sl_free( tmpv, ctx );
+ }
+
+ slap_sl_free( ix, ctx );
+ if ( rc != LDAP_SUCCESS ) {
+ return rc;
+ } else if ( match == 0 ) {
+ /* value exists already */
+ assert( i >= 0 );
+ assert( i < nvals );
+ return LDAP_TYPE_OR_VALUE_EXISTS;
+ }
return LDAP_SUCCESS;
}
timestamp.bv_val = timebuf;
for ( modtail = modsp; *modtail; modtail = &(*modtail)->sml_next ) {
if ( (*modtail)->sml_op != LDAP_MOD_ADD &&
+ (*modtail)->sml_op != SLAP_MOD_SOFTADD &&
(*modtail)->sml_op != LDAP_MOD_REPLACE )
{
continue;
mod->sml_next = NULL;
BER_BVZERO( &mod->sml_type );
mod->sml_desc = slap_schema.si_ad_entryCSN;
+ mod->sml_numvals = 1;
mod->sml_values = (BerVarray) ch_malloc( 2 * sizeof( struct berval ) );
ber_dupbv( &mod->sml_values[0], &csn );
BER_BVZERO( &mod->sml_values[1] );
mod->sml_next = NULL;
BER_BVZERO( &mod->sml_type );
mod->sml_desc = slap_schema.si_ad_modifiersName;
+ mod->sml_numvals = 1;
mod->sml_values = (BerVarray) ch_malloc( 2 * sizeof( struct berval ) );
ber_dupbv( &mod->sml_values[0], &name );
BER_BVZERO( &mod->sml_values[1] );
mod->sml_next = NULL;
BER_BVZERO( &mod->sml_type );
mod->sml_desc = slap_schema.si_ad_modifyTimestamp;
+ mod->sml_numvals = 1;
mod->sml_values = (BerVarray) ch_malloc( 2 * sizeof( struct berval ) );
ber_dupbv( &mod->sml_values[0], ×tamp );
BER_BVZERO( &mod->sml_values[1] );
ber_tag_t tag;
ber_len_t len;
char *last;
- Modifications **modtail = &ms->rs_modlist;
+ Modifications **modtail = &ms->rs_mods.rs_modlist;
- ms->rs_modlist = NULL;
+ ms->rs_mods.rs_modlist = NULL;
ms->rs_increment = 0;
rs->sr_err = LDAP_SUCCESS;
switch( mop ) {
case LDAP_MOD_ADD:
if ( mod->sml_values == NULL ) {
- Debug( LDAP_DEBUG_ANY, "slap_parse_modlist: "
- "modify/add operation (%ld) requires values\n",
- (long) mop, 0, 0 );
-
rs->sr_text = "modify/add operation requires values";
rs->sr_err = LDAP_PROTOCOL_ERROR;
goto done;
if( op->o_protocol >= LDAP_VERSION3 ) {
ms->rs_increment++;
if ( mod->sml_values == NULL ) {
- Debug( LDAP_DEBUG_ANY, "slap_parse_modlist: "
- "modify/increment operation (%ld) requires value\n",
- (long) mop, 0, 0 );
-
rs->sr_text = "modify/increment operation requires value";
rs->sr_err = LDAP_PROTOCOL_ERROR;
goto done;
}
if ( !BER_BVISNULL( &mod->sml_values[ 1 ] ) ) {
- Debug( LDAP_DEBUG_ANY, "slap_parse_modlist: modify/increment "
- "operation (%ld) requires single value\n",
- (long) mop, 0, 0 );
-
rs->sr_text = "modify/increment operation requires single value";
rs->sr_err = LDAP_PROTOCOL_ERROR;
goto done;
/* fall thru */
default:
- Debug( LDAP_DEBUG_ANY, "slap_parse_modlist: "
- "unrecognized modify operation (%ld)\n",
- (long) mop, 0, 0 );
-
rs->sr_text = "unrecognized modify operation";
rs->sr_err = LDAP_PROTOCOL_ERROR;
goto done;
done:
if ( rs->sr_err != LDAP_SUCCESS ) {
- slap_mods_free( ms->rs_modlist, 1 );
- ms->rs_modlist = NULL;
+ slap_mods_free( ms->rs_mods.rs_modlist, 1 );
+ ms->rs_mods.rs_modlist = NULL;
ms->rs_increment = 0;
}