fix for crashes when record definitions repeat a field name

This commit is contained in:
Vern Paxson 2023-01-10 13:51:36 -08:00
parent 83a6faec3c
commit a172617250
3 changed files with 55 additions and 13 deletions

View file

@ -1062,22 +1062,25 @@ void RecordType::AddField(unsigned int field, const TypeDecl* td)
ASSERT(field == field_inits.size()); ASSERT(field == field_inits.size());
ASSERT(field == managed_fields.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)); managed_fields.push_back(ZVal::IsManagedType(td->type));
auto init = new FieldInit(); auto init = new FieldInit();
init->init_type = FieldInit::R_INIT_NONE; init->init_type = FieldInit::R_INIT_NONE;
init->attrs = td->attrs; init->attrs = td->attrs;
// We defer error-checking until here so that we can keep field_inits
// and managed_fields correctly tracking the associated fields.
if ( field_ids.count(td->id) != 0 )
{
reporter->Error("duplicate field '%s' found in record definition", td->id);
field_inits.push_back(init);
return;
}
field_ids.insert(std::string(td->id));
auto a = init->attrs; auto a = init->attrs;
auto type = td->type; auto type = td->type;
@ -1335,7 +1338,11 @@ void RecordType::Create(std::vector<std::optional<ZVal>>& r) const
for ( int i = 0; i < n; ++i ) for ( int i = 0; i < n; ++i )
{ {
auto& init = field_inits[i]; auto* init = field_inits[i];
if ( ! init )
// This can happen due to error propagation.
continue;
ZVal r_i; ZVal r_i;

View file

@ -1,3 +1,7 @@
### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. ### 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 error in <...>/record-duplicate-fields.zeek, line 7: duplicate field 'a' found in record definition
error in <...>/record-duplicate-fields.zeek, line 17: duplicate field 'a' found in record definition
error in <...>/record-duplicate-fields.zeek, line 23: duplicate field 'a' found in record definition
error in <...>/record-duplicate-fields.zeek, line 32: duplicate field 'a' found in record definition
error in <...>/record-duplicate-fields.zeek, line 32: duplicate field 'b' found in record definition
error in <...>/record-duplicate-fields.zeek, line 32: duplicate field 'a' found in record definition

View file

@ -6,8 +6,39 @@ type test: record {
a: string &optional; a: string &optional;
}; };
type r1: record {
a: count;
b: count;
};
type r2: record {
a: count;
a: count;
};
type r3: record {
b: count;
a: count;
a: count;
};
type r4: record {
a: count;
b: count;
a: count;
b: count;
a: count;
c: count;
};
global x1: r1;
global x2: r2;
global x3: r3;
global x4: r4;
event zeek_init() event zeek_init()
{ {
local a = test($a=5); local a = test($a=5);
print a; print a;
print x1, x2, x3, x4;
} }