From: Ondřej Kuzník Date: Mon, 19 Jun 2023 14:41:09 +0000 (+0100) Subject: ITS#10067 Account for mods being optional X-Git-Tag: OPENLDAP_REL_ENG_2_5_16~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2816cb80b42fda9bda6c5e909c42bc06ad1cece9;p=thirdparty%2Fopenldap.git ITS#10067 Account for mods being optional --- diff --git a/servers/slapd/back-asyncmeta/modify.c b/servers/slapd/back-asyncmeta/modify.c index a70bae82e3..c28bdc48e5 100644 --- a/servers/slapd/back-asyncmeta/modify.c +++ b/servers/slapd/back-asyncmeta/modify.c @@ -67,21 +67,15 @@ asyncmeta_back_modify_start(Operation *op, for ( i = 0, ml = op->orm_modlist; ml; i++ ,ml = ml->sml_next ) ; - if (i > 0) { - mods = op->o_tmpalloc( sizeof( LDAPMod )*i, op->o_tmpmemctx ); - } - if ( mods == NULL ) { - rs->sr_err = LDAP_OTHER; - retcode = META_SEARCH_ERR; - goto doreturn; - } - modv = ( LDAPMod ** )op->o_tmpalloc( ( i + 1 )*sizeof( LDAPMod * ), op->o_tmpmemctx ); + modv = op->o_tmpalloc( ( i + 1 )*sizeof( LDAPMod * ) + i*sizeof( LDAPMod ), + op->o_tmpmemctx ); if ( modv == NULL ) { rs->sr_err = LDAP_OTHER; retcode = META_SEARCH_ERR; goto doreturn; } + mods = (LDAPMod *)&modv[ i + 1 ]; isupdate = be_shadow_update( op ); for ( i = 0, ml = op->orm_modlist; ml; ml = ml->sml_next ) { @@ -224,6 +218,8 @@ done: op->o_tmpfree( mdn.bv_val, op->o_tmpmemctx ); } + op->o_tmpfree( modv, op->o_tmpmemctx ); + doreturn:; Debug( LDAP_DEBUG_TRACE, "%s <<< asyncmeta_back_modify_start[%p]=%d\n", op->o_log_prefix, msc, candidates[candidate].sr_msgid ); return retcode; diff --git a/servers/slapd/back-meta/modify.c b/servers/slapd/back-meta/modify.c index 0a78e765a7..459e835a58 100644 --- a/servers/slapd/back-meta/modify.c +++ b/servers/slapd/back-meta/modify.c @@ -74,18 +74,8 @@ meta_back_modify( Operation *op, SlapReply *rs ) for ( i = 0, ml = op->orm_modlist; ml; i++ ,ml = ml->sml_next ) ; - mods = ch_malloc( sizeof( LDAPMod )*i ); - if ( mods == NULL ) { - rs->sr_err = LDAP_OTHER; - send_ldap_result( op, rs ); - goto cleanup; - } - modv = ( LDAPMod ** )ch_malloc( ( i + 1 )*sizeof( LDAPMod * ) ); - if ( modv == NULL ) { - rs->sr_err = LDAP_OTHER; - send_ldap_result( op, rs ); - goto cleanup; - } + modv = ch_malloc( ( i + 1 )*sizeof( LDAPMod * ) + i*sizeof( LDAPMod ) ); + mods = (LDAPMod *)&modv[ i + 1 ]; dc.ctx = "modifyAttrDN"; isupdate = be_shadow_update( op ); @@ -206,11 +196,10 @@ cleanup:; } if ( modv != NULL ) { for ( i = 0; modv[ i ]; i++ ) { - free( modv[ i ]->mod_bvalues ); + ch_free( modv[ i ]->mod_bvalues ); } } - free( mods ); - free( modv ); + ch_free( modv ); if ( mc ) { meta_back_release_conn( mi, mc );