diff options
Diffstat (limited to 'source4/lib')
-rw-r--r-- | source4/lib/data_blob.c | 5 | ||||
-rw-r--r-- | source4/lib/talloc.c | 22 |
2 files changed, 20 insertions, 7 deletions
diff --git a/source4/lib/data_blob.c b/source4/lib/data_blob.c index e10ebfe606..c8c57849d2 100644 --- a/source4/lib/data_blob.c +++ b/source4/lib/data_blob.c @@ -56,6 +56,11 @@ DATA_BLOB data_blob_talloc(TALLOC_CTX *mem_ctx, const void *p, size_t length) if (ret.data) { ret.data = talloc_steal(mem_ctx, ret.data); + } else { + /* this ensures the blob has the context attached, so a zero length call + to data_blob_talloc followed by a realloc doesn't cause the memory to come + from the NULL context */ + ret.data = talloc(mem_ctx, 0); } return ret; } diff --git a/source4/lib/talloc.c b/source4/lib/talloc.c index 3e42fc68f8..c08495aae4 100644 --- a/source4/lib/talloc.c +++ b/source4/lib/talloc.c @@ -26,6 +26,9 @@ #include "includes.h" +#undef talloc +#define talloc(ctx, size) _talloc(ctx, size) + #define MAX_TALLOC_SIZE 0x10000000 #define TALLOC_MAGIC 0xe814ec4f #define TALLOC_MAGIC_FREE 0x7faebef3 @@ -59,7 +62,7 @@ static struct talloc_chunk *talloc_chunk_from_ptr(void *ptr) /* Allocate a bit of memory as a child of an existing pointer */ -void *talloc(void *context, size_t size) +void *_talloc(void *context, size_t size) { struct talloc_chunk *tc; @@ -289,7 +292,7 @@ int talloc_free(void *ptr) /* A talloc version of realloc */ -void *talloc_realloc(void *ptr, size_t size) +void *_talloc_realloc(void *ptr, size_t size, const char *name) { struct talloc_chunk *tc; void *new_ptr; @@ -302,7 +305,7 @@ void *talloc_realloc(void *ptr, size_t size) /* realloc(NULL) is equavalent to malloc() */ if (ptr == NULL) { - return talloc(NULL, size); + return talloc_named_const(NULL, size, name); } tc = talloc_chunk_from_ptr(ptr); @@ -330,6 +333,7 @@ void *talloc_realloc(void *ptr, size_t size) } tc->size = size; + talloc_set_name_const(tc+1, name); return (void *)(tc+1); } @@ -582,26 +586,30 @@ char *talloc_asprintf_append(char *s, /* alloc an array, checking for integer overflow in the array size */ -void *talloc_array(void *ctx, size_t el_size, uint_t count) +void *talloc_array(void *ctx, size_t el_size, uint_t count, const char *name) { if (count == 0 || count >= MAX_TALLOC_SIZE/el_size) { return NULL; } - return talloc(ctx, el_size * count); + return talloc_named_const(ctx, el_size * count, name); } /* realloc an array, checking for integer overflow in the array size */ -void *talloc_realloc_array(void *ptr, size_t el_size, uint_t count) +void *talloc_realloc_array(void *ptr, size_t el_size, uint_t count, const char *name) { if (count == 0 || count >= MAX_TALLOC_SIZE/el_size) { return NULL; } - return talloc_realloc(ptr, el_size * count); + ptr = talloc_realloc(ptr, el_size * count); + if (ptr) { + talloc_set_name_const(ptr, name); + } + return ptr; } /* |