summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
authorMichael Adam <obnox@samba.org>2009-02-27 15:28:52 +0100
committerMichael Adam <obnox@samba.org>2009-03-04 11:23:05 +0100
commitfb70a8a255f7fd40c7e578d9d21977259f9aa86c (patch)
tree04511e10925bdd57ba5ed1b9362942d7249072af /source3
parent27cf23958b02b05becce6e7c68347f6fea5b7845 (diff)
downloadsamba-fb70a8a255f7fd40c7e578d9d21977259f9aa86c.tar.gz
samba-fb70a8a255f7fd40c7e578d9d21977259f9aa86c.tar.bz2
samba-fb70a8a255f7fd40c7e578d9d21977259f9aa86c.zip
s3: Fix a memleak in dbwrap_rbt.
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
Diffstat (limited to 'source3')
-rw-r--r--source3/lib/dbwrap_rbt.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/source3/lib/dbwrap_rbt.c b/source3/lib/dbwrap_rbt.c
index 6e09627223..cf4faa25b9 100644
--- a/source3/lib/dbwrap_rbt.c
+++ b/source3/lib/dbwrap_rbt.c
@@ -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;
}