invalid memory reference fix and test case
git-svn-id: https://asn1c.svn.sourceforge.net/svnroot/asn1c/trunk@56 59561ff5-6e30-0410-9f3c-9617f08c8826
diff --git a/skeletons/der_encoder.c b/skeletons/der_encoder.c
index 72a33eb..919350c 100644
--- a/skeletons/der_encoder.c
+++ b/skeletons/der_encoder.c
@@ -43,22 +43,32 @@
ssize_t *lens;
int i;
+ ASN_DEBUG("Writing tags (%s, tm=%d, tc=%d, iskip=%d, tag=%s, mtc=%d)",
+ sd->name, tag_mode, sd->tags_count, sd->tags_impl_skip,
+ ber_tlv_tag_string(tag),
+ tag_mode
+ ?(sd->tags_count+1
+ -((tag_mode==-1)?sd->tags_impl_skip:0))
+ :sd->tags_count
+ );
+
if(tag_mode) {
/*
* Instead of doing shaman dance like we do in ber_check_tags(),
* allocate a small array on the stack
* and initialize it appropriately.
*/
- tags = alloca((sd->tags_count + (tag_mode?1:0))
- * sizeof(ber_tlv_tag_t));
+ int stag_offset;
+ tags = alloca((sd->tags_count + 1) * sizeof(ber_tlv_tag_t));
if(tags == NULL) return -1; /* Impossible on i386 */
tags_count = sd->tags_count
+ 1 /* EXPLICIT or IMPLICIT tag is given */
- ((tag_mode==-1)?sd->tags_impl_skip:0);
/* Copy tags over */
tags[0] = tag;
+ stag_offset = -1 + ((tag_mode==-1)?sd->tags_impl_skip:0);
for(i = 1; i < tags_count; i++)
- tags[i] = sd->tags[i - 1 + sd->tags_impl_skip];
+ tags[i] = sd->tags[i + stag_offset];
} else {
tags = sd->tags;
tags_count = sd->tags_count;