s3-dbwrap: Add talloc_stackframe() calls
authorAndrew Bartlett <abartlet@samba.org>
Mon, 16 Apr 2012 03:36:01 +0000 (13:36 +1000)
committerAndrew Bartlett <abartlet@samba.org>
Wed, 18 Apr 2012 02:04:59 +0000 (12:04 +1000)
This is in preperation for calling dbwrap from common code, where we may not
have a stackframe set up.

Andrew Bartlett

source3/lib/dbwrap/dbwrap.c

index cfd15a976b7a9867f9f6a343e97aafd676cd3736..80bd09bf437d7fd5f733edae31598cd0a49e1e72 100644 (file)
@@ -148,17 +148,23 @@ static struct db_record *dbwrap_fetch_locked_internal(
 {
        struct db_record *rec;
        struct dbwrap_lock_order_state *lock_order;
+       TALLOC_CTX *frame = talloc_stackframe();
+       if (!frame) {
+               return NULL;
+       }
 
-       lock_order = dbwrap_check_lock_order(db, talloc_tos());
+       lock_order = dbwrap_check_lock_order(db, frame);
        if (lock_order == NULL) {
+               TALLOC_FREE(frame);
                return NULL;
        }
        rec = db_fn(db, mem_ctx, key);
        if (rec == NULL) {
-               TALLOC_FREE(lock_order);
+               TALLOC_FREE(frame);
                return NULL;
        }
        (void)talloc_steal(rec, lock_order);
+       TALLOC_FREE(frame);
        return rec;
 }
 
@@ -235,14 +241,19 @@ NTSTATUS dbwrap_store(struct db_context *db, TDB_DATA key,
 {
        struct db_record *rec;
        NTSTATUS status;
+       TALLOC_CTX *frame = talloc_stackframe();
+       if (!frame) {
+               return NT_STATUS_NO_MEMORY;
+       }
 
-       rec = dbwrap_fetch_locked(db, talloc_tos(), key);
+       rec = dbwrap_fetch_locked(db, frame, key);
        if (rec == NULL) {
+               TALLOC_FREE(frame);
                return NT_STATUS_NO_MEMORY;
        }
 
        status = dbwrap_record_store(rec, data, flags);
-       TALLOC_FREE(rec);
+       TALLOC_FREE(frame);
        return status;
 }
 
@@ -250,13 +261,18 @@ NTSTATUS dbwrap_delete(struct db_context *db, TDB_DATA key)
 {
        struct db_record *rec;
        NTSTATUS status;
+       TALLOC_CTX *frame = talloc_stackframe();
+       if (!frame) {
+               return NT_STATUS_NO_MEMORY;
+       }
 
        rec = dbwrap_fetch_locked(db, talloc_tos(), key);
        if (rec == NULL) {
+               TALLOC_FREE(frame);
                return NT_STATUS_NO_MEMORY;
        }
        status = dbwrap_record_delete(rec);
-       TALLOC_FREE(rec);
+       TALLOC_FREE(frame);
        return status;
 }