X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=lib%2Fsilcutil%2Fsilcmemory.c;h=b7f69df850e64e33bca5d273d9a85f69f055ecf5;hp=d2a0dba459f9c6bf563dd53e0b95da7e2cc2b734;hb=e7b6c157b80152bf9fb9266e6bdd93f9fb0db776;hpb=0f0340b9fbce9704cc7171f8f0104ce9103d2de6 diff --git a/lib/silcutil/silcmemory.c b/lib/silcutil/silcmemory.c index d2a0dba4..b7f69df8 100644 --- a/lib/silcutil/silcmemory.c +++ b/lib/silcutil/silcmemory.c @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 1999 - 2005 Pekka Riikonen + Copyright (C) 1999 - 2008 Pekka Riikonen This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,7 +18,7 @@ */ /* $Id$ */ -#include "silcincludes.h" +#include "silc.h" #ifndef SILC_STACKTRACE @@ -27,39 +27,59 @@ void *silc_malloc(size_t size) { void *addr; - if (size <= 0 || size >= SILC_MAX_ALLOC) { - SILC_LOG_ERROR(("Invalid memory allocation")); + + if (silc_unlikely(size <= 0 || size >= SILC_MAX_ALLOC)) { + 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 (!addr) - SILC_LOG_ERROR(("System out of memory")); + if (silc_unlikely(!addr)) + silc_set_errno_nofail(SILC_ERR_OUT_OF_MEMORY); + return addr; } void *silc_calloc(size_t items, size_t size) { void *addr; - if (size * items <= 0 || size * items >= SILC_MAX_ALLOC) { - SILC_LOG_ERROR(("Invalid memory allocation")); + + if (silc_unlikely(size * items <= 0 || size * items >= SILC_MAX_ALLOC)) { + 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 (!addr) - SILC_LOG_ERROR(("System out of memory")); + if (silc_unlikely(!addr)) + silc_set_errno_nofail(SILC_ERR_OUT_OF_MEMORY); + return addr; } void *silc_realloc(void *ptr, size_t size) { void *addr; - if (size <= 0 || size >= SILC_MAX_ALLOC) { - SILC_LOG_ERROR(("Invalid memory allocation")); + if (silc_unlikely(size <= 0 || size >= SILC_MAX_ALLOC)) { + 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 (!addr) - SILC_LOG_ERROR(("System out of memory")); + if (silc_unlikely(!addr)) + 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 (!addr) { - SILC_LOG_ERROR(("System out of memory")); + if (silc_unlikely(!addr)) { + silc_set_errno_nofail(SILC_ERR_OUT_OF_MEMORY); return NULL; } memcpy((void *)addr, ptr, size); @@ -81,18 +102,30 @@ 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 */ void *silc_smalloc(SilcStack stack, SilcUInt32 size) { - return stack ? silc_stack_malloc(stack, size, TRUE) : silc_malloc(size); + return stack ? silc_stack_malloc(stack, size) : silc_malloc(size); } -void *silc_smalloc_ua(SilcStack stack, SilcUInt32 size) +void silc_sfree(SilcStack stack, void *ptr) { - return stack ? silc_stack_malloc(stack, size, FALSE) : silc_malloc(size); + if (stack) { +#ifdef SILC_DEBUG + if (ptr) + *(unsigned char *)ptr = 'F'; +#endif /* SILC_DEBUG */ + return; + } + silc_free(ptr); } void *silc_scalloc(SilcStack stack, SilcUInt32 items, SilcUInt32 size) @@ -102,8 +135,8 @@ void *silc_scalloc(SilcStack stack, SilcUInt32 items, SilcUInt32 size) if (!stack) return silc_calloc(items, size); - addr = silc_stack_malloc(stack, items * size, TRUE); - if (!addr) + addr = silc_stack_malloc(stack, items * size); + if (silc_unlikely(!addr)) return NULL; memset(addr, 0, items * size); return (void *)addr; @@ -112,15 +145,20 @@ void *silc_scalloc(SilcStack stack, SilcUInt32 items, SilcUInt32 size) void *silc_srealloc(SilcStack stack, SilcUInt32 old_size, void *ptr, SilcUInt32 size) { - return stack ? silc_stack_realloc(stack, old_size, ptr, size, TRUE) : - silc_realloc(ptr, size); -} + void *new_ptr; -void *silc_srealloc_ua(SilcStack stack, SilcUInt32 old_size, - void *ptr, SilcUInt32 size) -{ - return stack ? silc_stack_realloc(stack, old_size, ptr, size, FALSE) : - silc_realloc(ptr, size); + if (!stack) + return silc_realloc(ptr, size); + + new_ptr = silc_stack_realloc(stack, old_size, ptr, size); + if (!new_ptr) { + new_ptr = silc_smalloc(stack, size); + if (!new_ptr) + return NULL; + memcpy(new_ptr, ptr, old_size > size ? size : old_size); + } + + return new_ptr; } void *silc_smemdup(SilcStack stack, const void *ptr, SilcUInt32 size) @@ -130,8 +168,8 @@ void *silc_smemdup(SilcStack stack, const void *ptr, SilcUInt32 size) if (!stack) return silc_memdup(ptr, size); - addr = silc_stack_malloc(stack, size + 1, TRUE); - if (!addr) + addr = silc_stack_malloc(stack, size + 1); + if (silc_unlikely(!addr)) return NULL; memcpy((void *)addr, ptr, size); addr[size] = '\0'; @@ -146,8 +184,8 @@ char *silc_sstrdup(SilcStack stack, const char *str) if (!stack) return silc_memdup(str, size); - addr = silc_stack_malloc(stack, size + 1, FALSE); - if (!addr) + addr = silc_stack_malloc(stack, size + 1); + if (silc_unlikely(!addr)) return NULL; memcpy((void *)addr, str, size); addr[size] = '\0';