From 247d8833acf21f7c28f317561914643b3e9c320d Mon Sep 17 00:00:00 2001 From: BenceJanosSzabo <bence.janos.szabo@ericsson.com> Date: Thu, 20 Jul 2017 10:00:01 +0200 Subject: [PATCH] Bug 492231 - RAW decoder: dynamic test case error during decoding: Invalid conversion of a large integer value Change-Id: I5f49e68a7ad160672b34192922c3859d22594ce1 Signed-off-by: BenceJanosSzabo <bence.janos.szabo@ericsson.com> --- compiler2/record.c | 6 +- core/RAW.cc | 10 +-- core/RAW.hh | 2 +- .../RAW_EncDec/RAW_EncDec_TD.fast_script | 68 +++++++++++++++++++ 4 files changed, 77 insertions(+), 9 deletions(-) diff --git a/compiler2/record.c b/compiler2/record.c index aefcbac65..ee2867624 100644 --- a/compiler2/record.c +++ b/compiler2/record.c @@ -4884,7 +4884,7 @@ static char *genRawDecodeRecordField(char *src, const struct_def *sdef, ); } src=mputprintf(src, - " value_of_length_field%d+=(int)field_%s%s.%s%s()*%d;\n" + " value_of_length_field%d+=field_%s%s.%s%s().get_long_long_val()*%d;\n" ,i,sdef->elements[i].name,sdef->elements[i].isOptional?"()":"" ,sdef->elements[i].raw.lengthindex->nthfieldname ,sdef->elements[i].raw.lengthindex->fieldtype == OPTIONAL_FIELD?"()":"" @@ -4902,7 +4902,7 @@ static char *genRawDecodeRecordField(char *src, const struct_def *sdef, sdef->elements[i].name, sdef->elements[i].isOptional ? "()" : ""); for (m = 1; m < sdef->elements[i].raw.union_member_num + 1; m++) { src = mputprintf(src, " case %s%s%s:\n" - " value_of_length_field%d += (int)field_%s%s.%s() * %d;\n" + " value_of_length_field%d += field_%s%s.%s().get_long_long_val() * %d;\n" " break;\n", sdef->elements[i].raw.member_name[0], "::ALT_", sdef->elements[i].raw.member_name[m], i, sdef->elements[i].name, @@ -4916,7 +4916,7 @@ static char *genRawDecodeRecordField(char *src, const struct_def *sdef, } else{ src=mputprintf(src, - " value_of_length_field%d+=(int)field_%s%s*%d;\n" + " value_of_length_field%d+=field_%s%s.get_long_long_val()*%d;\n" ,i,sdef->elements[i].name,sdef->elements[i].isOptional?"()":"" ,sdef->elements[i].raw.unit==-1?1:sdef->elements[i].raw.unit ); diff --git a/core/RAW.cc b/core/RAW.cc index b26b8271b..eb489c26b 100644 --- a/core/RAW.cc +++ b/core/RAW.cc @@ -414,15 +414,15 @@ void free_tree_pos(int* ptr){ Free(ptr); } -int min_of_ints(int num_of_int,...) +int min_of_ints(unsigned int num_of_int,...) { va_list pvar; va_start(pvar,num_of_int); - int min_val = 0; + unsigned int min_val = 0; if (num_of_int > 0) { - min_val = va_arg(pvar, int); - for (int a = 1; a < num_of_int; a++) { - int b = va_arg(pvar, int); + min_val = va_arg(pvar, unsigned int); + for (unsigned int a = 1; a < num_of_int; a++) { + unsigned int b = va_arg(pvar, unsigned int); if (b < min_val) min_val = b; } } diff --git a/core/RAW.hh b/core/RAW.hh index fdabcd557..e80c254c1 100644 --- a/core/RAW.hh +++ b/core/RAW.hh @@ -201,7 +201,7 @@ RAW_enc_tree** init_nodes_of_enc_tree(int nodes_num); RAW_enc_tr_pos* init_lengthto_fields_list(int num); int* init_new_tree_pos(RAW_enc_tr_pos &old_pos,int new_levels, int* new_pos); void free_tree_pos(int* ptr); -int min_of_ints(int num_of_int, ...); +int min_of_ints(unsigned num_of_int, ...); extern const TTCN_RAWdescriptor_t INTEGER_raw_; extern const TTCN_RAWdescriptor_t BOOLEAN_raw_; diff --git a/function_test/RAW_EncDec/RAW_EncDec_TD.fast_script b/function_test/RAW_EncDec/RAW_EncDec_TD.fast_script index 1e83d7b87..e7ad559e7 100644 --- a/function_test/RAW_EncDec/RAW_EncDec_TD.fast_script +++ b/function_test/RAW_EncDec/RAW_EncDec_TD.fast_script @@ -7332,6 +7332,74 @@ control{ Overall verdict: pass <END_TC> + + +:exmp. + +.*---------------------------------------------------------------------* +:h3. Bug 492231: RAW coder: incorrect (int) conversion in generated code. +.*---------------------------------------------------------------------* +:xmp tab=0. + +<TC-Bug 492231: RAW coder: incorrect (int) conversion in generated code.> + +<STATIC> + + type component Test_CT{}; + +<TTCN_TC:PURE_EXEC> + + external function enc_U(in U pl_pdu) return octetstring + with { + extension "prototype(convert)" + extension "encode(RAW)" + }; + external function dec_U(in octetstring pl_octetstring) return U + with { + extension "prototype(convert)" + extension "decode(RAW)" + } + + type octetstring OCT2 length(2); + + type record R1 { + integer f1, + octetstring f2, + integer f3 + } with { + encode "RAW" + variant (f1) "FIELDLENGTH(64)" + variant (f1) "LENGTHTO(f2)" + } + + type union U { + R1 u1, + octetstring u2 length(8) + } with { + encode "RAW" + variant "" + } + +testcase TC_01() runs on Test_CT{ + var U pl_u, pl_u_result; + pl_u.u2 := 'FFFFFFFFFFFFFFFF'O; + var octetstring os := enc_U(pl_u); + pl_u_result := dec_U(os); + if (pl_u != pl_u_result) { + setverdict(fail); + } + setverdict(pass); +} + +control{ + execute(TC_01()); +} + +<RESULT> + +Overall verdict: pass + +<END_TC> :exmp. .*---------------------------------------------------------------------* -- GitLab