From: Pekka Riikonen Date: Tue, 3 Jul 2007 19:47:45 +0000 (+0000) Subject: Added support for user specified SilcStack. X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=commitdiff_plain;h=57fdb449ba19b3303f5c48e0b222b8bb731868eb Added support for user specified SilcStack. --- diff --git a/lib/silcasn1/silcasn1.c b/lib/silcasn1/silcasn1.c index 5965228b..c1ec3bb4 100644 --- a/lib/silcasn1/silcasn1.c +++ b/lib/silcasn1/silcasn1.c @@ -23,14 +23,30 @@ /* Allocate ASN.1 context. */ -SilcAsn1 silc_asn1_alloc(void) +SilcAsn1 silc_asn1_alloc(SilcStack stack) { - SilcAsn1 asn1 = silc_calloc(1, sizeof(*asn1)); - if (!asn1) + SilcAsn1 asn1; + SilcStack stack1; + + stack1 = silc_stack_alloc(0, stack); + if (!stack1) return NULL; - if (!silc_asn1_init(asn1)) + /* Allocate itself from the stack */ + asn1 = silc_scalloc(stack1, 1, sizeof(*asn1)); + if (!asn1) { + silc_stack_free(stack1); + return NULL; + } + + asn1->stack1 = stack1; + asn1->stack2 = silc_stack_alloc(0, stack); + if (!asn1->stack2) { + silc_stack_free(stack1); return NULL; + } + + asn1->accumul = 0; return asn1; } @@ -40,20 +56,19 @@ SilcAsn1 silc_asn1_alloc(void) void silc_asn1_free(SilcAsn1 asn1) { silc_asn1_uninit(asn1); - silc_free(asn1); } /* Init pre-allocated ASN.1 context */ -SilcBool silc_asn1_init(SilcAsn1 asn1) +SilcBool silc_asn1_init(SilcAsn1 asn1, SilcStack stack) { - asn1->stack1 = silc_stack_alloc(768); + asn1->stack1 = silc_stack_alloc(0, stack); if (!asn1->stack1) return FALSE; - asn1->stack2 = silc_stack_alloc(768); + asn1->stack2 = silc_stack_alloc(0, stack); if (!asn1->stack2) { - silc_stack_free(asn1->stack2); + silc_stack_free(asn1->stack1); return FALSE; } @@ -66,8 +81,8 @@ SilcBool silc_asn1_init(SilcAsn1 asn1) void silc_asn1_uninit(SilcAsn1 asn1) { - silc_stack_free(asn1->stack1); silc_stack_free(asn1->stack2); + silc_stack_free(asn1->stack1); } #if defined(SILC_DEBUG) diff --git a/lib/silcasn1/silcasn1.h b/lib/silcasn1/silcasn1.h index df5bde14..6ee70bbb 100644 --- a/lib/silcasn1/silcasn1.h +++ b/lib/silcasn1/silcasn1.h @@ -201,13 +201,14 @@ typedef enum { * * SYNOPSIS * - * SilcAsn1 silc_asn1_alloc(void); + * SilcAsn1 silc_asn1_alloc(SilcStack stack); * * DESCRIPTION * * Allocates and initializes ASN.1 encoder/decoder and returns SilcAsn1 * context or NULL on error. This context can be used with both - * silc_asn1_encode and silc_asn1_decode functions. + * silc_asn1_encode and silc_asn1_decode functions. If `stack' is non-NULL + * all memory will be allocated from `stack'. * * Usually SilcAsn1 is allocated when encoder or decoder is needed, * however it is also possible to allocate long-lasting SilcAsn1 and @@ -220,7 +221,7 @@ typedef enum { * data that is returned by silc_asn1_decode function becomes invalid. * ***/ -SilcAsn1 silc_asn1_alloc(void); +SilcAsn1 silc_asn1_alloc(SilcStack stack); /****f* silcasn1/SilcASN1API/silc_asn1_free * @@ -241,7 +242,7 @@ void silc_asn1_free(SilcAsn1 asn1); * * SYNOPSIS * - * SilcBool silc_asn1_init(SilcAsn1 asn1); + * SilcBool silc_asn1_init(SilcAsn1 asn1, SilcStack stack); * * DESCRIPTION * @@ -252,11 +253,11 @@ void silc_asn1_free(SilcAsn1 asn1); * EXAMPLE * * SilcAsn1Struct asn1; - * if (!silc_asn1_init(&asn1)) + * if (!silc_asn1_init(&asn1, NULL)) * error; * ***/ -SilcBool silc_asn1_init(SilcAsn1 asn1); +SilcBool silc_asn1_init(SilcAsn1 asn1, SilcStack stack); /****f* silcasn1/SilcASN1API/silc_asn1_uninit * diff --git a/lib/silcasn1/tests/test_silcasn1.c b/lib/silcasn1/tests/test_silcasn1.c index 74bd8c80..b3c5e915 100644 --- a/lib/silcasn1/tests/test_silcasn1.c +++ b/lib/silcasn1/tests/test_silcasn1.c @@ -55,6 +55,7 @@ int main(int argc, char **argv) char tmp[32]; SilcRng rng; SilcMPInt mpint, mpint2; + SilcStack stack; memset(&node, 0, sizeof(node)); memset(&node2, 0, sizeof(node2)); @@ -62,15 +63,17 @@ int main(int argc, char **argv) if (argc > 1 && !strcmp(argv[1], "-d")) { silc_log_debug(TRUE); silc_log_debug_hexdump(TRUE); - silc_log_set_debug_string("*asn1*,*ber*"); + silc_log_set_debug_string("*asn1*,*ber*,*stack*"); } silc_hash_register_default(); rng = silc_rng_alloc(); silc_rng_init(rng); + stack = silc_stack_alloc(0, NULL); + SILC_LOG_DEBUG(("Allocating ASN.1 context")); - asn1 = silc_asn1_alloc(); + asn1 = silc_asn1_alloc(stack); if (!asn1) goto out; @@ -744,6 +747,9 @@ int main(int argc, char **argv) #endif /* 1 */ silc_asn1_free(asn1); + silc_rng_free(rng); + silc_hash_unregister_all(); + silc_stack_free(stack); success = TRUE; out: