blob: ceb0956e5804b439b2b6dda7237472500eb51344 [file]
#ifndef XML_MEMORY_H_PRIVATE__
#define XML_MEMORY_H_PRIVATE__
#include "../../libxml.h"
#include <limits.h>
#include <stddef.h>
#ifndef SIZE_MAX
#define SIZE_MAX ((size_t) -1)
#endif
#define XML_MAX_ITEMS 1000000000 /* 1 billion */
XML_HIDDEN void
xmlInitMemoryInternal(void);
XML_HIDDEN void
xmlCleanupMemoryInternal(void);
/**
* @array: pointer to array
* @capacity: pointer to capacity (in/out)
* @elemSize: size of an element in bytes
* @min: elements in initial allocation
* @max: maximum elements in the array
*
* Grow an array by at least one element, checking for overflow.
*
* Returns the new array size on success, -1 on failure.
*/
static XML_INLINE int
xmlGrowCapacity(int capacity, size_t elemSize, int min, int max) {
int extra;
if (capacity <= 0) {
#ifdef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
(void) min;
return(1);
#else
return(min);
#endif
}
if ((capacity >= max) ||
((size_t) capacity > SIZE_MAX / 2 / elemSize))
return(-1);
/* Grow by 50% */
extra = (capacity + 1) / 2;
if (capacity > max - extra)
return(max);
return(capacity + extra);
}
/**
* @array: pointer to the array
* @elemSize: size of each element in bytes
* @capacity: pointer to current capacity (updated on success)
* @min: initial allocation size
* @max: maximum number of elements
*
* Grow an array, combining overflow-checked capacity growth with
* reallocation. Similar to reallocarray(3) with built-in growth.
*
* On success, returns the new pointer and updates *capacity.
* On failure, returns NULL with the original array and capacity
* preserved.
*/
XML_HIDDEN void *
xmlGrowArray(void *array, size_t elemSize, int *capacity, int min, int max);
#endif /* XML_MEMORY_H_PRIVATE__ */