From db5b73cb8a822012d18a3a90f348e969662d6ecc Mon Sep 17 00:00:00 2001 From: Jon Siwek Date: Mon, 15 Jul 2019 12:36:21 -0700 Subject: [PATCH] Fix ref-counting bug in EnumType copy ctor Which was used by the new ShallowClone method and causes multiple enum declarations/definitions to now crash. Such code is not typically seen in scripts, but being able to define an enum in both .bif and .bro files has historically been supported. --- src/Type.cc | 3 +++ .../btest/Baseline/language.enum-multiple-decls/out | 1 + testing/btest/language/enum-multiple-decls.zeek | 10 ++++++++++ 3 files changed, 14 insertions(+) create mode 100644 testing/btest/Baseline/language.enum-multiple-decls/out create mode 100644 testing/btest/language/enum-multiple-decls.zeek diff --git a/src/Type.cc b/src/Type.cc index efe3d254c5..92c1db6a1c 100644 --- a/src/Type.cc +++ b/src/Type.cc @@ -1091,6 +1091,9 @@ EnumType::EnumType(const EnumType* e) names[it->first] = it->second; vals = e->vals; + + for ( auto& kv : vals ) + ::Ref(kv.second); } EnumType* EnumType::ShallowClone() diff --git a/testing/btest/Baseline/language.enum-multiple-decls/out b/testing/btest/Baseline/language.enum-multiple-decls/out new file mode 100644 index 0000000000..a2628c1e09 --- /dev/null +++ b/testing/btest/Baseline/language.enum-multiple-decls/out @@ -0,0 +1 @@ +ONE diff --git a/testing/btest/language/enum-multiple-decls.zeek b/testing/btest/language/enum-multiple-decls.zeek new file mode 100644 index 0000000000..f921ca120f --- /dev/null +++ b/testing/btest/language/enum-multiple-decls.zeek @@ -0,0 +1,10 @@ +# @TEST-EXEC: zeek -b %INPUT >out +# @TEST-EXEC: btest-diff out + +# At the moment, it's legal to allow a double definitions. Internally, the +# reason/comment is: "so that we can define an enum both in a *.bif and *.zeek +# for avoiding cyclic dependencies." + +type myenum: enum { ONE = 0x01 }; +type myenum: enum { ONE = 0x01 }; +print ONE;