X-Git-Url: http://git.silcnet.org/gitweb/?p=silc.git;a=blobdiff_plain;f=lib%2Fsilcasn1%2Fsilcasn1.c;h=ea1408e5508d1d01980229f13a129d3e7eb41e97;hp=727d61fdc37866a89bd62c1f00fb250941397d6d;hb=e7b6c157b80152bf9fb9266e6bdd93f9fb0db776;hpb=d527840fc8eb04099acd2c31db99f325a6f71888 diff --git a/lib/silcasn1/silcasn1.c b/lib/silcasn1/silcasn1.c index 727d61fd..ea1408e5 100644 --- a/lib/silcasn1/silcasn1.c +++ b/lib/silcasn1/silcasn1.c @@ -4,7 +4,7 @@ Author: Pekka Riikonen - Copyright (C) 2003 - 2006 Pekka Riikonen + Copyright (C) 2003 - 2007 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 @@ -23,14 +23,31 @@ /* 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->orig_stack = stack; + 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 +57,21 @@ 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->orig_stack = stack; + + 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 +84,15 @@ SilcBool silc_asn1_init(SilcAsn1 asn1) void silc_asn1_uninit(SilcAsn1 asn1) { - silc_stack_free(asn1->stack1); + SilcStack stack1 = asn1->stack1; + + if (asn1->switched) { + stack1 = asn1->stack2; + asn1->stack2 = asn1->stack1; + } + silc_stack_free(asn1->stack2); + silc_stack_free(stack1); } #if defined(SILC_DEBUG) @@ -154,13 +179,14 @@ const char *silc_asn1_tag_name(SilcAsn1Tag tag) #endif /* SILC_DEBUG */ #ifdef SILC_DIST_TOOLKIT +#ifdef SILC_DEBUG /* Dumps the ASN.1 data block into standard output (stdout). */ SilcBool silc_asn1_dump(SilcAsn1 asn1, SilcBuffer src) { SilcBool ret = FALSE; SilcBerEncoding renc; - SilcAsn1Tag rtag; + SilcUInt32 rtag; const unsigned char *rdata; SilcUInt32 rdata_len, len = 0; SilcBool rindef; @@ -169,7 +195,7 @@ SilcBool silc_asn1_dump(SilcAsn1 asn1, SilcBuffer src) while (silc_buffer_len(src)) { /* Decode the BER block */ - ret = silc_ber_decode(src, NULL, &renc, (SilcUInt32 *)&rtag, &rdata, + ret = silc_ber_decode(src, NULL, &renc, &rtag, &rdata, &rdata_len, &rindef, &len); if (!ret) { SILC_LOG_DEBUG(("Error parsing BER block, malformed ASN.1 data")); @@ -177,7 +203,7 @@ SilcBool silc_asn1_dump(SilcAsn1 asn1, SilcBuffer src) } fprintf(stdout, "Type %s [%d]\n", - silc_asn1_tag_name(rtag), rtag); + silc_asn1_tag_name(rtag), (int)rtag); if (renc == SILC_BER_ENC_PRIMITIVE) len = len + rdata_len; @@ -190,4 +216,5 @@ SilcBool silc_asn1_dump(SilcAsn1 asn1, SilcBuffer src) return TRUE; } +#endif /* SILC_DEBUG */ #endif /* SILC_DIST_TOOLKIT */