diff --git a/CHANGES b/CHANGES index f76ea2f09e..e3adb31d0d 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,9 @@ +6.1.0-dev.331 | 2023-08-25 21:38:40 +0200 + + * BTests for any/vector-of-any fixes (Vern Paxson, Corelight) + + * fixes for vector assignments involving "any"/"vector of any" types (Vern Paxson, Corelight) + 6.1.0-dev.327 | 2023-08-24 12:17:42 -0700 * updated notes regarding "-O gen-C++" maintenance (Vern Paxson, Corelight) diff --git a/NEWS b/NEWS index 36ea56bee9..e9769a31b6 100644 --- a/NEWS +++ b/NEWS @@ -61,6 +61,8 @@ New Functionality - Added new packet analyzer to handle PCAP files DLT_PPP link type. +- Fixed appending of ``any`` to ``vector of any``. + Changed Functionality --------------------- diff --git a/VERSION b/VERSION index 28f4f18589..7b2e46d07d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -6.1.0-dev.327 +6.1.0-dev.331 diff --git a/src/Expr.cc b/src/Expr.cc index 6513cacecb..c741e65938 100644 --- a/src/Expr.cc +++ b/src/Expr.cc @@ -814,7 +814,8 @@ ValPtr BinaryExpr::Fold(Val* v1, Val* v2) const if ( t1->Tag() == TYPE_VECTOR ) { // We only get here when using a matching vector on the RHS. - v2->AsVectorVal()->AddTo(v1, false); + if ( ! v2->AsVectorVal()->AddTo(v1, false) ) + Error("incompatible vector element assignment", v2); return {NewRef{}, v1}; } @@ -1683,7 +1684,9 @@ AddToExpr::AddToExpr(ExprPtr arg_op1, ExprPtr arg_op2) else if ( IsVector(bt1) ) { - if ( same_type(t1, t2) ) + // We need the IsVector(bt2) check in the following because + // same_type() always treats "any" types as "same". + if ( IsVector(bt2) && same_type(t1, t2) ) { SetType(t1); return; diff --git a/src/Val.cc b/src/Val.cc index f8aa0c6309..cea41553dd 100644 --- a/src/Val.cc +++ b/src/Val.cc @@ -3726,7 +3726,8 @@ bool VectorVal::AddTo(Val* val, bool /* is_first_init */) const auto last_idx = v->Size(); for ( auto i = 0u; i < Size(); ++i ) - v->Assign(last_idx++, At(i)); + if ( ! v->Assign(last_idx++, At(i)) ) + return false; return true; } diff --git a/testing/btest/Baseline/language.vector-any-append/.stderr b/testing/btest/Baseline/language.vector-any-append/.stderr new file mode 100644 index 0000000000..c58d3b33aa --- /dev/null +++ b/testing/btest/Baseline/language.vector-any-append/.stderr @@ -0,0 +1,2 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +error in <...>/vector-any-append.zeek, line 61: incompatible vector element assignment (v7 += v5 and [a, -3]) diff --git a/testing/btest/Baseline/language.vector-any-append/out b/testing/btest/Baseline/language.vector-any-append/out index c6c6fd79a1..5c637b1f16 100644 --- a/testing/btest/Baseline/language.vector-any-append/out +++ b/testing/btest/Baseline/language.vector-any-append/out @@ -1,2 +1,7 @@ ### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. [0, 1, 2, 3] +[4, 0, 1, 2, 3] +[1, 2, 3, [4, 5]], 4, count, count, vector of count +[[r=r], [r=r], [s=s], [s=s]] +[a, -3] +[] diff --git a/testing/btest/language/vector-any-append.zeek b/testing/btest/language/vector-any-append.zeek index 599859b1d8..c84de88b6d 100644 --- a/testing/btest/language/vector-any-append.zeek +++ b/testing/btest/language/vector-any-append.zeek @@ -1,5 +1,6 @@ # @TEST-EXEC: zeek -b %INPUT >out # @TEST-EXEC: btest-diff out +# @TEST-EXEC: TEST_DIFF_CANONIFIER=$SCRIPTS/diff-remove-abspath btest-diff .stderr function assign(v: vector of any) { @@ -11,6 +12,17 @@ function append(v: vector of any) v += |v|; } +type R: record { r: string &default="r"; }; +type S: record { s: string &default="s"; }; + +global q: vector of any; + +function keep_this_two_ways(r: any) + { + q += r; + q[|q|] = r; + } + event zeek_init() { local v: vector of count; @@ -19,4 +31,35 @@ event zeek_init() append(v); append(v); print v; + + local v2: vector of any; + v2 += |v|; + v2 += v; + print v2; + + local v3: vector of any; + local v4: any = vector(4, 5); + + v3 += 1; + v3 += vector(2, 3); + v3 += v4; + + print v3, |v3|, type_name(v3[0]), type_name(v3[1]), type_name(v3[3]); + + keep_this_two_ways(R()); + keep_this_two_ways(S()); + print q; + + local v5: vector of any; + local v6: vector of any; + local v7: vector of count; + + v5 += "a"; + v5 += -3; + + v6 += v5; + v7 += v5; + + print v6; + print v7; }