ldb: make the 'spy' code more paranoid
authorAndrew Tridgell <tridge@samba.org>
Thu, 1 Sep 2011 04:28:10 +0000 (14:28 +1000)
committerAndrew Tridgell <tridge@samba.org>
Thu, 1 Sep 2011 06:54:23 +0000 (08:54 +0200)
the spy code in ldb_tdb was added a while ago to overcome a memory
hierarchy problem with async ldb errors. Recently we started to get
valgrind errors related to the order of free in the spy code. This
patch ensures that we don't try to use a freed spy pointer. This
prevents the valgrind errors, although I suspect that the memory
hierarchy we have here is more complex than it needs to be

Pair-Programmed-With: Andrew Bartlett <abartlet@samba.org>

Autobuild-User: Andrew Tridgell <tridge@samba.org>
Autobuild-Date: Thu Sep  1 08:54:23 CEST 2011 on sn-devel-104

lib/ldb/ldb_tdb/ldb_tdb.c
lib/ldb/ldb_tdb/ldb_tdb.h

index f07a9d2ae763dc739617b2fa7390232b1927cd17..3630a185942b1c08ff12b18e6d97923d5f553e6e 100644 (file)
 #include "ldb_tdb.h"
 #include <lib/tdb_compat/tdb_compat.h>
 
+/*
+  prevent memory errors on callbacks
+*/
+struct ltdb_req_spy {
+       struct ltdb_context *ctx;
+};
 
 /*
   map a tdb error code to a ldb error code
@@ -1221,9 +1227,10 @@ static void ltdb_timeout(struct tevent_context *ev,
                ltdb_request_done(ctx, LDB_ERR_TIME_LIMIT_EXCEEDED);
        }
 
-       if (!ctx->request_terminated) {
+       if (ctx->spy) {
                /* neutralize the spy */
                ctx->spy->ctx = NULL;
+               ctx->spy = NULL;
        }
        talloc_free(ctx);
 }
@@ -1318,9 +1325,10 @@ static void ltdb_callback(struct tevent_context *ev,
        }
 
 done:
-       if (!ctx->request_terminated) {
+       if (ctx->spy) {
                /* neutralize the spy */
                ctx->spy->ctx = NULL;
+               ctx->spy = NULL;
        }
        talloc_free(ctx);
 }
@@ -1330,7 +1338,9 @@ static int ltdb_request_destructor(void *ptr)
        struct ltdb_req_spy *spy = talloc_get_type(ptr, struct ltdb_req_spy);
 
        if (spy->ctx != NULL) {
+               spy->ctx->spy = NULL;
                spy->ctx->request_terminated = true;
+               spy->ctx = NULL;
        }
 
        return 0;
index 96ad43fbd6c2209552ef9115f36420a88e94ace0..29856bf827b638b619c9ba79f15c46467cdcf6b7 100644 (file)
@@ -33,14 +33,6 @@ struct ltdb_private {
        bool warn_unindexed;
 };
 
-/*
-  the async local context
-  holds also internal search state during a full db search
-*/
-struct ltdb_req_spy {
-       struct ltdb_context *ctx;
-};
-
 struct ltdb_context {
        struct ldb_module *module;
        struct ldb_request *req;