diff --git a/scripts/base/init-bare.zeek b/scripts/base/init-bare.zeek index 547234ecbe..d28ab9a13e 100644 --- a/scripts/base/init-bare.zeek +++ b/scripts/base/init-bare.zeek @@ -3493,8 +3493,6 @@ export { free_space_start_filtering : int; ## minimum amount of free disk space required to continue document filtering free_space_threshold : int; - ## minimum amount of free disk space required to continue document filtering - free_space_threshold : int; ## default per-user disk quota delete_quota_threshold : count; ## default per-user disk limit diff --git a/src/Type.cc b/src/Type.cc index 222d84c62d..60eedfe24f 100644 --- a/src/Type.cc +++ b/src/Type.cc @@ -1039,6 +1039,16 @@ void RecordType::AddField(unsigned int field, const TypeDecl* td) ASSERT(field == field_inits.size()); ASSERT(field == managed_fields.size()); + if ( field_ids.count(td->id) != 0 ) + { + reporter->Error("Duplicate field '%s' found in record definition\n", td->id); + return; + } + else + { + field_ids.insert(std::string(td->id)); + } + managed_fields.push_back(ZVal::IsManagedType(td->type)); auto init = new FieldInit(); @@ -1106,7 +1116,7 @@ void RecordType::AddField(unsigned int field, const TypeDecl* td) bool RecordType::HasField(const char* field) const { - return FieldOffset(field) >= 0; + return field_ids.count(field) != 0; } ValPtr RecordType::FieldDefault(int field) const diff --git a/src/Type.h b/src/Type.h index 28febf5025..2b7f4d3a29 100644 --- a/src/Type.h +++ b/src/Type.h @@ -725,6 +725,7 @@ protected: int num_orig_fields; type_decl_list* types; + std::set field_ids; }; class FileType final : public Type diff --git a/testing/btest/Baseline/language.record-duplicate-fields/.stderr b/testing/btest/Baseline/language.record-duplicate-fields/.stderr new file mode 100644 index 0000000000..6f006bb79d --- /dev/null +++ b/testing/btest/Baseline/language.record-duplicate-fields/.stderr @@ -0,0 +1,3 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +error in <...>/record-duplicate-fields.zeek, line 7: Duplicate field 'a' found in record definition + diff --git a/testing/btest/language/record-duplicate-fields.zeek b/testing/btest/language/record-duplicate-fields.zeek new file mode 100644 index 0000000000..4991572b8e --- /dev/null +++ b/testing/btest/language/record-duplicate-fields.zeek @@ -0,0 +1,13 @@ +# @TEST-EXEC-FAIL: zeek -b %INPUT +# @TEST-EXEC: TEST_DIFF_CANONIFIER=$SCRIPTS/diff-remove-abspath btest-diff .stderr + +type test: record { + a: count; + a: string &optional; +}; + +event zeek_init() + { + local a = test($a=5); + print a; + }