diff --git a/CHANGES b/CHANGES index 115d0ef359..516943f29d 100644 --- a/CHANGES +++ b/CHANGES @@ -1,4 +1,8 @@ +2.6-479 | 2019-06-20 18:31:58 -0700 + + * Fix TableVal::DoClone to use CloneState cache (Jon Siwek, Corelight) + 2.6-478 | 2019-06-20 14:19:11 -0700 * Remove old Broccoli SSL options (Jon Siwek, Corelight) diff --git a/VERSION b/VERSION index 97bdea11c7..6802e60598 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.6-478 +2.6-479 diff --git a/src/Val.cc b/src/Val.cc index 409268d801..04e08feb61 100644 --- a/src/Val.cc +++ b/src/Val.cc @@ -2181,7 +2181,7 @@ Val* TableVal::DoClone(CloneState* state) TableEntryVal* val; while ( (val = tbl->NextEntry(key, cookie)) ) { - TableEntryVal* nval = val->Clone(); + TableEntryVal* nval = val->Clone(state); tv->AsNonConstTable()->Insert(key, nval); if ( subnets ) diff --git a/src/Val.h b/src/Val.h index 8168113acd..4d76ccc804 100644 --- a/src/Val.h +++ b/src/Val.h @@ -3,8 +3,6 @@ #ifndef val_h #define val_h -// BRO values. - #include #include #include @@ -374,6 +372,7 @@ protected: friend class RecordVal; friend class VectorVal; friend class ValManager; + friend class TableEntryVal; virtual void ValDescribe(ODesc* d) const; virtual void ValDescribeReST(ODesc* d) const; @@ -804,9 +803,9 @@ public: int(network_time - bro_start_network_time); } - TableEntryVal* Clone() + TableEntryVal* Clone(Val::CloneState* state) { - auto rval = new TableEntryVal(val ? val->Clone() : nullptr); + auto rval = new TableEntryVal(val ? val->Clone(state) : nullptr); rval->last_access_time = last_access_time; rval->expire_access_time = expire_access_time; rval->last_read_update = last_read_update; diff --git a/testing/btest/Baseline/language.copy/out b/testing/btest/Baseline/language.copy/out index 675d38aa5d..fbc2c4b04d 100644 --- a/testing/btest/Baseline/language.copy/out +++ b/testing/btest/Baseline/language.copy/out @@ -1,2 +1,5 @@ direct assignment (PASS) using copy (PASS) +F, T +F, T +[a=42], [a=42], [a=42], [a=42] diff --git a/testing/btest/language/copy.zeek b/testing/btest/language/copy.zeek index 9ac1e577ea..638976295d 100644 --- a/testing/btest/language/copy.zeek +++ b/testing/btest/language/copy.zeek @@ -2,14 +2,12 @@ # @TEST-EXEC: btest-diff out function test_case(msg: string, expect: bool) - { - print fmt("%s (%s)", msg, expect ? "PASS" : "FAIL"); - } - - + { + print fmt("%s (%s)", msg, expect ? "PASS" : "FAIL"); + } event zeek_init() -{ + { # "b" is not a copy of "a" local a: set[string] = set("this", "test"); local b: set[string] = a; @@ -25,6 +23,27 @@ event zeek_init() delete c["this"]; test_case( "using copy", |d| == 2 && "this" in d); + } -} +type myrec: record { + a: count; +}; + +event zeek_init() + { + local v: vector of myrec; + local t: table[count] of myrec; + local mr = myrec($a = 42); + + t[0] = mr; + t[1] = mr; + local tc = copy(t); + print same_object(t, tc), same_object(tc[0], tc[1]); + + v[0] = mr; + v[1] = mr; + local vc = copy(v); + print same_object(v, vc), same_object(vc[0], vc[1]); + print tc[0], tc[1], vc[0], vc[1]; + }