s3: Fix a memleak in dbwrap_rbt.
authorMichael Adam <obnox@samba.org>
Fri, 27 Feb 2009 14:28:52 +0000 (15:28 +0100)
committerMichael Adam <obnox@samba.org>
Wed, 4 Mar 2009 10:23:05 +0000 (11:23 +0100)
The SMB_MALLOC'ed rbt node data was not free'd on talloc free of
the db context. This is a quick fix using talloc instead of malloc
for allocation of the node data.

Since malloc was originally used for performance reasons, one
might want to reverse to malloc and create a talloc destructor
that walks the tree and frees all the node data if this talloc
approach proves to be too slow..

Michael

source3/lib/dbwrap_rbt.c

index 6e09627223c84a5b8726e8ca20b0a7a2e60af971..cf4faa25b97254bd978dc8183fdd0e28fa635caa 100644 (file)
@@ -131,12 +131,12 @@ static NTSTATUS db_rbt_store(struct db_record *rec, TDB_DATA data, int flag)
                 */
        }
 
-       node = (struct db_rbt_node *)SMB_MALLOC(
+       node = (struct db_rbt_node *)talloc_size(rec_priv->db_ctx,
                offsetof(struct db_rbt_node, data) + rec->key.dsize
                + data.dsize);
 
        if (node == NULL) {
-               SAFE_FREE(rec_priv->node);
+               TALLOC_FREE(rec_priv->node);
                return NT_STATUS_NO_MEMORY;
        }
 
@@ -148,7 +148,7 @@ static NTSTATUS db_rbt_store(struct db_record *rec, TDB_DATA data, int flag)
        db_rbt_parse_node(node, &this_key, &this_val);
 
        memcpy(this_key.dptr, rec->key.dptr, node->keysize);
-       SAFE_FREE(rec_priv->node);
+       TALLOC_FREE(rec_priv->node);
 
        memcpy(this_val.dptr, data.dptr, node->valuesize);
 
@@ -194,7 +194,7 @@ static NTSTATUS db_rbt_delete(struct db_record *rec)
        }
 
        rb_erase(&rec_priv->node->rb_node, &rec_priv->db_ctx->tree);
-       SAFE_FREE(rec_priv->node);
+       TALLOC_FREE(rec_priv->node);
 
        return NT_STATUS_OK;
 }