From c6fe079ca7000f7cd1fe6978d891f4d75b9f44ba Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Wed, 24 Nov 2010 14:23:32 +0000 Subject: [PATCH] memdup --- src/include/gnunet_common.h | 24 ++++++++++++++++++++++ src/util/common_allocation.c | 40 ++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/src/include/gnunet_common.h b/src/include/gnunet_common.h index badb52880..dddee068a 100644 --- a/src/include/gnunet_common.h +++ b/src/include/gnunet_common.h @@ -353,6 +353,15 @@ unsigned long long GNUNET_htonll (unsigned long long n); */ #define GNUNET_malloc(size) GNUNET_xmalloc_(size, __FILE__, __LINE__) +/** + * Allocate and initialize a block of memory. + * + * @param buf data to initalize the block with + * @param size the number of bytes in buf (and size of the allocation) + * @return pointer to size bytes of memory, never NULL (!) + */ +#define GNUNET_memdup(buf,size) GNUNET_xmemdup_(buf, size, __FILE__, __LINE__) + /** * Wrapper around malloc. Allocates size bytes of memory. * The memory will be zero'ed out. @@ -478,6 +487,21 @@ int GNUNET_asprintf (char **buf, const char *format, ...); void *GNUNET_xmalloc_ (size_t size, const char *filename, int linenumber); + +/** + * Allocate and initialize memory. Checks the return value, aborts if no more + * memory is available. Don't use GNUNET_xmemdup_ directly. Use the + * GNUNET_memdup macro. + * + * @param buf buffer to initialize from (must contain size bytes) + * @param size number of bytes to allocate + * @param filename where is this call being made (for debugging) + * @param linenumber line where this call is being made (for debugging) + * @return allocated memory, never NULL + */ +void *GNUNET_xmemdup_ (const void *buf, size_t size, const char *filename, int linenumber); + + /** * Allocate memory. This function does not check if the allocation * request is within reasonable bounds, allowing allocations larger diff --git a/src/util/common_allocation.c b/src/util/common_allocation.c index 92cbc9747..59fa2dc05 100644 --- a/src/util/common_allocation.c +++ b/src/util/common_allocation.c @@ -68,6 +68,46 @@ GNUNET_xmalloc_ (size_t size, const char *filename, int linenumber) } +/** + * Allocate and initialize memory. Checks the return value, aborts if no more + * memory is available. Don't use GNUNET_xmemdup_ directly. Use the + * GNUNET_memdup macro. + * + * @param buf buffer to initialize from (must contain size bytes) + * @param size number of bytes to allocate + * @param filename where is this call being made (for debugging) + * @param linenumber line where this call is being made (for debugging) + * @return allocated memory, never NULL + */ +void *GNUNET_xmemdup_ (const void *buf, size_t size, const char *filename, int linenumber) +{ + void *ret; + /* As a security precaution, we generally do not allow very large + allocations here */ + GNUNET_assert_at (size <= GNUNET_MAX_MALLOC_CHECKED, filename, linenumber); +#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); + ret = malloc (size); + if (ret == NULL) + { + GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR, "malloc"); + abort (); + } +#ifdef W32_MEM_LIMIT + *((size_t *) ret) = size; + ret = &((size_t *) ret)[1]; + mem_used += size; +#endif + memcpy (ret, buf, size); + return ret; +} + + + /** * Wrapper around malloc. Allocates size bytes of memory. * The memory will be zero'ed out. -- 2.25.1