Type: RecordType::FieldDefault() returns IntrusivePtr

Fixes memory leak in EventHandler::NewEvent().
This commit is contained in:
Max Kellermann 2020-03-04 21:24:31 +01:00
parent d2961c72e1
commit d180ab0dd2
4 changed files with 6 additions and 9 deletions

View file

@ -138,7 +138,7 @@ void EventHandler::NewEvent(val_list* vl)
{ {
const char* fname = args->FieldName(i); const char* fname = args->FieldName(i);
BroType* ftype = args->FieldType(i); BroType* ftype = args->FieldType(i);
Val* fdefault = args->FieldDefault(i); auto fdefault = args->FieldDefault(i);
auto rec = make_intrusive<RecordVal>(call_argument); auto rec = make_intrusive<RecordVal>(call_argument);
rec->Assign(0, make_intrusive<StringVal>(fname)); rec->Assign(0, make_intrusive<StringVal>(fname));
@ -149,10 +149,7 @@ void EventHandler::NewEvent(val_list* vl)
rec->Assign(1, make_intrusive<StringVal>(d.Description())); rec->Assign(1, make_intrusive<StringVal>(d.Description()));
if ( fdefault ) if ( fdefault )
{ rec->Assign(2, std::move(fdefault));
Ref(fdefault);
rec->Assign(2, fdefault);
}
if ( i < vl->length() && (*vl)[i] ) if ( i < vl->length() && (*vl)[i] )
{ {

View file

@ -653,7 +653,7 @@ BroType* RecordType::FieldType(int field) const
return (*types)[field]->type.get(); return (*types)[field]->type.get();
} }
Val* RecordType::FieldDefault(int field) const IntrusivePtr<Val> RecordType::FieldDefault(int field) const
{ {
const TypeDecl* td = FieldDecl(field); const TypeDecl* td = FieldDecl(field);
@ -662,7 +662,7 @@ Val* RecordType::FieldDefault(int field) const
const Attr* def_attr = td->attrs->FindAttr(ATTR_DEFAULT); const Attr* def_attr = td->attrs->FindAttr(ATTR_DEFAULT);
return def_attr ? def_attr->AttrExpr()->Eval(nullptr).release() : nullptr; return def_attr ? def_attr->AttrExpr()->Eval(nullptr) : nullptr;
} }
int RecordType::FieldOffset(const char* field) const int RecordType::FieldOffset(const char* field) const

View file

@ -505,7 +505,7 @@ public:
int HasField(const char* field) const override; int HasField(const char* field) const override;
BroType* FieldType(const char* field) const override; BroType* FieldType(const char* field) const override;
BroType* FieldType(int field) const; BroType* FieldType(int field) const;
Val* FieldDefault(int field) const; // Ref's the returned value; 0 if none. IntrusivePtr<Val> FieldDefault(int field) const;
// A field's offset is its position in the type_decl_list, // A field's offset is its position in the type_decl_list,
// starting at 0. Returns negative if the field doesn't exist. // starting at 0. Returns negative if the field doesn't exist.

View file

@ -2618,7 +2618,7 @@ Val* RecordVal::LookupWithDefault(int field) const
if ( val ) if ( val )
return val->Ref(); return val->Ref();
return Type()->AsRecordType()->FieldDefault(field); return Type()->AsRecordType()->FieldDefault(field).release();
} }
void RecordVal::ResizeParseTimeRecords() void RecordVal::ResizeParseTimeRecords()