From d180ab0dd2e6ae0041a25932c044eddedbcd90e0 Mon Sep 17 00:00:00 2001 From: Max Kellermann Date: Wed, 4 Mar 2020 21:24:31 +0100 Subject: [PATCH] Type: RecordType::FieldDefault() returns IntrusivePtr Fixes memory leak in EventHandler::NewEvent(). --- src/EventHandler.cc | 7 ++----- src/Type.cc | 4 ++-- src/Type.h | 2 +- src/Val.cc | 2 +- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/src/EventHandler.cc b/src/EventHandler.cc index 4809b31398..9a5cba56b1 100644 --- a/src/EventHandler.cc +++ b/src/EventHandler.cc @@ -138,7 +138,7 @@ void EventHandler::NewEvent(val_list* vl) { const char* fname = args->FieldName(i); BroType* ftype = args->FieldType(i); - Val* fdefault = args->FieldDefault(i); + auto fdefault = args->FieldDefault(i); auto rec = make_intrusive(call_argument); rec->Assign(0, make_intrusive(fname)); @@ -149,10 +149,7 @@ void EventHandler::NewEvent(val_list* vl) rec->Assign(1, make_intrusive(d.Description())); if ( fdefault ) - { - Ref(fdefault); - rec->Assign(2, fdefault); - } + rec->Assign(2, std::move(fdefault)); if ( i < vl->length() && (*vl)[i] ) { diff --git a/src/Type.cc b/src/Type.cc index e090a9a626..c7ca6b60d5 100644 --- a/src/Type.cc +++ b/src/Type.cc @@ -653,7 +653,7 @@ BroType* RecordType::FieldType(int field) const return (*types)[field]->type.get(); } -Val* RecordType::FieldDefault(int field) const +IntrusivePtr RecordType::FieldDefault(int field) const { const TypeDecl* td = FieldDecl(field); @@ -662,7 +662,7 @@ Val* RecordType::FieldDefault(int field) const 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 diff --git a/src/Type.h b/src/Type.h index e74ab77d4c..872d4dbd0b 100644 --- a/src/Type.h +++ b/src/Type.h @@ -505,7 +505,7 @@ public: int HasField(const char* field) const override; BroType* FieldType(const char* field) const override; BroType* FieldType(int field) const; - Val* FieldDefault(int field) const; // Ref's the returned value; 0 if none. + IntrusivePtr FieldDefault(int field) const; // A field's offset is its position in the type_decl_list, // starting at 0. Returns negative if the field doesn't exist. diff --git a/src/Val.cc b/src/Val.cc index 6def2dbaa0..a7c0cfad6a 100644 --- a/src/Val.cc +++ b/src/Val.cc @@ -2618,7 +2618,7 @@ Val* RecordVal::LookupWithDefault(int field) const if ( val ) return val->Ref(); - return Type()->AsRecordType()->FieldDefault(field); + return Type()->AsRecordType()->FieldDefault(field).release(); } void RecordVal::ResizeParseTimeRecords()