From bbb1e4df1a146f85880b061ab82cb6af5d3fd4e5 Mon Sep 17 00:00:00 2001 From: Pekka Riikonen Date: Tue, 10 Jul 2007 17:19:20 +0000 Subject: [PATCH] Fixed uninit when the stacks has been switched. --- lib/silcasn1/silcasn1.c | 9 ++++++++- lib/silcasn1/silcasn1_decode.c | 1 + lib/silcasn1/silcasn1_i.h | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/silcasn1/silcasn1.c b/lib/silcasn1/silcasn1.c index b80a1c09..ea1408e5 100644 --- a/lib/silcasn1/silcasn1.c +++ b/lib/silcasn1/silcasn1.c @@ -84,8 +84,15 @@ SilcBool silc_asn1_init(SilcAsn1 asn1, SilcStack stack) void silc_asn1_uninit(SilcAsn1 asn1) { + SilcStack stack1 = asn1->stack1; + + if (asn1->switched) { + stack1 = asn1->stack2; + asn1->stack2 = asn1->stack1; + } + silc_stack_free(asn1->stack2); - silc_stack_free(asn1->stack1); + silc_stack_free(stack1); } #if defined(SILC_DEBUG) diff --git a/lib/silcasn1/silcasn1_decode.c b/lib/silcasn1/silcasn1_decode.c index bcdd5e67..883220fd 100644 --- a/lib/silcasn1/silcasn1_decode.c +++ b/lib/silcasn1/silcasn1_decode.c @@ -948,6 +948,7 @@ SilcBool silc_asn1_decode(SilcAsn1 asn1, SilcBuffer src, ...) stack1 = asn1->stack1; asn1->stack1 = asn1->stack2; asn1->stack2 = stack1; + asn1->switched = !asn1->switched; } } diff --git a/lib/silcasn1/silcasn1_i.h b/lib/silcasn1/silcasn1_i.h index 414ec2c9..8dd98752 100644 --- a/lib/silcasn1/silcasn1_i.h +++ b/lib/silcasn1/silcasn1_i.h @@ -31,6 +31,7 @@ struct SilcAsn1Object { SilcStack stack2; /* Internal stack for encoding/decoding */ va_list ap; /* List of ASN.1 types given as argument */ unsigned int accumul : 1; /* Accumulate memory from stack for result */ + unsigned int switched : 1; /* Set when stack2 is set to stack1 */ }; /* The maximum depth for recursion in encoder and decoder. */ -- 2.24.0