From 95d1e474cfe24ea65f3cd0bca82d531e6f56e363 Mon Sep 17 00:00:00 2001 From: Garming Sam Date: Mon, 5 Mar 2018 16:04:03 +1300 Subject: [PATCH] ldb_mdb: Store pid to change destructor on fork Signed-off-by: Garming Sam Reviewed-by: Andrew Bartlett --- lib/ldb/ldb_mdb/ldb_mdb.c | 22 ++++++++++++++++++++++ lib/ldb/ldb_mdb/ldb_mdb.h | 2 ++ 2 files changed, 24 insertions(+) diff --git a/lib/ldb/ldb_mdb/ldb_mdb.c b/lib/ldb/ldb_mdb/ldb_mdb.c index d154ede8ede..e073e17da3c 100644 --- a/lib/ldb/ldb_mdb/ldb_mdb.c +++ b/lib/ldb/ldb_mdb/ldb_mdb.c @@ -595,6 +595,25 @@ static int lmdb_pvt_destructor(struct lmdb_private *lmdb) { struct lmdb_trans *ltx = NULL; + /* Check if this is a forked child */ + if (getpid() != lmdb->pid) { + int fd = 0; + /* + * We cannot call mdb_env_close or commit any transactions, + * otherwise they might appear finished in the parent. + * + */ + + if (mdb_env_get_fd(lmdb->env, &fd) == 0) { + close(fd); + } + + /* Remove the pointer, so that no access should occur */ + lmdb->env = NULL; + + return 0; + } + /* * Close the read transaction if it's open */ @@ -685,6 +704,9 @@ static int lmdb_pvt_open(TALLOC_CTX *mem_ctx, return ldb_mdb_err_map(ret); } + /* Store the original pid during the LMDB open */ + lmdb->pid = getpid(); + return LDB_SUCCESS; } diff --git a/lib/ldb/ldb_mdb/ldb_mdb.h b/lib/ldb/ldb_mdb/ldb_mdb.h index d4a635ca693..8f21493927b 100644 --- a/lib/ldb/ldb_mdb/ldb_mdb.h +++ b/lib/ldb/ldb_mdb/ldb_mdb.h @@ -41,6 +41,8 @@ struct lmdb_private { int error; MDB_txn *read_txn; + pid_t pid; + }; struct lmdb_trans { -- 2.47.2