From: Howard Chu Date: Wed, 21 Sep 2011 23:06:52 +0000 (-0700) Subject: Only free malloc'd cursors X-Git-Tag: OPENLDAP_REL_ENG_2_4_27~148^2~17 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=9bcc51ef5d6e4081770cfb5cc309c6c8a6f38f2f;p=openldap Only free malloc'd cursors --- diff --git a/libraries/libmdb/mdb.c b/libraries/libmdb/mdb.c index 28d5001c48..ae2e77ccb7 100644 --- a/libraries/libmdb/mdb.c +++ b/libraries/libmdb/mdb.c @@ -790,7 +790,8 @@ struct MDB_cursor { #define C_INITIALIZED 0x01 /**< cursor has been initialized and is valid */ #define C_EOF 0x02 /**< No more data */ #define C_SUB 0x04 /**< Cursor is a sub-cursor */ -#define C_SHADOW 0x08 /**< Cursor is a dup from a parent txn */ +#define C_SHADOW 0x08 /**< Cursor is a dup from a parent txn */ +#define C_ALLOCD 0x10 /**< Cursor was malloc'd */ /** @} */ unsigned int mc_flags; /**< @ref mdb_cursor */ MDB_page *mc_pg[CURSOR_STACK]; /**< stack of pushed pages */ @@ -1316,7 +1317,8 @@ mdb_cursor_merge(MDB_txn *txn) m2->mc_ki[j] = mc->mc_ki[j]; } } - free(mc); + if (mc->mc_flags & C_ALLOCD) + free(mc); } } } @@ -1517,7 +1519,8 @@ mdb_txn_reset0(MDB_txn *txn) MDB_cursor *mc; while ((mc = txn->mt_cursors[i])) { txn->mt_cursors[i] = mc->mc_next; - free(mc); + if (mc->mc_flags & C_ALLOCD) + free(mc); } } } @@ -4620,6 +4623,7 @@ mdb_cursor_open(MDB_txn *txn, MDB_dbi dbi, MDB_cursor **ret) mc->mc_next = txn->mt_cursors[dbi]; txn->mt_cursors[dbi] = mc; } + mc->mc_flags |= C_ALLOCD; } else { return ENOMEM; } @@ -4664,7 +4668,8 @@ mdb_cursor_close(MDB_cursor *mc) if (*prev == mc) *prev = mc->mc_next; } - free(mc); + if (mc->mc_flags & C_ALLOCD) + free(mc); } }