From 671eb9ad14cf62e7f30e01d6dcfd5e813b7ddd49 Mon Sep 17 00:00:00 2001 From: Markus Elfring Date: Mon, 14 Mar 2016 17:07:26 +0100 Subject: [PATCH 01/40] Bug #86: Deletion of unnecessary checks before a few calls of asn1c functions The following functions return immediately if a null pointer was passed. * asn1p_constraint_free * asn1p_paramlist_free * asn1p_ref_free * asn1p_value_free * asn1p_wsyntx_free It is therefore not needed that a function caller repeats a corresponding check. This issue was fixed by using the software "Coccinelle 1.0.4". Signed-off-by: Markus Elfring --- libasn1parser/asn1p_constr.c | 12 ++++-------- libasn1parser/asn1p_expr.c | 21 +++++++-------------- libasn1parser/asn1p_param.c | 6 ++---- 3 files changed, 13 insertions(+), 26 deletions(-) diff --git a/libasn1parser/asn1p_constr.c b/libasn1parser/asn1p_constr.c index 0b1e8921..008ad400 100644 --- a/libasn1parser/asn1p_constr.c +++ b/libasn1parser/asn1p_constr.c @@ -23,14 +23,10 @@ void asn1p_constraint_free(asn1p_constraint_t *ct) { if(ct) { - if(ct->containedSubtype) - asn1p_value_free(ct->containedSubtype); - if(ct->value) - asn1p_value_free(ct->value); - if(ct->range_start) - asn1p_value_free(ct->range_start); - if(ct->range_stop) - asn1p_value_free(ct->range_stop); + asn1p_value_free(ct->containedSubtype); + asn1p_value_free(ct->value); + asn1p_value_free(ct->range_start); + asn1p_value_free(ct->range_stop); if(ct->elements) { while(ct->el_count--) { diff --git a/libasn1parser/asn1p_expr.c b/libasn1parser/asn1p_expr.c index b7a03ecb..46e54a3b 100644 --- a/libasn1parser/asn1p_expr.c +++ b/libasn1parser/asn1p_expr.c @@ -246,20 +246,13 @@ asn1p_expr_free(asn1p_expr_t *expr) { } free(expr->Identifier); - if(expr->reference) - asn1p_ref_free(expr->reference); - if(expr->constraints) - asn1p_constraint_free(expr->constraints); - if(expr->combined_constraints) - asn1p_constraint_free(expr->combined_constraints); - if(expr->lhs_params) - asn1p_paramlist_free(expr->lhs_params); - if(expr->value) - asn1p_value_free(expr->value); - if(expr->marker.default_value) - asn1p_value_free(expr->marker.default_value); - if(expr->with_syntax) - asn1p_wsyntx_free(expr->with_syntax); + asn1p_ref_free(expr->reference); + asn1p_constraint_free(expr->constraints); + asn1p_constraint_free(expr->combined_constraints); + asn1p_paramlist_free(expr->lhs_params); + asn1p_value_free(expr->value); + asn1p_value_free(expr->marker.default_value); + asn1p_wsyntx_free(expr->with_syntax); if(expr->data && expr->data_free) expr->data_free(expr->data); diff --git a/libasn1parser/asn1p_param.c b/libasn1parser/asn1p_param.c index 6fd7f216..df6054e7 100644 --- a/libasn1parser/asn1p_param.c +++ b/libasn1parser/asn1p_param.c @@ -27,8 +27,7 @@ asn1p_paramlist_free(asn1p_paramlist_t *pl) { if(pl->params) { int i = pl->params_count; while(i--) { - if(pl->params[i].governor) - asn1p_ref_free(pl->params[i].governor); + asn1p_ref_free(pl->params[i].governor); free(pl->params[i].argument); pl->params[i].governor = 0; pl->params[i].argument = 0; @@ -82,8 +81,7 @@ asn1p_paramlist_add_param(asn1p_paramlist_t *pl, asn1p_ref_t *gov, char *arg) { pl->params_count++; return 0; } else { - if(pl->params[pl->params_count].governor) - asn1p_ref_free(pl->params[pl->params_count].governor); + asn1p_ref_free(pl->params[pl->params_count].governor); return -1; } } From f3d1861b941444d9fb5b52bd7d11b97151adfef0 Mon Sep 17 00:00:00 2001 From: Markus Elfring Date: Tue, 15 Mar 2016 08:35:24 +0100 Subject: [PATCH 02/40] Bug #86: Deletion of unnecessary checks before calls of the function "free" The function "free" is documented in the way that no action shall occur for a passed null pointer. It is therefore not needed that a function caller repeats a corresponding check. http://stackoverflow.com/questions/18775608/free-a-null-pointer-anyway-or-check-first This issue was fixed by using the software "Coccinelle 1.0.4". Signed-off-by: Markus Elfring --- libasn1fix/asn1fix_crange.c | 6 ++---- libasn1fix/asn1fix_tags.c | 2 +- libasn1parser/asn1p_y.c | 10 ++++------ 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/libasn1fix/asn1fix_crange.c b/libasn1fix/asn1fix_crange.c index 311c727c..4c1f3213 100644 --- a/libasn1fix/asn1fix_crange.c +++ b/libasn1fix/asn1fix_crange.c @@ -673,10 +673,8 @@ _range_canonicalize(asn1cnst_range_t *range) { range->right = tmp; } - if(range->elements) { - free(range->elements); - range->elements = 0; - } + free(range->elements); + range->elements = 0; range->el_size = 0; return 0; } diff --git a/libasn1fix/asn1fix_tags.c b/libasn1fix/asn1fix_tags.c index db4d4ed1..d57e37e0 100644 --- a/libasn1fix/asn1fix_tags.c +++ b/libasn1fix/asn1fix_tags.c @@ -166,7 +166,7 @@ asn1f_fetch_tags(asn1p_t *asn, asn1p_module_t *mod, asn1p_expr_t *expr, struct a arg.expr = expr; count = asn1f_fetch_tags_impl(&arg, &tags, 0, 0, flags); - if(count <= 0 && tags) { + if (count <= 0) { free(tags); tags = 0; } diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index e15fc02d..d12a1aa0 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -2318,8 +2318,7 @@ yyreduce: { (yyval.a_oid) = asn1p_oid_new(); asn1p_oid_add_arc((yyval.a_oid), &(yyvsp[(1) - (1)].a_oid_arc)); - if((yyvsp[(1) - (1)].a_oid_arc).name) - free((yyvsp[(1) - (1)].a_oid_arc).name); + free((yyvsp[(1) - (1)].a_oid_arc).name); } break; @@ -2328,8 +2327,7 @@ yyreduce: { (yyval.a_oid) = (yyvsp[(1) - (2)].a_oid); asn1p_oid_add_arc((yyval.a_oid), &(yyvsp[(2) - (2)].a_oid_arc)); - if((yyvsp[(2) - (2)].a_oid_arc).name) - free((yyvsp[(2) - (2)].a_oid_arc).name); + free((yyvsp[(2) - (2)].a_oid_arc).name); } break; @@ -2826,7 +2824,7 @@ yyreduce: ret = asn1p_paramlist_add_param((yyval.a_plist), (yyvsp[(1) - (1)].a_parg).governor, (yyvsp[(1) - (1)].a_parg).argument); checkmem(ret == 0); if((yyvsp[(1) - (1)].a_parg).governor) asn1p_ref_free((yyvsp[(1) - (1)].a_parg).governor); - if((yyvsp[(1) - (1)].a_parg).argument) free((yyvsp[(1) - (1)].a_parg).argument); + free((yyvsp[(1) - (1)].a_parg).argument); } break; @@ -2838,7 +2836,7 @@ yyreduce: ret = asn1p_paramlist_add_param((yyval.a_plist), (yyvsp[(3) - (3)].a_parg).governor, (yyvsp[(3) - (3)].a_parg).argument); checkmem(ret == 0); if((yyvsp[(3) - (3)].a_parg).governor) asn1p_ref_free((yyvsp[(3) - (3)].a_parg).governor); - if((yyvsp[(3) - (3)].a_parg).argument) free((yyvsp[(3) - (3)].a_parg).argument); + free((yyvsp[(3) - (3)].a_parg).argument); } break; From bc6243e653cebe9b50c23fcd46948314bc841d8c Mon Sep 17 00:00:00 2001 From: Alexander Duryagin Date: Fri, 8 Jul 2016 15:51:12 +0300 Subject: [PATCH 03/40] use wide types to decode x509 certificate in examples, solves #47 --- examples/sample.source.PKIX1/Makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/sample.source.PKIX1/Makefile b/examples/sample.source.PKIX1/Makefile index ea68739b..fdff8226 100644 --- a/examples/sample.source.PKIX1/Makefile +++ b/examples/sample.source.PKIX1/Makefile @@ -375,7 +375,7 @@ Certificate.c: ../sample.makefile.regen ../rfc3280-*.asn1 make regen-makefile: - ASN1CMDOPTS="" \ + ASN1CMDOPTS="-fwide-types" \ ASN1MODULES="../rfc3280-*.asn1" \ ASN1PDU=Certificate \ PROGNAME=x509dump \ From b97d65a2b98c60b2784a7967f4d8e1f642d09eab Mon Sep 17 00:00:00 2001 From: Vasil Velichkov Date: Mon, 18 Jul 2016 20:18:11 +0300 Subject: [PATCH 04/40] Fix test execution on RHEL7 The `make check` was failing with make[3]: Entering directory `/home/asn1c/asn1c_github/asn1c/tests' ../../config/test-driver: invalid option: '-C' Usage: test-driver --test-name=NAME --log-file=PATH --trs-file=PATH [--expect-failure={yes|no}] [--color-tests={yes|no}] [--enable-hard-errors={yes|no}] [--] TEST-SCRIPT The '--test-name', '--log-file' and '--trs-file' options are mandatory. make[3]: *** [check-src/check-03.-fwide-types.c.log] Error 2 --- asn1c/tests/check-assembly.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/asn1c/tests/check-assembly.sh b/asn1c/tests/check-assembly.sh index d897f897..22e2b6dd 100755 --- a/asn1c/tests/check-assembly.sh +++ b/asn1c/tests/check-assembly.sh @@ -17,7 +17,7 @@ abs_top_srcdir="${abs_top_srcdir:-$(pwd)/../../}" abs_top_builddir="${abs_top_builddir:-$(pwd)/../../}" if echo "$*" | grep -q -- -- ; then - TEST_DRIVER=$(echo "$*" | sed -e 's/ -- .*/--/g') + TEST_DRIVER=$(echo "$*" | sed -e 's/ -- .*/ -- /g') source_full=$(echo "$*" | sed -e 's/.* //g') else TEST_DRIVER="" From febd3d5a02e5a1bccc31cbba983641d71d084aa2 Mon Sep 17 00:00:00 2001 From: Vasil Velichkov Date: Mon, 18 Jul 2016 20:24:49 +0300 Subject: [PATCH 05/40] Fix segmentation fault in asn1c_make_identifier See also http://stackoverflow.com/questions/25390720/va-arg-gives-something-strange-in-cygwin-x64 Program received signal SIGSEGV, Segmentation fault. (gdb) bt #0 0x00007ffff7b7c8f1 in __strlen_sse2_pminub () from /lib64/libc.so.6 #1 0x0000000000425d29 in asn1c_make_identifier (flags=flags@entry=(AMI_MASK_ONLY_SPACES | AMI_NODELIMITER), expr=expr@entry=0x0) at asn1c_misc.c:73 #2 0x00000000004263ec in asn1c_type_name (arg=arg@entry=0x7fffffffe000, expr=expr@entry=0x6757c0, _format=, _format@entry=TNF_INCLUDE) at asn1c_misc.c:268 #3 0x00000000004226fc in asn1c_lang_C_type_SIMPLE_TYPE (arg=arg@entry=0x7fffffffe000) at asn1c_C.c:1119 #4 0x00000000004232c1 in asn1c_lang_C_type_common_INTEGER (arg=0x7fffffffe000) at asn1c_C.c:251 #5 0x0000000000419c75 in asn1c_compile_expr (arg=arg@entry=0x7fffffffe000) at asn1compiler.c:100 #6 0x0000000000419f33 in asn1_compile (asn=asn@entry=0x671e10, datadir=datadir@entry=0x426730 "/home/vasko/usr/share/asn1c", flags=flags@entry=A1C_NO_C99, argc=2, optc=0, argv=0x7fffffffe268) at asn1compiler.c:44 #7 0x0000000000401f13 in main (ac=1, av=0x7fffffffe270) at asn1c.c:328 --- libasn1compiler/asn1c_misc.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libasn1compiler/asn1c_misc.c b/libasn1compiler/asn1c_misc.c index 0762850a..90c669ad 100644 --- a/libasn1compiler/asn1c_misc.c +++ b/libasn1compiler/asn1c_misc.c @@ -263,7 +263,7 @@ asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format) { switch(_format) { case TNF_UNMODIFIED: return asn1c_make_identifier(AMI_MASK_ONLY_SPACES, - 0, exprid ? exprid->Identifier : typename, 0); + 0, exprid ? exprid->Identifier : typename, (char*)0); case TNF_INCLUDE: return asn1c_make_identifier( AMI_MASK_ONLY_SPACES | AMI_NODELIMITER, @@ -271,15 +271,15 @@ asn1c_type_name(arg_t *arg, asn1p_expr_t *expr, enum tnfmt _format) { ? "\"" : "<"), exprid ? exprid->Identifier : typename, ((!stdname || (arg->flags & A1C_INCLUDES_QUOTED)) - ? ".h\"" : ".h>"), 0); + ? ".h\"" : ".h>"), (char*)0); case TNF_SAFE: - return asn1c_make_identifier(0, exprid, typename, 0); + return asn1c_make_identifier(0, exprid, typename, (char*)0); case TNF_CTYPE: /* C type */ return asn1c_make_identifier(0, exprid, - exprid?"t":typename, exprid?0:"t", 0); + exprid?"t":typename, exprid?0:"t", (char*)0); case TNF_RSAFE: /* Recursion-safe type */ return asn1c_make_identifier(AMI_CHECK_RESERVED, 0, - "struct", " ", typename, 0); + "struct", " ", typename, (char*)0); } assert(!"unreachable"); From 34ee7fbed91d891e8a6fd566b3347d8f703e919e Mon Sep 17 00:00:00 2001 From: theirix Date: Sat, 30 Jul 2016 17:23:32 +0300 Subject: [PATCH 06/40] Fixed a mistype in man --- doc/man/enber.1 | 2 +- doc/man/enber.man.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/man/enber.1 b/doc/man/enber.1 index 827c211b..6566398f 100644 --- a/doc/man/enber.1 +++ b/doc/man/enber.1 @@ -39,7 +39,7 @@ is treated as a beginning of a comment line, which is ignored completely. Empty lines are ignored as well. .PP -The following example \f[C]enber\f[](1) input demostrates the use of +The following example \f[C]enber\f[](1) input demonstrates the use of comments: .PP diff --git a/doc/man/enber.man.md b/doc/man/enber.man.md index 2bdb0369..a6084ea0 100644 --- a/doc/man/enber.man.md +++ b/doc/man/enber.man.md @@ -36,7 +36,7 @@ In particular, the XML style comments are not supported. A hash "**#**" or two dashes "**--**" following a whitespace is treated as a beginning of a comment line, which is ignored completely. Empty lines are ignored as well. -The following example `enber`(1) input demostrates the use of comments: +The following example `enber`(1) input demonstrates the use of comments: | \ | \ From b577d4d8817ddf5869aad9c3eac68f68750db50c Mon Sep 17 00:00:00 2001 From: theirix Date: Sat, 30 Jul 2016 17:14:59 +0300 Subject: [PATCH 07/40] Locate AR using standard macro - Use AM_PROG_AR to locate AR (debian complains about AC_PATH_PROG) - Added a fallback for automake < 1.12 - Moved LT_INIT because it depends on AM_* macro --- configure.ac | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 64a37a9c..8f345821 100644 --- a/configure.ac +++ b/configure.ac @@ -5,8 +5,6 @@ AC_CONFIG_HEADER([config.h]) AM_INIT_AUTOMAKE([foreign]) AC_CONFIG_MACRO_DIR([m4]) -LT_INIT - dnl Checks for programs. AC_PROG_CC AC_PROG_CPP @@ -15,7 +13,12 @@ AC_PROG_LN_S AC_PROG_MAKE_SET AC_PROG_YACC AM_PROG_LEX -AC_PATH_PROG(AR, ar, ar, $PATH:/usr/ucb:/usr/ccs/bin) dnl for Solaris +dnl locate ar using standard macro (old automake 1.11 does not know about AM_PROG_AR) +m4_ifdef([AM_PROG_AR], + [AM_PROG_AR], + [AC_PATH_PROG(AR, ar, ar, $PATH:/usr/ucb:/usr/ccs/bin)]) + +LT_INIT dnl If you need to see the details, just run make V=1. m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) From 11a3d68be5c928f96e7cde312709fcdd794cc54c Mon Sep 17 00:00:00 2001 From: Ozbolt Menegatti Date: Mon, 24 Oct 2016 15:22:57 +0200 Subject: [PATCH 08/40] Refreshing reserved keywords --- libasn1compiler/asn1c_misc.c | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/libasn1compiler/asn1c_misc.c b/libasn1compiler/asn1c_misc.c index 0762850a..a60553b8 100644 --- a/libasn1compiler/asn1c_misc.c +++ b/libasn1compiler/asn1c_misc.c @@ -5,24 +5,28 @@ #include /* other exportable stuff from libasn1fix */ /* - * Checks that the given string is not a reserved C/C++ keyword. - * ISO/IEC 9899:1999 (C99), A.1.2 + * Checks that the given string is not a reserved C/C++ keyword [1],[2]. + * _* keywords not included, since asn1 identifiers cannot begin with hyphen [3] + * [1] ISO/IEC 9899:2011 (C11), 6.4.1 + * [2] ISO/IEC 14882:2014 (C++14), 2.12 + * [3] ISO/IEC 8824-1:2003 (asn1) 11.3 */ static char *res_kwd[] = { - "auto", "break", "case", "char", "const", "continue", "default", - "do", "double", "else", "enum", "extern", "float", "for", "goto", - "if", "inline", "int", "long", "register", "restrict", "return", - "short", "signed", "sizeof", "static", "struct", "switch", "typedef", - "union", "unsigned", "void", "volatile", "while", - "_Bool", "_Complex", "_Imaginary", - /* C++ */ - "class", "explicit", "bool", "mutable", - "template", "typeid", "typename", "and", "and_eq", - "or", "or_eq", "xor", "xor_eq", "not", "not_eq", - "bitor", "compl", "bitand", - "const_cast", "dynamic_cast", "reinterpret_cast", - "static_cast", "true", "false", "namespace", "using", - "throw", "try", "catch" + /* C */ + "auto", "break", "case", "char", "const", "continue", "default", "do", + "double", "else", "enum", "extern", "float", "for", "goto", "if", + "inline", "int", "long", "register", "restrict", "return", "short", + "signed", "sizeof", "static", "struct", "switch", "typedef", "union", + "unsigned", "void", "volatile", "while", + /* C++ */ + "alignas", "alignof", "and", "and_eq", "asm", "bitand", "bitor", "bool", + "catch", "char16_t", "char32_t", "class", "compl", "const_cast", + "constexpr", "decltype", "delete", "delete", "dynamic_cast", + "explicit", "export", "false", "friend", "mutable", "namespace", "new", + "noexcept", "not", "not_eq", "nullptr", "operator", "or", "or_eq", + "private", "protected", "public", "reinterpret_cast", "static_assert", + "static_cast", "template", "this", "thread_local", "throw", "true", "try", + "typeid", "typename", "using", "virtual", "wchar_t", "xor", "xor_eq" }; static int reserved_keyword(const char *str) { From 419ac3a6ce7e78f33303361ff1fa76b16f788c21 Mon Sep 17 00:00:00 2001 From: "Bi-Ruei, Chiu" Date: Sat, 14 May 2016 15:27:19 +0800 Subject: [PATCH 09/40] Unify the naming of asn_OCTET_STRING_specifics_t with code-generated '_specifics_t' variables to have 'asn_SPC_' prefix instead of 'asn_DEF_' prefix. --- skeletons/ANY.c | 4 ++-- skeletons/BIT_STRING.c | 4 ++-- skeletons/BMPString.c | 4 ++-- skeletons/OCTET_STRING.c | 18 +++++++++--------- skeletons/UniversalString.c | 4 ++-- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/skeletons/ANY.c b/skeletons/ANY.c index 77024bdc..055138dc 100644 --- a/skeletons/ANY.c +++ b/skeletons/ANY.c @@ -6,7 +6,7 @@ #include #include -static asn_OCTET_STRING_specifics_t asn_DEF_ANY_specs = { +static asn_OCTET_STRING_specifics_t asn_SPC_ANY_specs = { sizeof(ANY_t), offsetof(ANY_t, _asn_ctx), ASN_OSUBV_ANY @@ -26,7 +26,7 @@ asn_TYPE_descriptor_t asn_DEF_ANY = { 0, 0, 0, 0, 0, /* No PER visible constraints */ 0, 0, /* No members */ - &asn_DEF_ANY_specs, + &asn_SPC_ANY_specs, }; diff --git a/skeletons/BIT_STRING.c b/skeletons/BIT_STRING.c index 997ff416..7b8e9751 100644 --- a/skeletons/BIT_STRING.c +++ b/skeletons/BIT_STRING.c @@ -12,7 +12,7 @@ static const ber_tlv_tag_t asn_DEF_BIT_STRING_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (3 << 2)) }; -static asn_OCTET_STRING_specifics_t asn_DEF_BIT_STRING_specs = { +static asn_OCTET_STRING_specifics_t asn_SPC_BIT_STRING_specs = { sizeof(BIT_STRING_t), offsetof(BIT_STRING_t, _asn_ctx), ASN_OSUBV_BIT @@ -38,7 +38,7 @@ asn_TYPE_descriptor_t asn_DEF_BIT_STRING = { / sizeof(asn_DEF_BIT_STRING_tags[0]), 0, /* No PER visible constraints */ 0, 0, /* No members */ - &asn_DEF_BIT_STRING_specs + &asn_SPC_BIT_STRING_specs }; /* diff --git a/skeletons/BMPString.c b/skeletons/BMPString.c index 8beaabda..b6348c11 100644 --- a/skeletons/BMPString.c +++ b/skeletons/BMPString.c @@ -13,7 +13,7 @@ static const ber_tlv_tag_t asn_DEF_BMPString_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (30 << 2)), /* [UNIVERSAL 30] IMPLICIT ...*/ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; -static asn_OCTET_STRING_specifics_t asn_DEF_BMPString_specs = { +static asn_OCTET_STRING_specifics_t asn_SPC_BMPString_specs = { sizeof(BMPString_t), offsetof(BMPString_t, _asn_ctx), ASN_OSUBV_U16 /* 16-bits character */ @@ -44,7 +44,7 @@ asn_TYPE_descriptor_t asn_DEF_BMPString = { / sizeof(asn_DEF_BMPString_tags[0]), &asn_DEF_BMPString_constraints, 0, 0, /* No members */ - &asn_DEF_BMPString_specs + &asn_SPC_BMPString_specs }; /* diff --git a/skeletons/OCTET_STRING.c b/skeletons/OCTET_STRING.c index 5420dede..ed6e59a6 100644 --- a/skeletons/OCTET_STRING.c +++ b/skeletons/OCTET_STRING.c @@ -14,7 +14,7 @@ static const ber_tlv_tag_t asn_DEF_OCTET_STRING_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) }; -static const asn_OCTET_STRING_specifics_t asn_DEF_OCTET_STRING_specs = { +static const asn_OCTET_STRING_specifics_t asn_SPC_OCTET_STRING_specs = { sizeof(OCTET_STRING_t), offsetof(OCTET_STRING_t, _asn_ctx), ASN_OSUBV_STR @@ -45,7 +45,7 @@ asn_TYPE_descriptor_t asn_DEF_OCTET_STRING = { / sizeof(asn_DEF_OCTET_STRING_tags[0]), 0, /* No PER visible constraints */ 0, 0, /* No members */ - &asn_DEF_OCTET_STRING_specs + &asn_SPC_OCTET_STRING_specs }; #undef _CH_PHASE @@ -170,7 +170,7 @@ OCTET_STRING_decode_ber(asn_codec_ctx_t *opt_codec_ctx, void **sptr, const void *buf_ptr, size_t size, int tag_mode) { asn_OCTET_STRING_specifics_t *specs = td->specifics ? (asn_OCTET_STRING_specifics_t *)td->specifics - : &asn_DEF_OCTET_STRING_specs; + : &asn_SPC_OCTET_STRING_specs; BIT_STRING_t *st = (BIT_STRING_t *)*sptr; asn_dec_rval_t rval; asn_struct_ctx_t *ctx; @@ -519,7 +519,7 @@ OCTET_STRING_encode_der(asn_TYPE_descriptor_t *td, void *sptr, asn_enc_rval_t er; asn_OCTET_STRING_specifics_t *specs = td->specifics ? (asn_OCTET_STRING_specifics_t *)td->specifics - : &asn_DEF_OCTET_STRING_specs; + : &asn_SPC_OCTET_STRING_specs; BIT_STRING_t *st = (BIT_STRING_t *)sptr; enum asn_OS_Subvariant type_variant = specs->subvariant; int fix_last_byte = 0; @@ -1112,7 +1112,7 @@ OCTET_STRING__decode_xer(asn_codec_ctx_t *opt_codec_ctx, OCTET_STRING_t *st = (OCTET_STRING_t *)*sptr; asn_OCTET_STRING_specifics_t *specs = td->specifics ? (asn_OCTET_STRING_specifics_t *)td->specifics - : &asn_DEF_OCTET_STRING_specs; + : &asn_SPC_OCTET_STRING_specs; const char *xml_tag = opt_mname ? opt_mname : td->xml_tag; asn_struct_ctx_t *ctx; /* Per-structure parser context */ asn_dec_rval_t rval; /* Return value from the decoder */ @@ -1327,7 +1327,7 @@ OCTET_STRING_decode_uper(asn_codec_ctx_t *opt_codec_ctx, asn_OCTET_STRING_specifics_t *specs = td->specifics ? (asn_OCTET_STRING_specifics_t *)td->specifics - : &asn_DEF_OCTET_STRING_specs; + : &asn_SPC_OCTET_STRING_specs; asn_per_constraints_t *pc = constraints ? constraints : td->per_constraints; asn_per_constraint_t *cval; @@ -1498,7 +1498,7 @@ OCTET_STRING_encode_uper(asn_TYPE_descriptor_t *td, asn_OCTET_STRING_specifics_t *specs = td->specifics ? (asn_OCTET_STRING_specifics_t *)td->specifics - : &asn_DEF_OCTET_STRING_specs; + : &asn_SPC_OCTET_STRING_specs; asn_per_constraints_t *pc = constraints ? constraints : td->per_constraints; asn_per_constraint_t *cval; @@ -1721,7 +1721,7 @@ OCTET_STRING_free(asn_TYPE_descriptor_t *td, void *sptr, int contents_only) { specs = td->specifics ? (asn_OCTET_STRING_specifics_t *)td->specifics - : &asn_DEF_OCTET_STRING_specs; + : &asn_SPC_OCTET_STRING_specs; ctx = (asn_struct_ctx_t *)((char *)st + specs->ctx_offset); ASN_DEBUG("Freeing %s as OCTET STRING", td->name); @@ -1793,7 +1793,7 @@ OCTET_STRING_t * OCTET_STRING_new_fromBuf(asn_TYPE_descriptor_t *td, const char *str, int len) { asn_OCTET_STRING_specifics_t *specs = td->specifics ? (asn_OCTET_STRING_specifics_t *)td->specifics - : &asn_DEF_OCTET_STRING_specs; + : &asn_SPC_OCTET_STRING_specs; OCTET_STRING_t *st; st = (OCTET_STRING_t *)CALLOC(1, specs->struct_size); diff --git a/skeletons/UniversalString.c b/skeletons/UniversalString.c index 21753eb4..6e9d0c33 100644 --- a/skeletons/UniversalString.c +++ b/skeletons/UniversalString.c @@ -13,7 +13,7 @@ static const ber_tlv_tag_t asn_DEF_UniversalString_tags[] = { (ASN_TAG_CLASS_UNIVERSAL | (28 << 2)), /* [UNIVERSAL 28] IMPLICIT ...*/ (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)) /* ... OCTET STRING */ }; -static asn_OCTET_STRING_specifics_t asn_DEF_UniversalString_specs = { +static asn_OCTET_STRING_specifics_t asn_SPC_UniversalString_specs = { sizeof(UniversalString_t), offsetof(UniversalString_t, _asn_ctx), ASN_OSUBV_U32 /* 32-bits character */ @@ -44,7 +44,7 @@ asn_TYPE_descriptor_t asn_DEF_UniversalString = { / sizeof(asn_DEF_UniversalString_tags[0]), &asn_DEF_UniversalString_constraints, 0, 0, /* No members */ - &asn_DEF_UniversalString_specs + &asn_SPC_UniversalString_specs }; From 8723dc73378380b398784af161744fe7db9eb91b Mon Sep 17 00:00:00 2001 From: Erika Thorsen Date: Mon, 14 Nov 2016 07:54:43 +0100 Subject: [PATCH 10/40] Removed __attribute__ since its not Windows compliant --- skeletons/asn_internal.h | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/skeletons/asn_internal.h b/skeletons/asn_internal.h index 9c94ca6c..9baa1115 100644 --- a/skeletons/asn_internal.h +++ b/skeletons/asn_internal.h @@ -103,8 +103,7 @@ static void ASN_DEBUG(const char *fmt, ...) { (void)fmt; } * Check stack against overflow, if limit is set. */ #define ASN__DEFAULT_STACK_MAX (30000) -static int __attribute__((unused)) -ASN__STACK_OVERFLOW_CHECK(asn_codec_ctx_t *ctx) { +static int ASN__STACK_OVERFLOW_CHECK(asn_codec_ctx_t *ctx) { if(ctx && ctx->max_stack_size) { /* ctx MUST be allocated on the stack */ From afea72f494144f0b9fa1e64a4e895a862d604eec Mon Sep 17 00:00:00 2001 From: Erika Thorsen Date: Mon, 14 Nov 2016 07:55:19 +0100 Subject: [PATCH 11/40] Include stdint.h instead of typedef types if Visual Studio 2010 or newer. --- skeletons/asn_system.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/skeletons/asn_system.h b/skeletons/asn_system.h index d19837ed..5bf02c28 100644 --- a/skeletons/asn_system.h +++ b/skeletons/asn_system.h @@ -47,12 +47,16 @@ #endif #ifndef ASSUMESTDTYPES /* Standard types have been defined elsewhere */ #define ssize_t SSIZE_T +#if _MSC_VER < 1600 typedef char int8_t; typedef short int16_t; typedef int int32_t; typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; +#else /* _MSC_VER >= 1600 */ +#include +#endif /* _MSC_VER < 1600 */ #endif /* ASSUMESTDTYPES */ #define WIN32_LEAN_AND_MEAN #include From 385cbe03d6179fc337585ff6ecdd5d05746610f6 Mon Sep 17 00:00:00 2001 From: "Bi-Ruei, Chiu" Date: Sat, 14 May 2016 15:49:20 +0800 Subject: [PATCH 12/40] Solve "make check-per" failed on Lubuntu --- examples/sample.makefile.regen | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/sample.makefile.regen b/examples/sample.makefile.regen index 50551b29..66bec0a5 100755 --- a/examples/sample.makefile.regen +++ b/examples/sample.makefile.regen @@ -113,7 +113,7 @@ set +x echo ' done; done; fi' echo " @if test -f sample-${ASN1PDU}-1.per ; then \\" echo " for f in sample-*-[1-9].per; do \\" - echo ' pdu=`echo $$f | sed -E -e "s/sample-([A-Za-z-]+)-[0-9].*/\1/"`; \' + echo ' pdu=`echo $$f | sed -E -e "s/sample-([A-Za-z-]+)-[0-9].*/\\1/"`; \' echo ' for b in 1 17 33 980 8192; do \' echo ' echo "Recoding $$f into DER into XER and back ($$b)..."; \' echo ' ./${TARGET} -b $$b -p $$pdu -iper -oder $$f > ./.tmp.1.$$$$ || exit 3; \' From 2aa10de1a810139b9f6061c9fb5868639add10b2 Mon Sep 17 00:00:00 2001 From: Erika Thorsen Date: Mon, 28 Nov 2016 08:35:08 +0100 Subject: [PATCH 13/40] Only remove __attributes__ in Windows builds --- skeletons/asn_internal.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/skeletons/asn_internal.h b/skeletons/asn_internal.h index 9baa1115..ae74465e 100644 --- a/skeletons/asn_internal.h +++ b/skeletons/asn_internal.h @@ -103,7 +103,12 @@ static void ASN_DEBUG(const char *fmt, ...) { (void)fmt; } * Check stack against overflow, if limit is set. */ #define ASN__DEFAULT_STACK_MAX (30000) -static int ASN__STACK_OVERFLOW_CHECK(asn_codec_ctx_t *ctx) { +#ifdef _WIN32 +static int +#else +static int __attribute__((unused)) +#endif +ASN__STACK_OVERFLOW_CHECK(asn_codec_ctx_t *ctx) { if(ctx && ctx->max_stack_size) { /* ctx MUST be allocated on the stack */ From 9b87e5b095ef898c922ebd3cbd6000c79158408f Mon Sep 17 00:00:00 2001 From: "Bi-Ruei, Chiu" Date: Mon, 6 Jun 2016 00:23:16 +0800 Subject: [PATCH 14/40] Fix 'declaration inside parameter list' warning 1. Add forward definition section. 2. Move type definition inside A_SEQUENCE_OF() to forward definition section. 3. Modify asn1c_lang_C_type_CHOICE() ...etc functions to achieve it. 4. Modify test cases used during 'make check'. --- libasn1compiler/asn1c_C.c | 152 ++++++++++++++---- libasn1compiler/asn1c_out.c | 5 + libasn1compiler/asn1c_out.h | 9 +- libasn1compiler/asn1c_save.c | 3 +- tests/31-set-of-OK.asn1.-Pfwide-types | 24 +-- tests/72-same-names-OK.asn1.-Pfwide-types | 18 ++- ...-circular-loops-OK.asn1.-Pfindirect-choice | 32 ++-- tests/92-circular-loops-OK.asn1.-Pfwide-types | 32 ++-- 8 files changed, 193 insertions(+), 82 deletions(-) diff --git a/libasn1compiler/asn1c_C.c b/libasn1compiler/asn1c_C.c index b4cd736c..d1fc1abc 100644 --- a/libasn1compiler/asn1c_C.c +++ b/libasn1compiler/asn1c_C.c @@ -120,6 +120,7 @@ asn1c_lang_C_type_common_INTEGER(arg_t *arg) { struct value2enum *v2e; int map_extensions = (expr->expr_type == ASN_BASIC_INTEGER); int eidx; + int saved_target = arg->target->target; v2e = alloca((el_count + 1) * sizeof(*v2e)); @@ -248,6 +249,8 @@ asn1c_lang_C_type_common_INTEGER(arg_t *arg) { OUT("};\n"); } + REDIR(saved_target); + return asn1c_lang_C_type_SIMPLE_TYPE(arg); } @@ -256,6 +259,7 @@ asn1c_lang_C_type_BIT_STRING(arg_t *arg) { asn1p_expr_t *expr = arg->expr; asn1p_expr_t *v; int el_count = expr_elements_count(arg, expr); + int saved_target = arg->target->target; if(el_count) { int eidx = 0; @@ -283,6 +287,8 @@ asn1c_lang_C_type_BIT_STRING(arg_t *arg) { assert(eidx == el_count); } + REDIR(saved_target); + return asn1c_lang_C_type_SIMPLE_TYPE(arg); } @@ -291,14 +297,23 @@ asn1c_lang_C_type_SEQUENCE(arg_t *arg) { asn1p_expr_t *expr = arg->expr; asn1p_expr_t *v; int comp_mode = 0; /* {root,ext=1,root,root,...} */ + int saved_target = arg->target->target; DEPENDENCIES; if(arg->embed) { + + /* Use _anonymous_type field to indicate it's called from + * asn1c_lang_C_type_SEx_OF() */ + if (expr->_anonymous_type) { + REDIR(OT_FWD_DEFS); + OUT("typedef "); + } OUT("struct "); out_name_chain(arg, ONC_avoid_keywords); OUT(" {\n"); } else { + REDIR(OT_TYPE_DECLS); OUT("typedef struct %s {\n", MKID_safe(expr)); } @@ -313,12 +328,24 @@ asn1c_lang_C_type_SEQUENCE(arg_t *arg) { } PCTX_DEF; - OUT("} %s%s%s", (expr->marker.flags & EM_INDIRECT)?"*":"", + + if (arg->embed && expr->_anonymous_type) { + OUT("} %s", (expr->marker.flags & EM_INDIRECT)?"*":""); + out_name_chain(arg, ONC_avoid_keywords); + OUT("%s;\n", arg->embed ? "" : "_t"); + + REDIR(saved_target); + + OUT("%s", (expr->marker.flags & EM_INDIRECT)?"*":""); + out_name_chain(arg, ONC_avoid_keywords); + } else { + OUT("} %s%s%s", (expr->marker.flags & EM_INDIRECT)?"*":"", expr->_anonymous_type ? "" : arg->embed ? MKID_safe(expr) : MKID(expr), arg->embed ? "" : "_t"); + } return asn1c_lang_C_type_SEQUENCE_def(arg); } @@ -337,6 +364,7 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { enum tvm_compat tv_mode; int roms_count; /* Root optional members */ int aoms_count; /* Additions optional members */ + int saved_target = arg->target->target; /* * Fetch every inner tag from the tag to elements map. @@ -477,7 +505,7 @@ asn1c_lang_C_type_SEQUENCE_def(arg_t *arg) { emit_type_DEF(arg, expr, tv_mode, tags_count, all_tags_count, elements, ETD_HAS_SPECIFICS); - REDIR(OT_TYPE_DECLS); + REDIR(saved_target); return 0; } /* _SEQUENCE_def() */ @@ -489,6 +517,7 @@ asn1c_lang_C_type_SET(arg_t *arg) { long mcount; char *id; int comp_mode = 0; /* {root,ext=1,root,root,...} */ + int saved_target = arg->target->target; DEPENDENCIES; @@ -515,13 +544,18 @@ asn1c_lang_C_type_SET(arg_t *arg) { } OUT("} "); out_name_chain(arg, ONC_noflags); OUT("_PR;\n"); - REDIR(OT_TYPE_DECLS); + REDIR(saved_target); if(arg->embed) { + if (expr->_anonymous_type) { + REDIR(OT_FWD_DEFS); + OUT("typedef "); + } OUT("struct "); out_name_chain(arg, ONC_avoid_keywords); OUT(" {\n"); } else { + REDIR(OT_TYPE_DECLS); OUT("typedef struct %s {\n", MKID_safe(expr)); } @@ -545,9 +579,21 @@ asn1c_lang_C_type_SET(arg_t *arg) { ); PCTX_DEF; - OUT("} %s%s%s", (expr->marker.flags & EM_INDIRECT)?"*":"", - expr->_anonymous_type ? "" : MKID_safe(expr), - arg->embed ? "" : "_t"); + + if (arg->embed && expr->_anonymous_type) { + OUT("} %s", (expr->marker.flags & EM_INDIRECT)?"*":""); + out_name_chain(arg, ONC_avoid_keywords); + OUT("%s;\n", arg->embed ? "" : "_t"); + + REDIR(saved_target); + + OUT("%s", (expr->marker.flags & EM_INDIRECT)?"*":""); + out_name_chain(arg, ONC_avoid_keywords); + } else { + OUT("} %s%s%s", (expr->marker.flags & EM_INDIRECT)?"*":"", + expr->_anonymous_type ? "" : MKID_safe(expr), + arg->embed ? "" : "_t"); + } return asn1c_lang_C_type_SET_def(arg); } @@ -565,6 +611,7 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { int all_tags_count; enum tvm_compat tv_mode; char *p; + int saved_target = arg->target->target; /* * Fetch every inner tag from the tag to elements map. @@ -598,7 +645,7 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { OUT("static asn_TYPE_member_t asn_MBR_%s_%d[] = {\n", MKID(expr), expr->_type_unique_index); - + elements = 0; INDENTED(TQ_FOR(v, &(expr->members), next) { if(v->expr_type == A1TC_EXTENSIBLE) { @@ -692,7 +739,7 @@ asn1c_lang_C_type_SET_def(arg_t *arg) { emit_type_DEF(arg, expr, tv_mode, tags_count, all_tags_count, elements, ETD_HAS_SPECIFICS); - REDIR(OT_TYPE_DECLS); + REDIR(saved_target); return 0; } /* _SET_def() */ @@ -701,10 +748,15 @@ int asn1c_lang_C_type_SEx_OF(arg_t *arg) { asn1p_expr_t *expr = arg->expr; asn1p_expr_t *memb = TQ_FIRST(&expr->members); + int saved_target = arg->target->target; DEPENDENCIES; if(arg->embed) { + if (expr->_anonymous_type) { + REDIR(OT_FWD_DEFS); + OUT("typedef "); + } OUT("struct "); out_name_chain(arg, ONC_avoid_keywords); OUT(" {\n"); @@ -748,7 +800,8 @@ asn1c_lang_C_type_SEx_OF(arg_t *arg) { if(tmp_memb.Identifier != memb->Identifier) if(0) free(tmp_memb.Identifier); arg->embed--; - assert(arg->target->target == OT_TYPE_DECLS); + assert(arg->target->target == OT_TYPE_DECLS || + arg->target->target == OT_FWD_DEFS); } else { OUT("%s", asn1c_type_name(arg, memb, (memb->marker.flags & EM_UNRECURSE) @@ -761,9 +814,21 @@ asn1c_lang_C_type_SEx_OF(arg_t *arg) { INDENT(-1); PCTX_DEF; - OUT("} %s%s%s", (expr->marker.flags & EM_INDIRECT)?"*":"", - expr->_anonymous_type ? "" : MKID_safe(expr), - arg->embed ? "" : "_t"); + + if (arg->embed && expr->_anonymous_type) { + OUT("} %s", (expr->marker.flags & EM_INDIRECT)?"*":""); + out_name_chain(arg, ONC_avoid_keywords); + OUT("%s;\n", arg->embed ? "" : "_t"); + + REDIR(saved_target); + + OUT("%s", (expr->marker.flags & EM_INDIRECT)?"*":""); + out_name_chain(arg, ONC_avoid_keywords); + } else { + OUT("} %s%s%s", (expr->marker.flags & EM_INDIRECT)?"*":"", + expr->_anonymous_type ? "" : MKID_safe(expr), + arg->embed ? "" : "_t"); + } /* * SET OF/SEQUENCE OF definition @@ -779,6 +844,7 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { int tags_count; int all_tags_count; enum tvm_compat tv_mode; + int saved_target = arg->target->target; /* * Print out the table according to which parsing is performed. @@ -840,7 +906,7 @@ asn1c_lang_C_type_SEx_OF_def(arg_t *arg, int seq_of) { emit_type_DEF(arg, expr, tv_mode, tags_count, all_tags_count, 1, ETD_HAS_SPECIFICS); - REDIR(OT_TYPE_DECLS); + REDIR(saved_target); return 0; } /* _SEx_OF_def() */ @@ -850,6 +916,7 @@ asn1c_lang_C_type_CHOICE(arg_t *arg) { asn1p_expr_t *expr = arg->expr; asn1p_expr_t *v; char *id; + int saved_target = arg->target->target; DEPENDENCIES; @@ -878,11 +945,16 @@ asn1c_lang_C_type_CHOICE(arg_t *arg) { ); OUT("} "); out_name_chain(arg, ONC_noflags); OUT("_PR;\n"); - REDIR(OT_TYPE_DECLS); + REDIR(saved_target); if(arg->embed) { + if (expr->_anonymous_type) { + REDIR(OT_FWD_DEFS); + OUT("typedef "); + } OUT("struct "); out_name_chain(arg, ONC_avoid_keywords); OUT(" {\n"); } else { + REDIR(OT_TYPE_DECLS); OUT("typedef struct %s {\n", MKID_safe(expr)); } @@ -903,12 +975,24 @@ asn1c_lang_C_type_CHOICE(arg_t *arg) { ); PCTX_DEF; - OUT("} %s%s%s", (expr->marker.flags & EM_INDIRECT)?"*":"", - expr->_anonymous_type ? "" : - arg->embed - ? MKID_safe(expr) - : MKID(expr), - arg->embed ? "" : "_t"); + + if (arg->embed && expr->_anonymous_type) { + OUT("} %s", (expr->marker.flags & EM_INDIRECT)?"*":""); + out_name_chain(arg, ONC_avoid_keywords); + OUT("%s;\n", arg->embed ? "" : "_t"); + + REDIR(saved_target); + + OUT("%s", (expr->marker.flags & EM_INDIRECT)?"*":""); + out_name_chain(arg, ONC_avoid_keywords); + } else { + OUT("} %s%s%s", (expr->marker.flags & EM_INDIRECT)?"*":"", + expr->_anonymous_type ? "" : + arg->embed + ? MKID_safe(expr) + : MKID(expr), + arg->embed ? "" : "_t"); + } return asn1c_lang_C_type_CHOICE_def(arg); } @@ -924,6 +1008,7 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { int all_tags_count; enum tvm_compat tv_mode; int *cmap = 0; + int saved_target = arg->target->target; /* * Fetch every inner tag from the tag to elements map. @@ -1026,7 +1111,7 @@ asn1c_lang_C_type_CHOICE_def(arg_t *arg) { emit_type_DEF(arg, expr, tv_mode, tags_count, all_tags_count, elements, ETD_HAS_SPECIFICS); - REDIR(OT_TYPE_DECLS); + REDIR(saved_target); return 0; } /* _CHOICE_def() */ @@ -1081,6 +1166,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { enum tvm_compat tv_mode; enum etd_spec etd_spec; char *p; + int saved_target = arg->target->target; if(arg->embed) { enum tnfmt tnfmt = TNF_CTYPE; @@ -1093,13 +1179,15 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { if(expr->marker.flags & (EM_INDIRECT | EM_UNRECURSE)) { if(terminal_structable(arg, expr)) { tnfmt = TNF_RSAFE; - REDIR(OT_FWD_DECLS); - OUT("%s;\n", - asn1c_type_name(arg, arg->expr, tnfmt)); + if(saved_target != OT_FWD_DECLS) { + REDIR(OT_FWD_DECLS); + OUT("%s;\n", + asn1c_type_name(arg, arg->expr, tnfmt)); + } + REDIR(saved_target); } } - REDIR(OT_TYPE_DECLS); OUT("%s", asn1c_type_name(arg, arg->expr, tnfmt)); if(!expr->_anonymous_type) { @@ -1143,7 +1231,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { * Type1 ::= Type2 */ if(arg->embed && etd_spec == ETD_NO_SPECIFICS) { - REDIR(OT_TYPE_DECLS); + REDIR(saved_target); return 0; } if((!expr->constraints || (arg->flags & A1C_NO_CONSTRAINTS)) @@ -1165,7 +1253,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { REDIR(OT_CODE); OUT("/* This type is equivalent to %s */\n", type_name); OUT("\n"); - REDIR(OT_TYPE_DECLS); + REDIR(saved_target); return 0; } @@ -1418,7 +1506,7 @@ asn1c_lang_C_type_SIMPLE_TYPE(arg_t *arg) { } } - REDIR(OT_TYPE_DECLS); + REDIR(saved_target); return 0; } @@ -2620,9 +2708,11 @@ emit_include_dependencies(arg_t *arg) { if(memb->marker.flags & (EM_INDIRECT | EM_UNRECURSE)) { if(terminal_structable(arg, memb)) { int saved_target = arg->target->target; - REDIR(OT_FWD_DECLS); - OUT("%s;\n", - asn1c_type_name(arg, memb, TNF_RSAFE)); + if(saved_target != OT_FWD_DECLS) { + REDIR(OT_FWD_DECLS); + OUT("%s;\n", + asn1c_type_name(arg, memb, TNF_RSAFE)); + } REDIR(saved_target); } } diff --git a/libasn1compiler/asn1c_out.c b/libasn1compiler/asn1c_out.c index 46029f76..8314bb56 100644 --- a/libasn1compiler/asn1c_out.c +++ b/libasn1compiler/asn1c_out.c @@ -38,6 +38,11 @@ asn1c_compiled_output(arg_t *arg, const char *fmt, ...) { */ if(dst->indented == 0) { int i = dst->indent_level; + if (i < 0) { + /* fatal error */ + fprintf(stderr, "target %d : Indent level %d ?!\n", arg->target->target, i); + exit(1); + } dst->indented = 1; while(i--) { ret = asn1c_compiled_output(arg, "\t"); diff --git a/libasn1compiler/asn1c_out.h b/libasn1compiler/asn1c_out.h index e21827e0..3abe7017 100644 --- a/libasn1compiler/asn1c_out.h +++ b/libasn1compiler/asn1c_out.h @@ -17,6 +17,7 @@ typedef struct compiler_streams { OT_INCLUDES, /* #include files */ OT_DEPS, /* Dependencies (other than #includes) */ OT_FWD_DECLS, /* Forward declarations */ + OT_FWD_DEFS, /* Forward definitions */ OT_TYPE_DECLS, /* Type declarations */ OT_FUNC_DECLS, /* Function declarations */ OT_POST_INCLUDE,/* #include after type definition */ @@ -35,7 +36,7 @@ typedef struct compiler_streams { } compiler_streams_t; static char *_compiler_stream2str[] __attribute__ ((unused)) - = { "IGNORE", "INCLUDES", "DEPS", "FWD-DECLS", "TYPE-DECLS", "FUNC-DECLS", "POST-INCLUDE", "CTABLES", "CODE", "CTDEFS", "STAT-DEFS" }; + = { "IGNORE", "INCLUDES", "DEPS", "FWD-DECLS", "FWD-DEFS", "TYPE-DECLS", "FUNC-DECLS", "POST-INCLUDE", "CTABLES", "CODE", "CTDEFS", "STAT-DEFS" }; int asn1c_compiled_output(arg_t *arg, const char *fmt, ...); @@ -56,8 +57,6 @@ int asn1c_compiled_output(arg_t *arg, const char *fmt, ...); } while(0) #define EMBED(ev) do { \ - int saved_target = arg->target->target; \ - REDIR(OT_TYPE_DECLS); \ arg->embed++; \ INDENTED(arg_t _tmp = *arg; \ _tmp.expr = ev; \ @@ -66,8 +65,8 @@ int asn1c_compiled_output(arg_t *arg, const char *fmt, ...); arg->embed--; \ if(ev->expr_type != A1TC_EXTENSIBLE) \ OUT(";\n"); \ - assert(arg->target->target == OT_TYPE_DECLS); \ - REDIR(saved_target); \ + assert(arg->target->target == OT_TYPE_DECLS || \ + arg->target->target == OT_FWD_DEFS); \ } while(0) /* Output a piece of text into a default stream */ diff --git a/libasn1compiler/asn1c_save.c b/libasn1compiler/asn1c_save.c index f8348cc6..5b945b75 100644 --- a/libasn1compiler/asn1c_save.c +++ b/libasn1compiler/asn1c_save.c @@ -283,6 +283,7 @@ asn1c_save_streams(arg_t *arg, asn1c_fdeps_t *deps, int optc, char **argv) { safe_fprintf(fp_h, "\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n"); SAVE_STREAM(fp_h, OT_DEPS, "Dependencies", 0); SAVE_STREAM(fp_h, OT_FWD_DECLS, "Forward declarations", 0); + SAVE_STREAM(fp_h, OT_FWD_DEFS, "Forward definitions", 0); SAVE_STREAM(fp_h, OT_TYPE_DECLS, expr->Identifier, 0); SAVE_STREAM(fp_h, OT_FUNC_DECLS,"Implementation", 0); safe_fprintf(fp_h, "\n#ifdef __cplusplus\n}\n#endif\n"); @@ -305,7 +306,7 @@ asn1c_save_streams(arg_t *arg, asn1c_fdeps_t *deps, int optc, char **argv) { TQ_FOR(ot, &(cs->destination[OT_STAT_DEFS].chunks), next) safe_fwrite(ot->buf, ot->len, 1, fp_c); - assert(OT_MAX == 11); /* Protection from reckless changes */ + assert(OT_MAX == 12); /* Protection from reckless changes */ fclose(fp_c); fclose(fp_h); diff --git a/tests/31-set-of-OK.asn1.-Pfwide-types b/tests/31-set-of-OK.asn1.-Pfwide-types index 59bc7f9b..a0939401 100644 --- a/tests/31-set-of-OK.asn1.-Pfwide-types +++ b/tests/31-set-of-OK.asn1.-Pfwide-types @@ -184,6 +184,19 @@ typedef enum other_PR { struct Forest; +/*** <<< FWD-DEFS [Stuff] >>> ***/ + +typedef struct Member { + BIT_STRING_t cup_of_coffee; + /* + * This type is extensible, + * possible extensions are below. + */ + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} Member; + /*** <<< TYPE-DECLS [Stuff] >>> ***/ typedef struct Stuff { @@ -194,16 +207,7 @@ typedef struct Stuff { asn_struct_ctx_t _asn_ctx; } *trees; struct anything { - A_SET_OF(struct Member { - BIT_STRING_t cup_of_coffee; - /* - * This type is extensible, - * possible extensions are below. - */ - - /* Context for parsing across buffer boundaries */ - asn_struct_ctx_t _asn_ctx; - } ) list; + A_SET_OF(Member) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; diff --git a/tests/72-same-names-OK.asn1.-Pfwide-types b/tests/72-same-names-OK.asn1.-Pfwide-types index 7560c6a3..ec6c12e5 100644 --- a/tests/72-same-names-OK.asn1.-Pfwide-types +++ b/tests/72-same-names-OK.asn1.-Pfwide-types @@ -7,16 +7,20 @@ #include #include +/*** <<< FWD-DEFS [Type] >>> ***/ + +typedef struct Member { + Type1_t t1; + Type2_t t2; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} Member; + /*** <<< TYPE-DECLS [Type] >>> ***/ typedef struct Type { - A_SET_OF(struct Member { - Type1_t t1; - Type2_t t2; - - /* Context for parsing across buffer boundaries */ - asn_struct_ctx_t _asn_ctx; - } ) list; + A_SET_OF(Member) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; diff --git a/tests/92-circular-loops-OK.asn1.-Pfindirect-choice b/tests/92-circular-loops-OK.asn1.-Pfindirect-choice index 6695a411..4faa7473 100644 --- a/tests/92-circular-loops-OK.asn1.-Pfindirect-choice +++ b/tests/92-circular-loops-OK.asn1.-Pfindirect-choice @@ -623,23 +623,27 @@ asn_TYPE_descriptor_t asn_DEF_Choice3 = { struct Set; struct Sequence; +/*** <<< FWD-DEFS [Set] >>> ***/ + +typedef struct Member { + long Int; + struct Set *set; + struct Sequence *seq; + struct Set *set2 /* OPTIONAL */; + /* + * This type is extensible, + * possible extensions are below. + */ + struct Set *set3; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} Member; + /*** <<< TYPE-DECLS [Set] >>> ***/ typedef struct Set { - A_SET_OF(struct Member { - long Int; - struct Set *set; - struct Sequence *seq; - struct Set *set2 /* OPTIONAL */; - /* - * This type is extensible, - * possible extensions are below. - */ - struct Set *set3; - - /* Context for parsing across buffer boundaries */ - asn_struct_ctx_t _asn_ctx; - } ) list; + A_SET_OF(Member) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; diff --git a/tests/92-circular-loops-OK.asn1.-Pfwide-types b/tests/92-circular-loops-OK.asn1.-Pfwide-types index 21918d91..8ba7f73e 100644 --- a/tests/92-circular-loops-OK.asn1.-Pfwide-types +++ b/tests/92-circular-loops-OK.asn1.-Pfwide-types @@ -622,23 +622,27 @@ asn_TYPE_descriptor_t asn_DEF_Choice3 = { struct Set; struct Sequence; +/*** <<< FWD-DEFS [Set] >>> ***/ + +typedef struct Member { + INTEGER_t Int; + struct Set *set; + struct Sequence *seq; + struct Set *set2 /* OPTIONAL */; + /* + * This type is extensible, + * possible extensions are below. + */ + struct Set *set3; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; +} Member; + /*** <<< TYPE-DECLS [Set] >>> ***/ typedef struct Set { - A_SET_OF(struct Member { - INTEGER_t Int; - struct Set *set; - struct Sequence *seq; - struct Set *set2 /* OPTIONAL */; - /* - * This type is extensible, - * possible extensions are below. - */ - struct Set *set3; - - /* Context for parsing across buffer boundaries */ - asn_struct_ctx_t _asn_ctx; - } ) list; + A_SET_OF(Member) list; /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; From 9413414cddb83f8b73c7d041e5c8425348f0afef Mon Sep 17 00:00:00 2001 From: Lev Walkin Date: Sun, 26 Mar 2017 03:11:02 -0700 Subject: [PATCH 15/40] better dir --- skeletons/Makefile.am | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/skeletons/Makefile.am b/skeletons/Makefile.am index f15a695b..99789460 100644 --- a/skeletons/Makefile.am +++ b/skeletons/Makefile.am @@ -6,7 +6,7 @@ dist_pkgdata_DATA = \ ${srcdir}/*.[ch] \ ${srcdir}/file-dependencies -smodsdir=$(pkgdata) +smodsdir=$(pkgdatadir) nobase_dist_smods_DATA = \ standard-modules/README \ From 997d4c78e69c15a50942e041a71a685cc24501b9 Mon Sep 17 00:00:00 2001 From: Lev Walkin Date: Sun, 26 Mar 2017 03:16:05 -0700 Subject: [PATCH 16/40] copyright info --- AUTHORS | 6 ++++++ ChangeLog | 2 +- LICENSE | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/AUTHORS b/AUTHORS index 03f9b017..63671c63 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,3 +1,9 @@ +Full list of copyright holders: + Lev Walkin mkhon @ github ymbirtt @ github +Wim L +Bartosz Marcinkiewicz +Daniele Varrazzo +Bent Nicolaisen diff --git a/ChangeLog b/ChangeLog index 78e26da4..0e44ac61 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,5 @@ -0.9.??: +0.9.28: * PER decoding: avoid memory leak on error. By github.com/simo5 * Constness patch #46 by Wim L (41bbf1c..78d604f). Build issues: diff --git a/LICENSE b/LICENSE index 81581a1b..306464b4 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2003-2016 Lev Walkin and contributors. +Copyright (c) 2003-2017 Lev Walkin and contributors. All rights reserved. Redistribution and use in source and binary forms, with or without From f43b5025ae42801f35bcea258b2ae7ce6b01f6cd Mon Sep 17 00:00:00 2001 From: Lev Walkin Date: Sun, 26 Mar 2017 03:25:57 -0700 Subject: [PATCH 17/40] include INSTALL into distribution --- Makefile.am | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile.am b/Makefile.am index 870ee8f6..f0cd168d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -9,6 +9,6 @@ SUBDIRS = \ docsdir = $(datadir)/doc/asn1c -docs_DATA = README.md FAQ ChangeLog BUGS TODO +docs_DATA = README.md INSTALL.md FAQ ChangeLog BUGS TODO -EXTRA_DIST = README.md FAQ LICENSE BUGS +EXTRA_DIST = README.md INSTALL.md FAQ LICENSE BUGS From 792b22b91282c28f5fd3f0574542fcb6827b72d3 Mon Sep 17 00:00:00 2001 From: Lev Walkin Date: Sun, 26 Mar 2017 03:29:55 -0700 Subject: [PATCH 18/40] date --- ChangeLog | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 0e44ac61..8e596461 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,5 @@ -0.9.28: +0.9.28: 2017-03-26 * PER decoding: avoid memory leak on error. By github.com/simo5 * Constness patch #46 by Wim L (41bbf1c..78d604f). Build issues: From fa9bb6dcfdcfbeb3a397031f6aa2a42596aa47f9 Mon Sep 17 00:00:00 2001 From: Lev Walkin Date: Sun, 26 Mar 2017 03:48:43 -0700 Subject: [PATCH 19/40] version bump --- ChangeLog | 2 ++ configure.ac | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 8e596461..3c1a8293 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,6 @@ +0.9.??: + 0.9.28: 2017-03-26 * PER decoding: avoid memory leak on error. By github.com/simo5 * Constness patch #46 by Wim L (41bbf1c..78d604f). diff --git a/configure.ac b/configure.ac index 64a37a9c..13ef78da 100644 --- a/configure.ac +++ b/configure.ac @@ -1,4 +1,4 @@ -AC_INIT([asn1c],[0.9.28],[vlm@lionet.info]) +AC_INIT([asn1c],[0.9.29],[vlm@lionet.info]) AC_CONFIG_AUX_DIR(config) AC_CONFIG_HEADER([config.h]) From a964e0330662dd3433a1185b75015dca57cb3e07 Mon Sep 17 00:00:00 2001 From: Lev Walkin Date: Sun, 26 Mar 2017 03:48:06 -0700 Subject: [PATCH 20/40] removed more unnecessary checks --- libasn1parser/asn1p_y.c | 16 +++++++++------- libasn1parser/asn1p_y.h | 2 +- libasn1parser/asn1p_y.y | 8 ++++---- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/libasn1parser/asn1p_y.c b/libasn1parser/asn1p_y.c index d12a1aa0..9d355b76 100644 --- a/libasn1parser/asn1p_y.c +++ b/libasn1parser/asn1p_y.c @@ -430,7 +430,7 @@ typedef union YYSTYPE } tv_nametag; } /* Line 193 of yacc.c. */ -#line 434 "y.tab.c" +#line 434 "asn1p_y.c" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 @@ -443,7 +443,7 @@ typedef union YYSTYPE /* Line 216 of yacc.c. */ -#line 447 "y.tab.c" +#line 447 "asn1p_y.c" #ifdef short # undef short @@ -2318,7 +2318,8 @@ yyreduce: { (yyval.a_oid) = asn1p_oid_new(); asn1p_oid_add_arc((yyval.a_oid), &(yyvsp[(1) - (1)].a_oid_arc)); - free((yyvsp[(1) - (1)].a_oid_arc).name); + if((yyvsp[(1) - (1)].a_oid_arc).name) + free((yyvsp[(1) - (1)].a_oid_arc).name); } break; @@ -2327,7 +2328,8 @@ yyreduce: { (yyval.a_oid) = (yyvsp[(1) - (2)].a_oid); asn1p_oid_add_arc((yyval.a_oid), &(yyvsp[(2) - (2)].a_oid_arc)); - free((yyvsp[(2) - (2)].a_oid_arc).name); + if((yyvsp[(2) - (2)].a_oid_arc).name) + free((yyvsp[(2) - (2)].a_oid_arc).name); } break; @@ -2823,7 +2825,7 @@ yyreduce: checkmem((yyval.a_plist)); ret = asn1p_paramlist_add_param((yyval.a_plist), (yyvsp[(1) - (1)].a_parg).governor, (yyvsp[(1) - (1)].a_parg).argument); checkmem(ret == 0); - if((yyvsp[(1) - (1)].a_parg).governor) asn1p_ref_free((yyvsp[(1) - (1)].a_parg).governor); + asn1p_ref_free((yyvsp[(1) - (1)].a_parg).governor); free((yyvsp[(1) - (1)].a_parg).argument); } break; @@ -2835,7 +2837,7 @@ yyreduce: (yyval.a_plist) = (yyvsp[(1) - (3)].a_plist); ret = asn1p_paramlist_add_param((yyval.a_plist), (yyvsp[(3) - (3)].a_parg).governor, (yyvsp[(3) - (3)].a_parg).argument); checkmem(ret == 0); - if((yyvsp[(3) - (3)].a_parg).governor) asn1p_ref_free((yyvsp[(3) - (3)].a_parg).governor); + asn1p_ref_free((yyvsp[(3) - (3)].a_parg).governor); free((yyvsp[(3) - (3)].a_parg).argument); } break; @@ -4793,7 +4795,7 @@ yyreduce: /* Line 1267 of yacc.c. */ -#line 4799 "y.tab.c" +#line 4799 "asn1p_y.c" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); diff --git a/libasn1parser/asn1p_y.h b/libasn1parser/asn1p_y.h index 9963cdea..2cec4ee1 100644 --- a/libasn1parser/asn1p_y.h +++ b/libasn1parser/asn1p_y.h @@ -294,7 +294,7 @@ typedef union YYSTYPE } tv_nametag; } /* Line 1529 of yacc.c. */ -#line 298 "y.tab.h" +#line 298 "asn1p_y.h" YYSTYPE; # define yystype YYSTYPE /* obsolescent; will be withdrawn */ # define YYSTYPE_IS_DECLARED 1 diff --git a/libasn1parser/asn1p_y.y b/libasn1parser/asn1p_y.y index aae339bb..910989a7 100644 --- a/libasn1parser/asn1p_y.y +++ b/libasn1parser/asn1p_y.y @@ -850,16 +850,16 @@ ParameterArgumentList: checkmem($$); ret = asn1p_paramlist_add_param($$, $1.governor, $1.argument); checkmem(ret == 0); - if($1.governor) asn1p_ref_free($1.governor); - if($1.argument) free($1.argument); + asn1p_ref_free($1.governor); + free($1.argument); } | ParameterArgumentList ',' ParameterArgumentName { int ret; $$ = $1; ret = asn1p_paramlist_add_param($$, $3.governor, $3.argument); checkmem(ret == 0); - if($3.governor) asn1p_ref_free($3.governor); - if($3.argument) free($3.argument); + asn1p_ref_free($3.governor); + free($3.argument); } ; From fc9687925f3f64e524528e26ce5273ae868a2030 Mon Sep 17 00:00:00 2001 From: Lev Walkin Date: Sun, 26 Mar 2017 03:52:57 -0700 Subject: [PATCH 21/40] author fix --- AUTHORS | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/AUTHORS b/AUTHORS index 63671c63..9a3f1a7c 100644 --- a/AUTHORS +++ b/AUTHORS @@ -1,9 +1,10 @@ Full list of copyright holders: -Lev Walkin -mkhon @ github -ymbirtt @ github -Wim L Bartosz Marcinkiewicz -Daniele Varrazzo Bent Nicolaisen +brchiu @ github +Daniele Varrazzo +mkhon @ github +Lev Walkin +Wim L +ymbirtt @ github From 4aa1e96d44bd14c8de08307004dc14797e376e47 Mon Sep 17 00:00:00 2001 From: Lev Walkin Date: Sun, 26 Mar 2017 03:56:53 -0700 Subject: [PATCH 22/40] regenerated for version bump --- tests/125-bitstring-constraint-OK.asn1.-X | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/125-bitstring-constraint-OK.asn1.-X b/tests/125-bitstring-constraint-OK.asn1.-X index b33feccd..534182a3 100644 --- a/tests/125-bitstring-constraint-OK.asn1.-X +++ b/tests/125-bitstring-constraint-OK.asn1.-X @@ -1,4 +1,4 @@ - +