summaryrefslogtreecommitdiff
path: root/source3/lib
diff options
context:
space:
mode:
Diffstat (limited to 'source3/lib')
-rw-r--r--source3/lib/util.c27
1 files changed, 17 insertions, 10 deletions
diff --git a/source3/lib/util.c b/source3/lib/util.c
index 52cf15da1e..77d4e6d2a6 100644
--- a/source3/lib/util.c
+++ b/source3/lib/util.c
@@ -984,18 +984,22 @@ void add_to_large_array(TALLOC_CTX *mem_ctx, size_t element_size,
void *element, void **array, uint32 *num_elements,
ssize_t *array_size)
{
- if (*array_size == -1)
+ if (*array_size < 0)
return;
if (*array == NULL) {
- if (*array_size == 0)
+ if (*array_size == 0) {
*array_size = 128;
+ }
+
+ if (*array_size >= MAX_ALLOC_SIZE/element_size) {
+ goto error;
+ }
if (mem_ctx != NULL)
- *array = talloc_array(mem_ctx, element_size,
- *array_size);
+ *array = TALLOC(mem_ctx, element_size * (*array_size));
else
- *array = malloc_array(element_size, *array_size);
+ *array = SMB_MALLOC(element_size * (*array_size));
if (*array == NULL)
goto error;
@@ -1004,13 +1008,16 @@ void add_to_large_array(TALLOC_CTX *mem_ctx, size_t element_size,
if (*num_elements == *array_size) {
*array_size *= 2;
+ if (*array_size >= MAX_ALLOC_SIZE/element_size) {
+ goto error;
+ }
+
if (mem_ctx != NULL)
- *array = talloc_realloc_array(mem_ctx, *array,
- element_size,
- *array_size);
+ *array = TALLOC_REALLOC(mem_ctx, *array,
+ element_size * (*array_size));
else
- *array = realloc_array(*array, element_size,
- *array_size);
+ *array = SMB_REALLOC(*array,
+ element_size * (*array_size));
if (*array == NULL)
goto error;