X-Git-Url: http://git.silcnet.org/gitweb/?a=blobdiff_plain;f=lib%2Fsilcutil%2Fsilcstack.c;h=79f63d2fc8552242223be51cadbccb5c69d7ff40;hb=a85b69a00898360e6237607a90a263570ad4b3ba;hp=03b18b5cf2c9af62b868a6b2a88717a9ec0e1eb3;hpb=b0645eb80448c57102b33b8de85a93384697a1bf;p=silc.git diff --git a/lib/silcutil/silcstack.c b/lib/silcutil/silcstack.c index 03b18b5c..79f63d2f 100644 --- a/lib/silcutil/silcstack.c +++ b/lib/silcutil/silcstack.c @@ -177,14 +177,18 @@ SilcStack silc_stack_alloc(SilcUInt32 stack_size, SilcStack parent) if (stack_size < SILC_STACK_DEFAULT_SIZE) stack_size = SILC_STACK_DEFAULT_SIZE; + /* Align by 8 */ + stack_size += ((-stack_size) % 8); + if (parent) { /* Get stack from parent. The stack itself is allocated from the - parent. */ + parent (but does not consume parent's own stack). */ e = silc_stack_ref_stack(parent, stack_size, &si, &bsize); if (!e) return NULL; - /* Allocate stack from the parent */ + /* Allocate stack from the returned stack. We allocate ourselves from + our own stack. */ stack = silc_stack_alloc_block(parent, e, 1, sizeof(*stack)); if (!stack) { silc_stack_unref_stack(parent, e); @@ -199,8 +203,8 @@ SilcStack silc_stack_alloc(SilcUInt32 stack_size, SilcStack parent) stack->lock = parent->lock; silc_list_init(stack->stacks, struct SilcStackDataEntryStruct, next); - /* Allocate stack frames from the parent */ - stack->frames = silc_stack_alloc_block(parent, e, SILC_STACK_BLOCK_NUM, + /* Allocate stack frames from the stack itself */ + stack->frames = silc_stack_alloc_block(stack, e, SILC_STACK_BLOCK_NUM, sizeof(*stack->frames)); if (!stack->frames) { silc_stack_unref_stack(parent, e); @@ -371,13 +375,15 @@ void *silc_stack_malloc(SilcStack stack, SilcUInt32 size) SILC_ST_DEBUG(("Allocating %d bytes from %p", size, stack)); if (silc_unlikely(!size)) { - SILC_LOG_ERROR(("Allocation by zero (0)")); + SILC_LOG_DEBUG(("Allocation by zero (0)")); + silc_set_errno_nofail(SILC_ERR_ZERO_ALLOCATION); SILC_STACK_STAT(stack, num_errors, 1); return NULL; } if (silc_unlikely(size > SILC_STACK_MAX_ALLOC)) { - SILC_LOG_ERROR(("Allocating too much")); + SILC_LOG_DEBUG(("Allocating too much")); + silc_set_errno_nofail(SILC_ERR_TOO_LARGE_ALLOCATION); SILC_STACK_STAT(stack, num_errors, 1); if (stack->oom_handler) stack->oom_handler(stack, stack->oom_context); @@ -411,7 +417,8 @@ void *silc_stack_malloc(SilcStack stack, SilcUInt32 size) si++; } if (silc_unlikely(si >= SILC_STACK_BLOCK_NUM)) { - SILC_LOG_ERROR(("Allocating too large block")); + SILC_LOG_DEBUG(("Allocating too large block")); + silc_set_errno_nofail(SILC_ERR_TOO_LARGE_ALLOCATION); SILC_STACK_STAT(stack, num_errors, 1); if (stack->oom_handler) stack->oom_handler(stack, stack->oom_context); @@ -466,13 +473,15 @@ void *silc_stack_realloc(SilcStack stack, SilcUInt32 old_size, SILC_ST_DEBUG(("Reallocating %d bytes (%d) from %p", size, old_size, stack)); if (silc_unlikely(!size || !old_size)) { - SILC_LOG_ERROR(("Allocation by zero (0)")); + SILC_LOG_DEBUG(("Allocation by zero (0)")); + silc_set_errno_nofail(SILC_ERR_ZERO_ALLOCATION); SILC_STACK_STAT(stack, num_errors, 1); return NULL; } if (silc_unlikely(size > SILC_STACK_MAX_ALLOC)) { - SILC_LOG_ERROR(("Allocating too much")); + SILC_LOG_DEBUG(("Allocating too much")); + silc_set_errno_nofail(SILC_ERR_TOO_LARGE_ALLOCATION); SILC_STACK_STAT(stack, num_errors, 1); if (stack->oom_handler) stack->oom_handler(stack, stack->oom_context); @@ -491,6 +500,7 @@ void *silc_stack_realloc(SilcStack stack, SilcUInt32 old_size, if (stack->stack->data[si]->bytes_left + old_size + ((unsigned char *)ptr - (unsigned char *)sptr) != bsize) { SILC_LOG_DEBUG(("Cannot reallocate")); + silc_set_errno_nofail(SILC_ERR_INVALID_ARGUMENT); SILC_STACK_STAT(stack, num_errors, 1); return NULL; } @@ -505,6 +515,8 @@ void *silc_stack_realloc(SilcStack stack, SilcUInt32 old_size, } SILC_LOG_DEBUG(("Cannot reallocate in this block")); + silc_set_errno_reason_nofail(SILC_ERR_TOO_LARGE_ALLOCATION, + "Cannot reallocate in this memory block"); SILC_STACK_STAT(stack, num_errors, 1); return NULL; }