X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fadd.c;h=ae951b490e63ffc99f4c39358ae1d8ab05a9ab4b;hb=434c306cbefeafe40f638ed3df93d630c996f9e5;hp=41ae59cf180ce4d90f13d3754721c4221f92bc12;hpb=fed9370fae35b4aed29a5f8ab619c0b17a9e8cd7;p=openldap diff --git a/servers/slapd/add.c b/servers/slapd/add.c index 41ae59cf18..ae951b490e 100644 --- a/servers/slapd/add.c +++ b/servers/slapd/add.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2014 The OpenLDAP Foundation. + * Copyright 1998-2017 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -48,7 +48,7 @@ do_add( Operation *op, SlapReply *rs ) size_t textlen = sizeof( textbuf ); int rc = 0; int freevals = 1; - OpExtraDB oex; + OpExtraDB *oex; Debug( LDAP_DEBUG_TRACE, "%s do_add\n", op->o_log_prefix, 0, 0 ); @@ -185,15 +185,20 @@ do_add( Operation *op, SlapReply *rs ) } freevals = 0; - - oex.oe.oe_key = (void *)do_add; - oex.oe_db = NULL; - LDAP_SLIST_INSERT_HEAD(&op->o_extra, &oex.oe, oe_next); + oex = op->o_tmpalloc( sizeof(OpExtraDB), op->o_tmpmemctx ); + oex->oe.oe_key = (void *)do_add; + oex->oe_db = NULL; + LDAP_SLIST_INSERT_HEAD(&op->o_extra, &oex->oe, oe_next); op->o_bd = frontendDB; rc = frontendDB->be_add( op, rs ); - LDAP_SLIST_REMOVE(&op->o_extra, &oex.oe, OpExtra, oe_next); + if ( rc == SLAPD_ASYNCOP ) { + /* skip cleanup */ + return rc; + } + + LDAP_SLIST_REMOVE(&op->o_extra, &oex->oe, OpExtra, oe_next); #ifdef LDAP_X_TXN if ( rc == LDAP_X_TXN_SPECIFY_OKAY ) { /* skip cleanup */ @@ -201,10 +206,10 @@ do_add( Operation *op, SlapReply *rs ) } else #endif if ( rc == 0 ) { - if ( op->ora_e != NULL && oex.oe_db != NULL ) { + if ( op->ora_e != NULL && oex->oe_db != NULL ) { BackendDB *bd = op->o_bd; - op->o_bd = oex.oe_db; + op->o_bd = oex->oe_db; be_entry_release_w( op, op->ora_e ); @@ -212,6 +217,7 @@ do_add( Operation *op, SlapReply *rs ) op->o_bd = bd; } } + op->o_tmpfree( oex, op->o_tmpmemctx ); done:; if ( modlist != NULL ) {