X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Futil%2Fcommon_allocation.c;h=e62c12d086254b014391076ddf4800ab141148d1;hb=0ea8e006d5f5ef84e31e000607bd24a23f8fc1ed;hp=2f78c98f6f5a58e038d6c688a619e55d8b1d114a;hpb=f1b9c5c115139b02cac1cae4f053792e1e5b1ccb;p=oweals%2Fgnunet.git diff --git a/src/util/common_allocation.c b/src/util/common_allocation.c index 2f78c98f6..e62c12d08 100644 --- a/src/util/common_allocation.c +++ b/src/util/common_allocation.c @@ -31,6 +31,14 @@ #define INT_MAX 0x7FFFFFFF #endif +#if 0 +#define W32_MEM_LIMIT 200000000 +#endif + +#ifdef W32_MEM_LIMIT +static LONG mem_used = 0; +#endif + /** * Allocate memory. Checks the return value, aborts if no more * memory is available. @@ -39,33 +47,59 @@ * this function (or GNUNET_malloc) to allocate more than several MB * of memory, if you are possibly needing a very large chunk use * GNUNET_xmalloc_unchecked_ instead. - * @param filename where in the code was the call to GNUNET_array_grow - * @param linenumber where in the code was the call to GNUNET_array_grow + * @param filename where in the code was the call to GNUNET_malloc + * @param linenumber where in the code was the call to GNUNET_malloc * @return pointer to size bytes of memory */ void * GNUNET_xmalloc_ (size_t size, const char *filename, int linenumber) { + void *ret; /* As a security precaution, we generally do not allow very large allocations using the default 'GNUNET_malloc' macro */ - GNUNET_assert_at (size <= GNUNET_MAX_MALLOC_CHECKED, filename, - linenumber); - return GNUNET_xmalloc_unchecked_ (size, filename, linenumber); + GNUNET_assert_at (size <= GNUNET_MAX_MALLOC_CHECKED, filename, linenumber); + ret = GNUNET_xmalloc_unchecked_ (size, filename, linenumber); + if (ret == NULL) + { + GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "malloc"); + abort (); + } + return ret; } + +/** + * Wrapper around malloc. Allocates size bytes of memory. + * The memory will be zero'ed out. + * + * @param size the number of bytes to allocate + * @param filename where in the code was the call to GNUNET_malloc_large + * @param linenumber where in the code was the call to GNUNET_malloc_large + * @return pointer to size bytes of memory, NULL if we do not have enough memory + */ void * GNUNET_xmalloc_unchecked_ (size_t size, const char *filename, int linenumber) { void *result; +#ifdef W32_MEM_LIMIT + size += sizeof (size_t); + if (mem_used + size > W32_MEM_LIMIT) + return NULL; +#endif + GNUNET_assert_at (size < INT_MAX, filename, linenumber); result = malloc (size); if (result == NULL) - { - GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "malloc"); - abort (); - } + return NULL; memset (result, 0, size); + +#ifdef W32_MEM_LIMIT + *((size_t *) result) = size; + result = &((size_t *) result)[1]; + mem_used += size; +#endif + return result; } @@ -81,14 +115,27 @@ GNUNET_xmalloc_unchecked_ (size_t size, const char *filename, int linenumber) */ void * GNUNET_xrealloc_ (void *ptr, - const size_t n, const char *filename, int linenumber) +#ifndef W32_MEM_LIMIT + const size_t n, +#else + size_t n, +#endif + const char *filename, int linenumber) { +#ifdef W32_MEM_LIMIT + n += sizeof (size_t); + ptr = &((size_t *) ptr)[-1]; + mem_used = mem_used - *((size_t *) ptr) + n; +#endif ptr = realloc (ptr, n); if (!ptr) { GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "realloc"); abort (); } +#ifdef W32_MEM_LIMIT + ptr = &((size_t *) ptr)[1]; +#endif return ptr; } @@ -104,6 +151,10 @@ void GNUNET_xfree_ (void *ptr, const char *filename, int linenumber) { GNUNET_assert_at (ptr != NULL, filename, linenumber); +#ifdef W32_MEM_LIMIT + ptr = &((size_t *) ptr)[-1]; + mem_used -= *((size_t *) ptr); +#endif free (ptr); } @@ -111,8 +162,8 @@ GNUNET_xfree_ (void *ptr, const char *filename, int linenumber) * Dup a string (same semantics as strdup). * * @param str the string to dup - * @param filename where in the code was the call to GNUNET_array_grow - * @param linenumber where in the code was the call to GNUNET_array_grow + * @param filename where in the code was the call to GNUNET_strdup + * @param linenumber where in the code was the call to GNUNET_strdup * @return strdup(str) */ char * @@ -218,5 +269,4 @@ GNUNET_snprintf (char *buf, size_t size, const char *format, ...) return ret; } - /* end of common_allocation.c */