From 5b44130afad1bb1764d986de3ef0e8e04b0e7357 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Mon, 27 Sep 2004 01:36:19 +0000 Subject: r2671: we're getting too many errors caused by the talloc_realloc() API not taking a context (so when you pass a NULL pointer you end up with memory in a top level context). Fixed it by changing the API to take a context. The context is only used if the pointer you are reallocing is NULL. (This used to be commit 8dc23821c9f54b2f13049b5e608a0cafb81aa540) --- source4/ntvfs/ipc/ipc_rap.c | 7 ++++--- source4/ntvfs/ntvfs_base.c | 9 +++------ source4/ntvfs/posix/pvfs_dirlist.c | 7 +------ source4/ntvfs/simple/svfs.h | 2 +- source4/ntvfs/simple/svfs_util.c | 4 ++-- 5 files changed, 11 insertions(+), 18 deletions(-) (limited to 'source4/ntvfs') diff --git a/source4/ntvfs/ipc/ipc_rap.c b/source4/ntvfs/ipc/ipc_rap.c index 32b2fa2181..840c389d6c 100644 --- a/source4/ntvfs/ipc/ipc_rap.c +++ b/source4/ntvfs/ipc/ipc_rap.c @@ -178,9 +178,10 @@ static NTSTATUS rap_push_string(struct ndr_push *data_push, NDR_CHECK(ndr_push_uint16(data_push, heap->offset)); NDR_CHECK(ndr_push_uint16(data_push, 0)); - heap->strings = talloc_realloc(heap->strings, - sizeof(*heap->strings) * - (heap->num_strings + 1)); + heap->strings = talloc_realloc_p(heap->mem_ctx, + heap->strings, + const char *, + heap->num_strings + 1); if (heap->strings == NULL) return NT_STATUS_NO_MEMORY; diff --git a/source4/ntvfs/ntvfs_base.c b/source4/ntvfs/ntvfs_base.c index 03873ce697..72f4759cd5 100644 --- a/source4/ntvfs/ntvfs_base.c +++ b/source4/ntvfs/ntvfs_base.c @@ -153,11 +153,8 @@ NTSTATUS ntvfs_init_connection(struct smbsrv_request *req) */ void ntvfs_set_private(struct smbsrv_tcon *tcon, int depth, void *value) { - if (!tcon->ntvfs_private_list) { - tcon->ntvfs_private_list = talloc_array_p(tcon, void *, depth+1); - } else { - tcon->ntvfs_private_list = talloc_realloc_p(tcon->ntvfs_private_list, - void *, depth+1); - } + tcon->ntvfs_private_list = talloc_realloc_p(tcon, + tcon->ntvfs_private_list, + void *, depth+1); tcon->ntvfs_private_list[depth] = value; } diff --git a/source4/ntvfs/posix/pvfs_dirlist.c b/source4/ntvfs/posix/pvfs_dirlist.c index 0137424dc4..85c307a1b2 100644 --- a/source4/ntvfs/posix/pvfs_dirlist.c +++ b/source4/ntvfs/posix/pvfs_dirlist.c @@ -89,11 +89,6 @@ NTSTATUS pvfs_list(struct pvfs_state *pvfs, struct pvfs_filename *name, struct p return NT_STATUS_NO_MEMORY; } - dir->names = talloc(dir, 0); - if (!dir->names) { - return NT_STATUS_NO_MEMORY; - } - odir = opendir(name->full_name); if (!odir) { return pvfs_map_errno(pvfs, errno); @@ -110,7 +105,7 @@ NTSTATUS pvfs_list(struct pvfs_state *pvfs, struct pvfs_filename *name, struct p if (dir->count >= allocated) { allocated = (allocated + 100) * 1.2; - dir->names = talloc_realloc_p(dir->names, const char *, allocated); + dir->names = talloc_realloc_p(dir, dir->names, const char *, allocated); if (!dir->names) { closedir(odir); return NT_STATUS_NO_MEMORY; diff --git a/source4/ntvfs/simple/svfs.h b/source4/ntvfs/simple/svfs.h index 33b7cb7011..d3bafb42e3 100644 --- a/source4/ntvfs/simple/svfs.h +++ b/source4/ntvfs/simple/svfs.h @@ -17,7 +17,7 @@ struct svfs_private { struct svfs_dir { uint_t count; char *unix_dir; - struct { + struct svfs_dirfile { char *name; struct stat st; } *files; diff --git a/source4/ntvfs/simple/svfs_util.c b/source4/ntvfs/simple/svfs_util.c index 2e64920fc8..b6b7171487 100644 --- a/source4/ntvfs/simple/svfs_util.c +++ b/source4/ntvfs/simple/svfs_util.c @@ -61,7 +61,7 @@ struct svfs_dir *svfs_list_unix(TALLOC_CTX *mem_ctx, struct smbsrv_request *req, uint_t allocated = 0; char *low_mask; - dir = talloc(mem_ctx, sizeof(struct svfs_dir)); + dir = talloc_p(mem_ctx, struct svfs_dir); if (!dir) { return NULL; } dir->count = 0; @@ -105,7 +105,7 @@ struct svfs_dir *svfs_list_unix(TALLOC_CTX *mem_ctx, struct smbsrv_request *req, if (dir->count >= allocated) { allocated = (allocated + 100) * 1.2; - dir->files = talloc_realloc(dir->files, allocated * sizeof(dir->files[0])); + dir->files = talloc_realloc_p(dir, dir->files, struct svfs_dirfile, allocated); if (!dir->files) { closedir(odir); return NULL; -- cgit