X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcutil%2Fsilcmemory.c;h=ec8eb1e39be41c7d7f214e0ba7ff21969d50334d;hb=51558729d89b9f3492b2ca754242ed548a579ca4;hp=067cf1a38da069755112078a6d059a84287e876f;hpb=1c3ae0efc13419718213114e140c3d83b4608c1e;p=runtime.git diff --git a/lib/silcutil/silcmemory.c b/lib/silcutil/silcmemory.c index 067cf1a3..ec8eb1e3 100644 --- a/lib/silcutil/silcmemory.c +++ b/lib/silcutil/silcmemory.c @@ -27,26 +27,40 @@ void *silc_malloc(size_t size) { void *addr; + if (silc_unlikely(size <= 0 || size >= SILC_MAX_ALLOC)) { - SILC_LOG_ERROR(("Invalid memory allocation, allocation by %x", size)); + if (size == 0) + silc_set_errno_nofail(SILC_ERR_ZERO_ALLOCATION); + else + silc_set_errno_reason_nofail(SILC_ERR_TOO_LARGE_ALLOCATION, + "Allocation by %d", size); return NULL; } + addr = malloc(size); if (silc_unlikely(!addr)) - SILC_LOG_ERROR(("System out of memory")); + silc_set_errno_nofail(SILC_ERR_OUT_OF_MEMORY); + return addr; } void *silc_calloc(size_t items, size_t size) { void *addr; + if (silc_unlikely(size * items <= 0 || size * items >= SILC_MAX_ALLOC)) { - SILC_LOG_ERROR(("Invalid memory allocation, allocation by %x", size)); + if (size == 0) + silc_set_errno_nofail(SILC_ERR_ZERO_ALLOCATION); + else + silc_set_errno_reason_nofail(SILC_ERR_TOO_LARGE_ALLOCATION, + "Allocation by %d", size); return NULL; } + addr = calloc(items, size); if (silc_unlikely(!addr)) - SILC_LOG_ERROR(("System out of memory")); + silc_set_errno_nofail(SILC_ERR_OUT_OF_MEMORY); + return addr; } @@ -54,12 +68,18 @@ void *silc_realloc(void *ptr, size_t size) { void *addr; if (silc_unlikely(size <= 0 || size >= SILC_MAX_ALLOC)) { - SILC_LOG_ERROR(("Invalid memory allocation, allocation by %x", size)); + if (size == 0) + silc_set_errno_nofail(SILC_ERR_ZERO_ALLOCATION); + else + silc_set_errno_reason_nofail(SILC_ERR_TOO_LARGE_ALLOCATION, + "Allocation by %d", size); return NULL; } + addr = realloc(ptr, size); if (silc_unlikely(!addr)) - SILC_LOG_ERROR(("System out of memory")); + silc_set_errno_nofail(SILC_ERR_OUT_OF_MEMORY); + return addr; } @@ -71,9 +91,10 @@ void silc_free(void *ptr) void *silc_memdup(const void *ptr, size_t size) { unsigned char *addr; + addr = silc_malloc(size + 1); if (silc_unlikely(!addr)) { - SILC_LOG_ERROR(("System out of memory")); + silc_set_errno_nofail(SILC_ERR_OUT_OF_MEMORY); return NULL; } memcpy((void *)addr, ptr, size); @@ -81,6 +102,11 @@ void *silc_memdup(const void *ptr, size_t size) return (void *)addr; } +char *silc_strdup(const char *str) +{ + return silc_memdup(str, strlen(str)); +} + #endif /* !SILC_STACKTRACE */ /* SilcStack aware routines */