* 'intrusive_ptr' of https://github.com/MaxKellermann/zeek: (32 commits)
  Scope: store IntrusivePtr in `local`
  Scope: pass IntrusivePtr to AddInit()
  DNS_Mgr: use class IntrusivePtr
  Scope: use class IntrusivePtr
  Attr: use class IntrusivePtr
  Expr: check_and_promote_expr() returns IntrusivePtr
  Frame: use class IntrusivePtr
  Val: RecordVal::LookupWithDefault() returns IntrusivePtr
  Type: RecordType::FieldDefault() returns IntrusivePtr
  Val: TableVal::Delete() returns IntrusivePtr
  Type: base_type() returns IntrusivePtr
  Type: init_type() returns IntrusivePtr
  Type: merge_types() returns IntrusivePtr
  Type: use class IntrusivePtr in VectorType
  Type: use class IntrusivePtr in EnumType
  Type: use class IntrusivePtr in FileType
  Type: use class IntrusivePtr in TypeDecl
  Type: make TypeDecl `final` and the dtor non-`virtual`
  Type: use class IntrusivePtr in TypeType
  Type: use class IntrusivePtr in FuncType
  ...
This commit is contained in:
Jon Siwek 2020-03-17 22:51:46 -07:00
commit b62727a7fa
108 changed files with 1737 additions and 2067 deletions

View file

@ -23,18 +23,20 @@ const char* attr_name(attr_tag t)
return attr_names[int(t)]; return attr_names[int(t)];
} }
Attr::Attr(attr_tag t, Expr* e) Attr::Attr(attr_tag t, IntrusivePtr<Expr> e)
: expr(std::move(e))
{ {
tag = t; tag = t;
expr = e;
SetLocationInfo(&start_location, &end_location); SetLocationInfo(&start_location, &end_location);
} }
Attr::~Attr() Attr::Attr(attr_tag t)
: Attr(t, nullptr)
{ {
Unref(expr);
} }
Attr::~Attr() = default;
void Attr::Describe(ODesc* d) const void Attr::Describe(ODesc* d) const
{ {
AddTag(d); AddTag(d);
@ -131,10 +133,10 @@ void Attr::AddTag(ODesc* d) const
d->Add(attr_name(Tag())); d->Add(attr_name(Tag()));
} }
Attributes::Attributes(attr_list* a, BroType* t, bool arg_in_record, bool is_global) Attributes::Attributes(attr_list* a, IntrusivePtr<BroType> t, bool arg_in_record, bool is_global)
: type(std::move(t))
{ {
attrs = new attr_list(a->length()); attrs = new attr_list(a->length());
type = t->Ref();
in_record = arg_in_record; in_record = arg_in_record;
global_var = is_global; global_var = is_global;
@ -145,7 +147,7 @@ Attributes::Attributes(attr_list* a, BroType* t, bool arg_in_record, bool is_glo
// the necessary checking gets done. // the necessary checking gets done.
for ( const auto& attr : *a ) for ( const auto& attr : *a )
AddAttr(attr); AddAttr({NewRef{}, attr});
delete a; delete a;
} }
@ -156,23 +158,20 @@ Attributes::~Attributes()
Unref(attr); Unref(attr);
delete attrs; delete attrs;
Unref(type);
} }
void Attributes::AddAttr(Attr* attr) void Attributes::AddAttr(IntrusivePtr<Attr> attr)
{ {
if ( ! attrs ) if ( ! attrs )
attrs = new attr_list(1); attrs = new attr_list(1);
// We overwrite old attributes by deleting them first. // We overwrite old attributes by deleting them first.
RemoveAttr(attr->Tag()); RemoveAttr(attr->Tag());
attrs->push_back(attr); attrs->push_back(IntrusivePtr{attr}.release());
Ref(attr);
// We only check the attribute after we've added it, to facilitate // We only check the attribute after we've added it, to facilitate
// generating error messages via Attributes::Describe. // generating error messages via Attributes::Describe.
CheckAttr(attr); CheckAttr(attr.get());
// For ADD_FUNC or DEL_FUNC, add in an implicit REDEF, since // For ADD_FUNC or DEL_FUNC, add in an implicit REDEF, since
// those attributes only have meaning for a redefinable value. // those attributes only have meaning for a redefinable value.
@ -190,7 +189,7 @@ void Attributes::AddAttrs(Attributes* a)
{ {
attr_list* as = a->Attrs(); attr_list* as = a->Attrs();
for ( const auto& attr : *as ) for ( const auto& attr : *as )
AddAttr(attr); AddAttr({NewRef{}, attr});
Unref(a); Unref(a);
} }
@ -274,7 +273,7 @@ void Attributes::CheckAttr(Attr* a)
} }
FuncType* aft = at->AsFuncType(); FuncType* aft = at->AsFuncType();
if ( ! same_type(aft->YieldType(), type) ) if ( ! same_type(aft->YieldType(), type.get()) )
{ {
a->AttrExpr()->Error( a->AttrExpr()->Error(
is_add ? is_add ?
@ -299,7 +298,7 @@ void Attributes::CheckAttr(Attr* a)
if ( type->Tag() != TYPE_TABLE || (type->IsSet() && ! in_record) ) if ( type->Tag() != TYPE_TABLE || (type->IsSet() && ! in_record) )
{ {
if ( same_type(atype, type) ) if ( same_type(atype, type.get()) )
// Ok. // Ok.
break; break;
@ -315,15 +314,16 @@ void Attributes::CheckAttr(Attr* a)
// Ok. // Ok.
break; break;
Expr* e = a->AttrExpr(); auto e = check_and_promote_expr(a->AttrExpr(), type.get());
if ( check_and_promote_expr(e, type) )
if ( e )
{ {
a->SetAttrExpr(e); a->SetAttrExpr(std::move(e));
// Ok. // Ok.
break; break;
} }
a->AttrExpr()->Error("&default value has inconsistent type", type); a->AttrExpr()->Error("&default value has inconsistent type", type.get());
return; return;
} }
@ -354,10 +354,11 @@ void Attributes::CheckAttr(Attr* a)
// Ok. // Ok.
break; break;
Expr* e = a->AttrExpr(); auto e = check_and_promote_expr(a->AttrExpr(), ytype);
if ( check_and_promote_expr(e, ytype) )
if ( e )
{ {
a->SetAttrExpr(e); a->SetAttrExpr(std::move(e));
// Ok. // Ok.
break; break;
} }
@ -373,17 +374,17 @@ void Attributes::CheckAttr(Attr* a)
{ {
// &default applies to record field. // &default applies to record field.
if ( same_type(atype, type) ) if ( same_type(atype, type.get()) )
// Ok. // Ok.
break; break;
if ( (atype->Tag() == TYPE_TABLE && atype->AsTableType()->IsUnspecifiedTable()) ) if ( (atype->Tag() == TYPE_TABLE && atype->AsTableType()->IsUnspecifiedTable()) )
{ {
Expr* e = a->AttrExpr(); auto e = check_and_promote_expr(a->AttrExpr(), type.get());
if ( check_and_promote_expr(e, type) ) if ( e )
{ {
a->SetAttrExpr(e); a->SetAttrExpr(std::move(e));
break; break;
} }
} }
@ -574,7 +575,7 @@ void Attributes::CheckAttr(Attr* a)
break; break;
case ATTR_LOG: case ATTR_LOG:
if ( ! threading::Value::IsCompatibleType(type) ) if ( ! threading::Value::IsCompatibleType(type.get()) )
Error("&log applied to a type that cannot be logged"); Error("&log applied to a type that cannot be logged");
break; break;

View file

@ -4,6 +4,7 @@
#include "Obj.h" #include "Obj.h"
#include "BroList.h" #include "BroList.h"
#include "IntrusivePtr.h"
class Expr; class Expr;
@ -35,18 +36,15 @@ typedef enum {
class Attr : public BroObj { class Attr : public BroObj {
public: public:
explicit Attr(attr_tag t, Expr* e = 0); Attr(attr_tag t, IntrusivePtr<Expr> e);
explicit Attr(attr_tag t);
~Attr() override; ~Attr() override;
attr_tag Tag() const { return tag; } attr_tag Tag() const { return tag; }
Expr* AttrExpr() const { return expr; } Expr* AttrExpr() const { return expr.get(); }
// Up to the caller to decide if previous expr can be unref'd since it may template<typename E>
// not always be safe; e.g. expressions (at time of writing) don't always void SetAttrExpr(E&& e) { expr = std::forward<E>(e); }
// keep careful track of referencing their operands, so doing something
// like SetAttrExpr(coerce(AttrExpr())) must not completely unref the
// previous expr as the new expr depends on it.
void SetAttrExpr(Expr* e) { expr = e; }
void Describe(ODesc* d) const override; void Describe(ODesc* d) const override;
void DescribeReST(ODesc* d, bool shorten = false) const; void DescribeReST(ODesc* d, bool shorten = false) const;
@ -69,16 +67,16 @@ protected:
void AddTag(ODesc* d) const; void AddTag(ODesc* d) const;
attr_tag tag; attr_tag tag;
Expr* expr; IntrusivePtr<Expr> expr;
}; };
// Manages a collection of attributes. // Manages a collection of attributes.
class Attributes : public BroObj { class Attributes : public BroObj {
public: public:
Attributes(attr_list* a, BroType* t, bool in_record, bool is_global); Attributes(attr_list* a, IntrusivePtr<BroType> t, bool in_record, bool is_global);
~Attributes() override; ~Attributes() override;
void AddAttr(Attr* a); void AddAttr(IntrusivePtr<Attr> a);
void AddAttrs(Attributes* a); // Unref's 'a' when done void AddAttrs(Attributes* a); // Unref's 'a' when done
Attr* FindAttr(attr_tag t) const; Attr* FindAttr(attr_tag t) const;
@ -93,10 +91,9 @@ public:
bool operator==(const Attributes& other) const; bool operator==(const Attributes& other) const;
protected: protected:
Attributes() : type(), attrs(), in_record() { }
void CheckAttr(Attr* attr); void CheckAttr(Attr* attr);
BroType* type; IntrusivePtr<BroType> type;
attr_list* attrs; attr_list* attrs;
bool in_record; bool in_record;
bool global_var; bool global_var;

View file

@ -180,9 +180,9 @@ char* CompositeHash::SingleValHash(int type_check, char* kp0,
for ( int i = 0; i < num_fields; ++i ) for ( int i = 0; i < num_fields; ++i )
{ {
Val* rv_i = rv->Lookup(i); auto rv_i = rv->Lookup(i);
Attributes* a = rt->FieldDecl(i)->attrs; Attributes* a = rt->FieldDecl(i)->attrs.get();
bool optional = (a && a->FindAttr(ATTR_OPTIONAL)); bool optional = (a && a->FindAttr(ATTR_OPTIONAL));
if ( ! (rv_i || optional) ) if ( ! (rv_i || optional) )
@ -249,9 +249,10 @@ char* CompositeHash::SingleValHash(int type_check, char* kp0,
if ( ! v->Type()->IsSet() ) if ( ! v->Type()->IsSet() )
{ {
Val* val = tv->Lookup(key); auto val = tv->Lookup(key);
if ( ! (kp1 = SingleValHash(type_check, kp1, val->Type(), if ( ! (kp1 = SingleValHash(type_check, kp1, val->Type(),
val, false)) ) val.get(), false)) )
{ {
Unref(lv); Unref(lv);
return 0; return 0;
@ -519,7 +520,7 @@ int CompositeHash::SingleTypeKeySize(BroType* bt, const Val* v,
for ( int i = 0; i < num_fields; ++i ) for ( int i = 0; i < num_fields; ++i )
{ {
Attributes* a = rt->FieldDecl(i)->attrs; Attributes* a = rt->FieldDecl(i)->attrs.get();
bool optional = (a && a->FindAttr(ATTR_OPTIONAL)); bool optional = (a && a->FindAttr(ATTR_OPTIONAL));
sz = SingleTypeKeySize(rt->FieldType(i), sz = SingleTypeKeySize(rt->FieldType(i),
@ -554,8 +555,8 @@ int CompositeHash::SingleTypeKeySize(BroType* bt, const Val* v,
if ( ! bt->IsSet() ) if ( ! bt->IsSet() )
{ {
Val* val = tv->Lookup(key); auto val = tv->Lookup(key);
sz = SingleTypeKeySize(val->Type(), val, type_check, sz, sz = SingleTypeKeySize(val->Type(), val.get(), type_check, sz,
false, calc_static_size); false, calc_static_size);
if ( ! sz ) if ( ! sz )
{ {
@ -720,19 +721,19 @@ int CompositeHash::SizeAlign(int offset, unsigned int size) const
return offset; return offset;
} }
ListVal* CompositeHash::RecoverVals(const HashKey* k) const IntrusivePtr<ListVal> CompositeHash::RecoverVals(const HashKey* k) const
{ {
ListVal* l = new ListVal(TYPE_ANY); auto l = make_intrusive<ListVal>(TYPE_ANY);
const type_list* tl = type->Types(); const type_list* tl = type->Types();
const char* kp = (const char*) k->Key(); const char* kp = (const char*) k->Key();
const char* const k_end = kp + k->Size(); const char* const k_end = kp + k->Size();
for ( const auto& type : *tl ) for ( const auto& type : *tl )
{ {
Val* v = nullptr; IntrusivePtr<Val> v;
kp = RecoverOneVal(k, kp, k_end, type, v, false); kp = RecoverOneVal(k, kp, k_end, type, &v, false);
ASSERT(v); ASSERT(v);
l->Append(v); l->Append(v.release());
} }
if ( kp != k_end ) if ( kp != k_end )
@ -743,7 +744,7 @@ ListVal* CompositeHash::RecoverVals(const HashKey* k) const
const char* CompositeHash::RecoverOneVal(const HashKey* k, const char* kp0, const char* CompositeHash::RecoverOneVal(const HashKey* k, const char* kp0,
const char* const k_end, BroType* t, const char* const k_end, BroType* t,
Val*& pval, bool optional) const IntrusivePtr<Val>* pval, bool optional) const
{ {
// k->Size() == 0 for a single empty string. // k->Size() == 0 for a single empty string.
if ( kp0 >= k_end && k->Size() > 0 ) if ( kp0 >= k_end && k->Size() > 0 )
@ -760,7 +761,7 @@ const char* CompositeHash::RecoverOneVal(const HashKey* k, const char* kp0,
if ( ! *kp ) if ( ! *kp )
{ {
pval = 0; *pval = nullptr;
return kp0; return kp0;
} }
} }
@ -772,15 +773,15 @@ const char* CompositeHash::RecoverOneVal(const HashKey* k, const char* kp0,
kp1 = reinterpret_cast<const char*>(kp+1); kp1 = reinterpret_cast<const char*>(kp+1);
if ( tag == TYPE_ENUM ) if ( tag == TYPE_ENUM )
pval = t->AsEnumType()->GetVal(*kp); *pval = t->AsEnumType()->GetVal(*kp);
else if ( tag == TYPE_BOOL ) else if ( tag == TYPE_BOOL )
pval = val_mgr->GetBool(*kp); *pval = {AdoptRef{}, val_mgr->GetBool(*kp)};
else if ( tag == TYPE_INT ) else if ( tag == TYPE_INT )
pval = val_mgr->GetInt(*kp); *pval = {AdoptRef{}, val_mgr->GetInt(*kp)};
else else
{ {
reporter->InternalError("bad internal unsigned int in CompositeHash::RecoverOneVal()"); reporter->InternalError("bad internal unsigned int in CompositeHash::RecoverOneVal()");
pval = 0; *pval = nullptr;
} }
} }
break; break;
@ -793,16 +794,16 @@ const char* CompositeHash::RecoverOneVal(const HashKey* k, const char* kp0,
switch ( tag ) { switch ( tag ) {
case TYPE_COUNT: case TYPE_COUNT:
case TYPE_COUNTER: case TYPE_COUNTER:
pval = val_mgr->GetCount(*kp); *pval = {AdoptRef{}, val_mgr->GetCount(*kp)};
break; break;
case TYPE_PORT: case TYPE_PORT:
pval = val_mgr->GetPort(*kp); *pval = {AdoptRef{}, val_mgr->GetPort(*kp)};
break; break;
default: default:
reporter->InternalError("bad internal unsigned int in CompositeHash::RecoverOneVal()"); reporter->InternalError("bad internal unsigned int in CompositeHash::RecoverOneVal()");
pval = 0; *pval = nullptr;
break; break;
} }
} }
@ -814,9 +815,9 @@ const char* CompositeHash::RecoverOneVal(const HashKey* k, const char* kp0,
kp1 = reinterpret_cast<const char*>(kp+1); kp1 = reinterpret_cast<const char*>(kp+1);
if ( tag == TYPE_INTERVAL ) if ( tag == TYPE_INTERVAL )
pval = new IntervalVal(*kp, 1.0); *pval = make_intrusive<IntervalVal>(*kp, 1.0);
else else
pval = new Val(*kp, tag); *pval = make_intrusive<Val>(*kp, tag);
} }
break; break;
@ -829,12 +830,12 @@ const char* CompositeHash::RecoverOneVal(const HashKey* k, const char* kp0,
switch ( tag ) { switch ( tag ) {
case TYPE_ADDR: case TYPE_ADDR:
pval = new AddrVal(addr); *pval = make_intrusive<AddrVal>(addr);
break; break;
default: default:
reporter->InternalError("bad internal address in CompositeHash::RecoverOneVal()"); reporter->InternalError("bad internal address in CompositeHash::RecoverOneVal()");
pval = 0; *pval = nullptr;
break; break;
} }
} }
@ -844,7 +845,7 @@ const char* CompositeHash::RecoverOneVal(const HashKey* k, const char* kp0,
{ {
const uint32_t* const kp = AlignType<uint32_t>(kp0); const uint32_t* const kp = AlignType<uint32_t>(kp0);
kp1 = reinterpret_cast<const char*>(kp+5); kp1 = reinterpret_cast<const char*>(kp+5);
pval = new SubNetVal(kp, kp[4]); *pval = make_intrusive<SubNetVal>(kp, kp[4]);
} }
break; break;
@ -862,20 +863,19 @@ const char* CompositeHash::RecoverOneVal(const HashKey* k, const char* kp0,
if ( ! f ) if ( ! f )
reporter->InternalError("failed to look up unique function id %" PRIu32 " in CompositeHash::RecoverOneVal()", *kp); reporter->InternalError("failed to look up unique function id %" PRIu32 " in CompositeHash::RecoverOneVal()", *kp);
pval = new Val(f); *pval = make_intrusive<Val>(f);
auto pvt = (*pval)->Type();
if ( ! pval->Type() ) if ( ! pvt )
reporter->InternalError("bad aggregate Val in CompositeHash::RecoverOneVal()"); reporter->InternalError("bad aggregate Val in CompositeHash::RecoverOneVal()");
else if ( t->Tag() != TYPE_FUNC && else if ( t->Tag() != TYPE_FUNC && ! same_type(pvt, t) )
! same_type(pval->Type(), t) )
// ### Maybe fix later, but may be fundamentally // ### Maybe fix later, but may be fundamentally
// un-checkable --US // un-checkable --US
reporter->InternalError("inconsistent aggregate Val in CompositeHash::RecoverOneVal()"); reporter->InternalError("inconsistent aggregate Val in CompositeHash::RecoverOneVal()");
// ### A crude approximation for now. // ### A crude approximation for now.
else if ( t->Tag() == TYPE_FUNC && else if ( t->Tag() == TYPE_FUNC && pvt->Tag() != TYPE_FUNC )
pval->Type()->Tag() != TYPE_FUNC )
reporter->InternalError("inconsistent aggregate Val in CompositeHash::RecoverOneVal()"); reporter->InternalError("inconsistent aggregate Val in CompositeHash::RecoverOneVal()");
} }
break; break;
@ -898,7 +898,7 @@ const char* CompositeHash::RecoverOneVal(const HashKey* k, const char* kp0,
re = new RE_Matcher(kp1, kp1 + len[0]); re = new RE_Matcher(kp1, kp1 + len[0]);
kp1 += len[0] + len[1]; kp1 += len[0] + len[1];
} }
pval = new PatternVal(re); *pval = make_intrusive<PatternVal>(re);
} }
break; break;
@ -912,13 +912,13 @@ const char* CompositeHash::RecoverOneVal(const HashKey* k, const char* kp0,
int i; int i;
for ( i = 0; i < num_fields; ++i ) for ( i = 0; i < num_fields; ++i )
{ {
Val* v; IntrusivePtr<Val> v;
Attributes* a = rt->FieldDecl(i)->attrs; Attributes* a = rt->FieldDecl(i)->attrs.get();
bool optional = (a && a->FindAttr(ATTR_OPTIONAL)); bool optional = (a && a->FindAttr(ATTR_OPTIONAL));
kp = RecoverOneVal(k, kp, k_end, kp = RecoverOneVal(k, kp, k_end,
rt->FieldType(i), v, optional); rt->FieldType(i), &v, optional);
// An earlier call to reporter->InternalError would have called abort() and broken the // An earlier call to reporter->InternalError would have called abort() and broken the
// call tree that clang-tidy is relying on to get the error described. // call tree that clang-tidy is relying on to get the error described.
@ -926,21 +926,21 @@ const char* CompositeHash::RecoverOneVal(const HashKey* k, const char* kp0,
if ( ! (v || optional) ) if ( ! (v || optional) )
{ {
reporter->InternalError("didn't recover expected number of fields from HashKey"); reporter->InternalError("didn't recover expected number of fields from HashKey");
pval = 0; pval = nullptr;
break; break;
} }
values.push_back(v); values.push_back(v.release());
} }
ASSERT(int(values.size()) == num_fields); ASSERT(int(values.size()) == num_fields);
RecordVal* rv = new RecordVal(rt); auto rv = make_intrusive<RecordVal>(rt);
for ( int i = 0; i < num_fields; ++i ) for ( int i = 0; i < num_fields; ++i )
rv->Assign(i, values[i]); rv->Assign(i, values[i]);
pval = rv; *pval = std::move(rv);
kp1 = kp; kp1 = kp;
} }
break; break;
@ -952,29 +952,25 @@ const char* CompositeHash::RecoverOneVal(const HashKey* k, const char* kp0,
n = *kp; n = *kp;
kp1 = reinterpret_cast<const char*>(kp+1); kp1 = reinterpret_cast<const char*>(kp+1);
TableType* tt = t->AsTableType(); TableType* tt = t->AsTableType();
TableVal* tv = new TableVal(tt); auto tv = make_intrusive<TableVal>(IntrusivePtr{NewRef{}, tt});
vector<Val*> keys, values;
for ( int i = 0; i < n; ++i ) for ( int i = 0; i < n; ++i )
{ {
Val* key; IntrusivePtr<Val> key;
kp1 = RecoverOneVal(k, kp1, k_end, tt->Indices(), key, false); kp1 = RecoverOneVal(k, kp1, k_end, tt->Indices(), &key, false);
keys.push_back(key);
if ( ! t->IsSet() ) if ( t->IsSet() )
tv->Assign(key.get(), nullptr);
else
{ {
Val* value; IntrusivePtr<Val> value;
kp1 = RecoverOneVal(k, kp1, k_end, tt->YieldType(), value, kp1 = RecoverOneVal(k, kp1, k_end, tt->YieldType(), &value,
false); false);
values.push_back(value); tv->Assign(key.get(), std::move(value));
} }
} }
for ( int i = 0; i < n; ++i ) *pval = std::move(tv);
{
tv->Assign(keys[i], t->IsSet() ? 0 : values[i]);
Unref(keys[i]);
}
pval = tv;
} }
break; break;
@ -985,7 +981,8 @@ const char* CompositeHash::RecoverOneVal(const HashKey* k, const char* kp0,
n = *kp; n = *kp;
kp1 = reinterpret_cast<const char*>(kp+1); kp1 = reinterpret_cast<const char*>(kp+1);
VectorType* vt = t->AsVectorType(); VectorType* vt = t->AsVectorType();
VectorVal* vv = new VectorVal(vt); auto vv = make_intrusive<VectorVal>(vt);
for ( unsigned int i = 0; i < n; ++i ) for ( unsigned int i = 0; i < n; ++i )
{ {
kp = AlignType<unsigned int>(kp1); kp = AlignType<unsigned int>(kp1);
@ -994,14 +991,16 @@ const char* CompositeHash::RecoverOneVal(const HashKey* k, const char* kp0,
kp = AlignType<unsigned int>(kp1); kp = AlignType<unsigned int>(kp1);
unsigned int have_val = *kp; unsigned int have_val = *kp;
kp1 = reinterpret_cast<const char*>(kp+1); kp1 = reinterpret_cast<const char*>(kp+1);
Val* value = 0; IntrusivePtr<Val> value;
if ( have_val ) if ( have_val )
kp1 = RecoverOneVal(k, kp1, k_end, vt->YieldType(), value, kp1 = RecoverOneVal(k, kp1, k_end, vt->YieldType(), &value,
false); false);
vv->Assign(index, value);
vv->Assign(index, std::move(value));
} }
pval = vv; *pval = std::move(vv);
} }
break; break;
@ -1012,16 +1011,17 @@ const char* CompositeHash::RecoverOneVal(const HashKey* k, const char* kp0,
n = *kp; n = *kp;
kp1 = reinterpret_cast<const char*>(kp+1); kp1 = reinterpret_cast<const char*>(kp+1);
TypeList* tl = t->AsTypeList(); TypeList* tl = t->AsTypeList();
ListVal* lv = new ListVal(TYPE_ANY); auto lv = make_intrusive<ListVal>(TYPE_ANY);
for ( int i = 0; i < n; ++i ) for ( int i = 0; i < n; ++i )
{ {
Val* v; IntrusivePtr<Val> v;
BroType* it = (*tl->Types())[i]; BroType* it = (*tl->Types())[i];
kp1 = RecoverOneVal(k, kp1, k_end, it, v, false); kp1 = RecoverOneVal(k, kp1, k_end, it, &v, false);
lv->Append(v); lv->Append(v.release());
} }
pval = lv; *pval = std::move(lv);
} }
break; break;
@ -1051,7 +1051,7 @@ const char* CompositeHash::RecoverOneVal(const HashKey* k, const char* kp0,
kp1 = reinterpret_cast<const char*>(kp+1); kp1 = reinterpret_cast<const char*>(kp+1);
} }
pval = new StringVal(new BroString((const byte_vec) kp1, n, 1)); *pval = make_intrusive<StringVal>(new BroString((const byte_vec) kp1, n, 1));
kp1 += n; kp1 += n;
} }
break; break;

View file

@ -18,7 +18,7 @@ public:
HashKey* ComputeHash(const Val* v, int type_check) const; HashKey* ComputeHash(const Val* v, int type_check) const;
// Given a hash key, recover the values used to create it. // Given a hash key, recover the values used to create it.
ListVal* RecoverVals(const HashKey* k) const; IntrusivePtr<ListVal> RecoverVals(const HashKey* k) const;
unsigned int MemoryAllocation() const { return padded_sizeof(*this) + pad_size(size); } unsigned int MemoryAllocation() const { return padded_sizeof(*this) + pad_size(size); }
@ -36,7 +36,7 @@ protected:
// upon errors, so there is no return value for invalid input. // upon errors, so there is no return value for invalid input.
const char* RecoverOneVal(const HashKey* k, const char* RecoverOneVal(const HashKey* k,
const char* kp, const char* const k_end, const char* kp, const char* const k_end,
BroType* t, Val*& pval, bool optional) const; BroType* t, IntrusivePtr<Val>* pval, bool optional) const;
// Rounds the given pointer up to the nearest multiple of the // Rounds the given pointer up to the nearest multiple of the
// given size, if not already a multiple. // given size, if not already a multiple.

View file

@ -337,13 +337,13 @@ RecordVal* Connection::BuildConnVal()
TransportProto prot_type = ConnTransport(); TransportProto prot_type = ConnTransport();
RecordVal* id_val = new RecordVal(conn_id); auto id_val = make_intrusive<RecordVal>(conn_id);
id_val->Assign(0, new AddrVal(orig_addr)); id_val->Assign(0, make_intrusive<AddrVal>(orig_addr));
id_val->Assign(1, val_mgr->GetPort(ntohs(orig_port), prot_type)); id_val->Assign(1, val_mgr->GetPort(ntohs(orig_port), prot_type));
id_val->Assign(2, new AddrVal(resp_addr)); id_val->Assign(2, make_intrusive<AddrVal>(resp_addr));
id_val->Assign(3, val_mgr->GetPort(ntohs(resp_port), prot_type)); id_val->Assign(3, val_mgr->GetPort(ntohs(resp_port), prot_type));
RecordVal* orig_endp = new RecordVal(endpoint); auto orig_endp = make_intrusive<RecordVal>(endpoint);
orig_endp->Assign(0, val_mgr->GetCount(0)); orig_endp->Assign(0, val_mgr->GetCount(0));
orig_endp->Assign(1, val_mgr->GetCount(0)); orig_endp->Assign(1, val_mgr->GetCount(0));
orig_endp->Assign(4, val_mgr->GetCount(orig_flow_label)); orig_endp->Assign(4, val_mgr->GetCount(orig_flow_label));
@ -352,27 +352,27 @@ RecordVal* Connection::BuildConnVal()
char null[l2_len]{}; char null[l2_len]{};
if ( memcmp(&orig_l2_addr, &null, l2_len) != 0 ) if ( memcmp(&orig_l2_addr, &null, l2_len) != 0 )
orig_endp->Assign(5, new StringVal(fmt_mac(orig_l2_addr, l2_len))); orig_endp->Assign(5, make_intrusive<StringVal>(fmt_mac(orig_l2_addr, l2_len)));
RecordVal* resp_endp = new RecordVal(endpoint); auto resp_endp = make_intrusive<RecordVal>(endpoint);
resp_endp->Assign(0, val_mgr->GetCount(0)); resp_endp->Assign(0, val_mgr->GetCount(0));
resp_endp->Assign(1, val_mgr->GetCount(0)); resp_endp->Assign(1, val_mgr->GetCount(0));
resp_endp->Assign(4, val_mgr->GetCount(resp_flow_label)); resp_endp->Assign(4, val_mgr->GetCount(resp_flow_label));
if ( memcmp(&resp_l2_addr, &null, l2_len) != 0 ) if ( memcmp(&resp_l2_addr, &null, l2_len) != 0 )
resp_endp->Assign(5, new StringVal(fmt_mac(resp_l2_addr, l2_len))); resp_endp->Assign(5, make_intrusive<StringVal>(fmt_mac(resp_l2_addr, l2_len)));
conn_val->Assign(0, id_val); conn_val->Assign(0, std::move(id_val));
conn_val->Assign(1, orig_endp); conn_val->Assign(1, std::move(orig_endp));
conn_val->Assign(2, resp_endp); conn_val->Assign(2, std::move(resp_endp));
// 3 and 4 are set below. // 3 and 4 are set below.
conn_val->Assign(5, new TableVal(string_set)); // service conn_val->Assign(5, make_intrusive<TableVal>(IntrusivePtr{NewRef{}, string_set})); // service
conn_val->Assign(6, val_mgr->GetEmptyString()); // history conn_val->Assign(6, val_mgr->GetEmptyString()); // history
if ( ! uid ) if ( ! uid )
uid.Set(bits_per_uid); uid.Set(bits_per_uid);
conn_val->Assign(7, new StringVal(uid.Base62("C").c_str())); conn_val->Assign(7, make_intrusive<StringVal>(uid.Base62("C").c_str()));
if ( encapsulation && encapsulation->Depth() > 0 ) if ( encapsulation && encapsulation->Depth() > 0 )
conn_val->Assign(8, encapsulation->GetVectorVal()); conn_val->Assign(8, encapsulation->GetVectorVal());
@ -388,9 +388,9 @@ RecordVal* Connection::BuildConnVal()
if ( root_analyzer ) if ( root_analyzer )
root_analyzer->UpdateConnVal(conn_val); root_analyzer->UpdateConnVal(conn_val);
conn_val->Assign(3, new Val(start_time, TYPE_TIME)); // ### conn_val->Assign(3, make_intrusive<Val>(start_time, TYPE_TIME)); // ###
conn_val->Assign(4, new Val(last_time - start_time, TYPE_INTERVAL)); conn_val->Assign(4, make_intrusive<Val>(last_time - start_time, TYPE_INTERVAL));
conn_val->Assign(6, new StringVal(history.c_str())); conn_val->Assign(6, make_intrusive<StringVal>(history.c_str()));
conn_val->Assign(11, val_mgr->GetBool(is_successful)); conn_val->Assign(11, val_mgr->GetBool(is_successful));
conn_val->SetOrigin(this); conn_val->SetOrigin(this);
@ -422,7 +422,7 @@ void Connection::AppendAddl(const char* str)
const char* old = conn_val->Lookup(6)->AsString()->CheckString(); const char* old = conn_val->Lookup(6)->AsString()->CheckString();
const char* format = *old ? "%s %s" : "%s%s"; const char* format = *old ? "%s %s" : "%s%s";
conn_val->Assign(6, new StringVal(fmt(format, old, str))); conn_val->Assign(6, make_intrusive<StringVal>(fmt(format, old, str)));
} }
// Returns true if the character at s separates a version number. // Returns true if the character at s separates a version number.

View file

@ -32,11 +32,13 @@
#include <algorithm> #include <algorithm>
#include "BroString.h" #include "BroString.h"
#include "Expr.h"
#include "Event.h" #include "Event.h"
#include "Net.h" #include "Net.h"
#include "Val.h" #include "Val.h"
#include "Var.h" #include "Var.h"
#include "Reporter.h" #include "Reporter.h"
#include "IntrusivePtr.h"
#include "iosource/Manager.h" #include "iosource/Manager.h"
#include "digest.h" #include "digest.h"
@ -118,9 +120,9 @@ public:
return req_host ? req_host : req_addr.AsString(); return req_host ? req_host : req_addr.AsString();
} }
ListVal* Addrs(); IntrusivePtr<ListVal> Addrs();
TableVal* AddrsSet(); // addresses returned as a set IntrusivePtr<TableVal> AddrsSet(); // addresses returned as a set
StringVal* Host(); IntrusivePtr<StringVal> Host();
double CreationTime() const { return creation_time; } double CreationTime() const { return creation_time; }
@ -154,11 +156,11 @@ protected:
int num_names; int num_names;
char** names; char** names;
StringVal* host_val; IntrusivePtr<StringVal> host_val;
int num_addrs; int num_addrs;
IPAddr* addrs; IPAddr* addrs;
ListVal* addrs_val; IntrusivePtr<ListVal> addrs_val;
int failed; int failed;
double creation_time; double creation_time;
@ -170,13 +172,13 @@ void DNS_Mgr_mapping_delete_func(void* v)
delete (DNS_Mapping*) v; delete (DNS_Mapping*) v;
} }
static TableVal* empty_addr_set() static IntrusivePtr<TableVal> empty_addr_set()
{ {
BroType* addr_t = base_type(TYPE_ADDR); auto addr_t = base_type(TYPE_ADDR);
TypeList* set_index = new TypeList(addr_t); auto set_index = make_intrusive<TypeList>(addr_t);
set_index->Append(addr_t); set_index->Append(std::move(addr_t));
SetType* s = new SetType(set_index, 0); auto s = make_intrusive<SetType>(std::move(set_index), nullptr);
return new TableVal(s); return make_intrusive<TableVal>(std::move(s));
} }
DNS_Mapping::DNS_Mapping(const char* host, struct hostent* h, uint32_t ttl) DNS_Mapping::DNS_Mapping(const char* host, struct hostent* h, uint32_t ttl)
@ -268,48 +270,41 @@ DNS_Mapping::~DNS_Mapping()
} }
delete [] addrs; delete [] addrs;
Unref(host_val);
Unref(addrs_val);
} }
ListVal* DNS_Mapping::Addrs() IntrusivePtr<ListVal> DNS_Mapping::Addrs()
{ {
if ( failed ) if ( failed )
return 0; return nullptr;
if ( ! addrs_val ) if ( ! addrs_val )
{ {
ListVal* hv = new ListVal(TYPE_ADDR); auto addrs_val = make_intrusive<ListVal>(TYPE_ADDR);
for ( int i = 0; i < num_addrs; ++i ) for ( int i = 0; i < num_addrs; ++i )
hv->Append(new AddrVal(addrs[i])); addrs_val->Append(new AddrVal(addrs[i]));
addrs_val = hv;
} }
Ref(addrs_val);
return addrs_val; return addrs_val;
} }
TableVal* DNS_Mapping::AddrsSet() { IntrusivePtr<TableVal> DNS_Mapping::AddrsSet() {
ListVal* l = Addrs(); auto l = Addrs();
if ( ! l ) if ( ! l )
return empty_addr_set(); return empty_addr_set();
auto rval = l->ConvertToSet(); return {AdoptRef{}, l->ConvertToSet()};
Unref(l);
return rval;
} }
StringVal* DNS_Mapping::Host() IntrusivePtr<StringVal> DNS_Mapping::Host()
{ {
if ( failed || num_names == 0 || ! names[0] ) if ( failed || num_names == 0 || ! names[0] )
return 0; return 0;
if ( ! host_val ) if ( ! host_val )
host_val = new StringVal(names[0]); host_val = make_intrusive<StringVal>(names[0]);
Ref(host_val);
return host_val; return host_val;
} }
@ -475,16 +470,14 @@ void DNS_Mgr::InitPostScript()
LoadCache(fopen(cache_name, "r")); LoadCache(fopen(cache_name, "r"));
} }
static TableVal* fake_name_lookup_result(const char* name) static IntrusivePtr<TableVal> fake_name_lookup_result(const char* name)
{ {
uint32_t hash[4]; uint32_t hash[4];
internal_md5(reinterpret_cast<const u_char*>(name), strlen(name), internal_md5(reinterpret_cast<const u_char*>(name), strlen(name),
reinterpret_cast<u_char*>(hash)); reinterpret_cast<u_char*>(hash));
ListVal* hv = new ListVal(TYPE_ADDR); auto hv = make_intrusive<ListVal>(TYPE_ADDR);
hv->Append(new AddrVal(hash)); hv->Append(new AddrVal(hash));
TableVal* tv = hv->ConvertToSet(); return {AdoptRef{}, hv->ConvertToSet()};
Unref(hv);
return tv;
} }
static const char* fake_text_lookup_result(const char* name) static const char* fake_text_lookup_result(const char* name)
@ -502,7 +495,7 @@ static const char* fake_addr_lookup_result(const IPAddr& addr)
return tmp; return tmp;
} }
TableVal* DNS_Mgr::LookupHost(const char* name) IntrusivePtr<TableVal> DNS_Mgr::LookupHost(const char* name)
{ {
if ( mode == DNS_FAKE ) if ( mode == DNS_FAKE )
return fake_name_lookup_result(name); return fake_name_lookup_result(name);
@ -528,10 +521,9 @@ TableVal* DNS_Mgr::LookupHost(const char* name)
} }
else if ( d4 && d6 ) else if ( d4 && d6 )
{ {
TableVal* tv4 = d4->AddrsSet(); auto tv4 = d4->AddrsSet();
TableVal* tv6 = d6->AddrsSet(); auto tv6 = d6->AddrsSet();
tv4->AddTo(tv6, false); tv4->AddTo(tv6.get(), false);
Unref(tv4);
return tv6; return tv6;
} }
} }
@ -560,7 +552,7 @@ TableVal* DNS_Mgr::LookupHost(const char* name)
} }
} }
Val* DNS_Mgr::LookupAddr(const IPAddr& addr) IntrusivePtr<Val> DNS_Mgr::LookupAddr(const IPAddr& addr)
{ {
InitSource(); InitSource();
@ -577,7 +569,7 @@ Val* DNS_Mgr::LookupAddr(const IPAddr& addr)
{ {
string s(addr); string s(addr);
reporter->Warning("can't resolve IP address: %s", s.c_str()); reporter->Warning("can't resolve IP address: %s", s.c_str());
return new StringVal(s.c_str()); return make_intrusive<StringVal>(s.c_str());
} }
} }
} }
@ -586,7 +578,7 @@ Val* DNS_Mgr::LookupAddr(const IPAddr& addr)
switch ( mode ) { switch ( mode ) {
case DNS_PRIME: case DNS_PRIME:
requests.push_back(new DNS_Mgr_Request(addr)); requests.push_back(new DNS_Mgr_Request(addr));
return new StringVal("<none>"); return make_intrusive<StringVal>("<none>");
case DNS_FORCE: case DNS_FORCE:
reporter->FatalError("can't find DNS entry for %s in cache", reporter->FatalError("can't find DNS entry for %s in cache",
@ -712,19 +704,17 @@ void DNS_Mgr::Event(EventHandlerPtr e, DNS_Mapping* dm)
if ( ! e ) if ( ! e )
return; return;
mgr.QueueEventFast(e, {BuildMappingVal(dm)}); mgr.QueueEventFast(e, {BuildMappingVal(dm).release()});
} }
void DNS_Mgr::Event(EventHandlerPtr e, DNS_Mapping* dm, ListVal* l1, ListVal* l2) void DNS_Mgr::Event(EventHandlerPtr e, DNS_Mapping* dm,
IntrusivePtr<ListVal> l1, IntrusivePtr<ListVal> l2)
{ {
if ( ! e ) if ( ! e )
return; return;
Unref(l1);
Unref(l2);
mgr.QueueEventFast(e, { mgr.QueueEventFast(e, {
BuildMappingVal(dm), BuildMappingVal(dm).release(),
l1->ConvertToSet(), l1->ConvertToSet(),
l2->ConvertToSet(), l2->ConvertToSet(),
}); });
@ -736,22 +726,22 @@ void DNS_Mgr::Event(EventHandlerPtr e, DNS_Mapping* old_dm, DNS_Mapping* new_dm)
return; return;
mgr.QueueEventFast(e, { mgr.QueueEventFast(e, {
BuildMappingVal(old_dm), BuildMappingVal(old_dm).release(),
BuildMappingVal(new_dm), BuildMappingVal(new_dm).release(),
}); });
} }
Val* DNS_Mgr::BuildMappingVal(DNS_Mapping* dm) IntrusivePtr<Val> DNS_Mgr::BuildMappingVal(DNS_Mapping* dm)
{ {
RecordVal* r = new RecordVal(dm_rec); auto r = make_intrusive<RecordVal>(dm_rec);
r->Assign(0, new Val(dm->CreationTime(), TYPE_TIME)); r->Assign(0, make_intrusive<Val>(dm->CreationTime(), TYPE_TIME));
r->Assign(1, new StringVal(dm->ReqHost() ? dm->ReqHost() : "")); r->Assign(1, make_intrusive<StringVal>(dm->ReqHost() ? dm->ReqHost() : ""));
r->Assign(2, new AddrVal(dm->ReqAddr())); r->Assign(2, make_intrusive<AddrVal>(dm->ReqAddr()));
r->Assign(3, val_mgr->GetBool(dm->Valid())); r->Assign(3, val_mgr->GetBool(dm->Valid()));
Val* h = dm->Host(); auto h = dm->Host();
r->Assign(4, h ? h : new StringVal("<none>")); r->Assign(4, h ? h.release() : new StringVal("<none>"));
r->Assign(5, dm->AddrsSet()); r->Assign(5, dm->AddrsSet());
return r; return r;
@ -868,8 +858,8 @@ void DNS_Mgr::CompareMappings(DNS_Mapping* prev_dm, DNS_Mapping* new_dm)
return; return;
} }
StringVal* prev_s = prev_dm->Host(); auto prev_s = prev_dm->Host();
StringVal* new_s = new_dm->Host(); auto new_s = new_dm->Host();
if ( prev_s || new_s ) if ( prev_s || new_s )
{ {
@ -879,13 +869,10 @@ void DNS_Mgr::CompareMappings(DNS_Mapping* prev_dm, DNS_Mapping* new_dm)
Event(dns_mapping_lost_name, prev_dm); Event(dns_mapping_lost_name, prev_dm);
else if ( ! Bstr_eq(new_s->AsString(), prev_s->AsString()) ) else if ( ! Bstr_eq(new_s->AsString(), prev_s->AsString()) )
Event(dns_mapping_name_changed, prev_dm, new_dm); Event(dns_mapping_name_changed, prev_dm, new_dm);
Unref(prev_s);
Unref(new_s);
} }
ListVal* prev_a = prev_dm->Addrs(); auto prev_a = prev_dm->Addrs();
ListVal* new_a = new_dm->Addrs(); auto new_a = new_dm->Addrs();
if ( ! prev_a || ! new_a ) if ( ! prev_a || ! new_a )
{ {
@ -893,21 +880,16 @@ void DNS_Mgr::CompareMappings(DNS_Mapping* prev_dm, DNS_Mapping* new_dm)
return; return;
} }
ListVal* prev_delta = AddrListDelta(prev_a, new_a); auto prev_delta = AddrListDelta(prev_a.get(), new_a.get());
ListVal* new_delta = AddrListDelta(new_a, prev_a); auto new_delta = AddrListDelta(new_a.get(), prev_a.get());
if ( prev_delta->Length() > 0 || new_delta->Length() > 0 ) if ( prev_delta->Length() > 0 || new_delta->Length() > 0 )
Event(dns_mapping_altered, new_dm, prev_delta, new_delta); Event(dns_mapping_altered, new_dm, std::move(prev_delta), std::move(new_delta));
else
{
Unref(prev_delta);
Unref(new_delta);
}
} }
ListVal* DNS_Mgr::AddrListDelta(ListVal* al1, ListVal* al2) IntrusivePtr<ListVal> DNS_Mgr::AddrListDelta(ListVal* al1, ListVal* al2)
{ {
ListVal* delta = new ListVal(TYPE_ADDR); auto delta = make_intrusive<ListVal>(TYPE_ADDR);
for ( int i = 0; i < al1->Length(); ++i ) for ( int i = 0; i < al1->Length(); ++i )
{ {
@ -1015,7 +997,7 @@ const char* DNS_Mgr::LookupAddrInCache(const IPAddr& addr)
return d->names ? d->names[0] : "<\?\?\?>"; return d->names ? d->names[0] : "<\?\?\?>";
} }
TableVal* DNS_Mgr::LookupNameInCache(const string& name) IntrusivePtr<TableVal> DNS_Mgr::LookupNameInCache(const string& name)
{ {
HostMap::iterator it = host_mappings.find(name); HostMap::iterator it = host_mappings.find(name);
if ( it == host_mappings.end() ) if ( it == host_mappings.end() )
@ -1038,10 +1020,9 @@ TableVal* DNS_Mgr::LookupNameInCache(const string& name)
return 0; return 0;
} }
TableVal* tv4 = d4->AddrsSet(); auto tv4 = d4->AddrsSet();
TableVal* tv6 = d6->AddrsSet(); auto tv6 = d6->AddrsSet();
tv4->AddTo(tv6, false); tv4->AddTo(tv6.get(), false);
Unref(tv4);
return tv6; return tv6;
} }
@ -1066,10 +1047,9 @@ const char* DNS_Mgr::LookupTextInCache(const string& name)
} }
static void resolve_lookup_cb(DNS_Mgr::LookupCallback* callback, static void resolve_lookup_cb(DNS_Mgr::LookupCallback* callback,
TableVal* result) IntrusivePtr<TableVal> result)
{ {
callback->Resolved(result); callback->Resolved(result.get());
Unref(result);
delete callback; delete callback;
} }
@ -1129,10 +1109,10 @@ void DNS_Mgr::AsyncLookupName(const string& name, LookupCallback* callback)
} }
// Do we already know the answer? // Do we already know the answer?
TableVal* addrs = LookupNameInCache(name); auto addrs = LookupNameInCache(name);
if ( addrs ) if ( addrs )
{ {
resolve_lookup_cb(callback, addrs); resolve_lookup_cb(callback, std::move(addrs));
return; return;
} }
@ -1321,13 +1301,12 @@ void DNS_Mgr::CheckAsyncHostRequest(const char* host, bool timeout)
if ( i != asyncs_names.end() ) if ( i != asyncs_names.end() )
{ {
TableVal* addrs = LookupNameInCache(host); auto addrs = LookupNameInCache(host);
if ( addrs ) if ( addrs )
{ {
++successful; ++successful;
i->second->Resolved(addrs); i->second->Resolved(addrs.get());
Unref(addrs);
} }
else if ( timeout ) else if ( timeout )

View file

@ -12,6 +12,7 @@
#include "iosource/IOSource.h" #include "iosource/IOSource.h"
#include "IPAddr.h" #include "IPAddr.h"
template <class T> class IntrusivePtr;
class Val; class Val;
class ListVal; class ListVal;
class TableVal; class TableVal;
@ -47,9 +48,9 @@ public:
// Looks up the address or addresses of the given host, and returns // Looks up the address or addresses of the given host, and returns
// a set of addr. // a set of addr.
TableVal* LookupHost(const char* host); IntrusivePtr<TableVal> LookupHost(const char* host);
Val* LookupAddr(const IPAddr& addr); IntrusivePtr<Val> LookupAddr(const IPAddr& addr);
// Define the directory where to store the data. // Define the directory where to store the data.
void SetDir(const char* arg_dir) { dir = copy_string(arg_dir); } void SetDir(const char* arg_dir) { dir = copy_string(arg_dir); }
@ -59,7 +60,7 @@ public:
int Save(); int Save();
const char* LookupAddrInCache(const IPAddr& addr); const char* LookupAddrInCache(const IPAddr& addr);
TableVal* LookupNameInCache(const string& name); IntrusivePtr<TableVal> LookupNameInCache(const string& name);
const char* LookupTextInCache(const string& name); const char* LookupTextInCache(const string& name);
// Support for async lookups. // Support for async lookups.
@ -96,14 +97,15 @@ protected:
friend class DNS_Mgr_Request; friend class DNS_Mgr_Request;
void Event(EventHandlerPtr e, DNS_Mapping* dm); void Event(EventHandlerPtr e, DNS_Mapping* dm);
void Event(EventHandlerPtr e, DNS_Mapping* dm, ListVal* l1, ListVal* l2); void Event(EventHandlerPtr e, DNS_Mapping* dm,
IntrusivePtr<ListVal> l1, IntrusivePtr<ListVal> l2);
void Event(EventHandlerPtr e, DNS_Mapping* old_dm, DNS_Mapping* new_dm); void Event(EventHandlerPtr e, DNS_Mapping* old_dm, DNS_Mapping* new_dm);
Val* BuildMappingVal(DNS_Mapping* dm); IntrusivePtr<Val> BuildMappingVal(DNS_Mapping* dm);
void AddResult(DNS_Mgr_Request* dr, struct nb_dns_result* r); void AddResult(DNS_Mgr_Request* dr, struct nb_dns_result* r);
void CompareMappings(DNS_Mapping* prev_dm, DNS_Mapping* new_dm); void CompareMappings(DNS_Mapping* prev_dm, DNS_Mapping* new_dm);
ListVal* AddrListDelta(ListVal* al1, ListVal* al2); IntrusivePtr<ListVal> AddrListDelta(ListVal* al1, ListVal* al2);
void DumpAddrList(FILE* f, ListVal* al); void DumpAddrList(FILE* f, ListVal* al);
typedef map<string, pair<DNS_Mapping*, DNS_Mapping*> > HostMap; typedef map<string, pair<DNS_Mapping*, DNS_Mapping*> > HostMap;

View file

@ -234,7 +234,7 @@ static void parse_function_name(vector<ParseLocationRec>& result,
Stmt* body = 0; // the particular body we care about; 0 = all Stmt* body = 0; // the particular body we care about; 0 = all
if ( bodies.size() == 1 ) if ( bodies.size() == 1 )
body = bodies[0].stmts; body = bodies[0].stmts.get();
else else
{ {
while ( 1 ) while ( 1 )
@ -245,8 +245,7 @@ static void parse_function_name(vector<ParseLocationRec>& result,
{ {
Stmt* first; Stmt* first;
Location stmt_loc; Location stmt_loc;
get_first_statement(bodies[i].stmts, first, get_first_statement(bodies[i].stmts.get(), first, stmt_loc);
stmt_loc);
debug_msg("[%d] %s:%d\n", i+1, stmt_loc.filename, stmt_loc.first_line); debug_msg("[%d] %s:%d\n", i+1, stmt_loc.filename, stmt_loc.first_line);
} }
@ -278,7 +277,7 @@ static void parse_function_name(vector<ParseLocationRec>& result,
int option = atoi(input.c_str()); int option = atoi(input.c_str());
if ( option > 0 && option <= (int) bodies.size() ) if ( option > 0 && option <= (int) bodies.size() )
{ {
body = bodies[option - 1].stmts; body = bodies[option - 1].stmts.get();
break; break;
} }
} }
@ -308,7 +307,7 @@ static void parse_function_name(vector<ParseLocationRec>& result,
for ( unsigned int i = 0; i < bodies.size(); ++i ) for ( unsigned int i = 0; i < bodies.size(); ++i )
{ {
get_first_statement(bodies[i].stmts, first, stmt_loc); get_first_statement(bodies[i].stmts.get(), first, stmt_loc);
if ( ! first ) if ( ! first )
continue; continue;

View file

@ -62,7 +62,7 @@ void lookup_global_symbols_regex(const string& orig_regex, vector<ID*>& matches,
ID* nextid; ID* nextid;
for ( const auto& sym : syms ) for ( const auto& sym : syms )
{ {
ID* nextid = sym.second; ID* nextid = sym.second.get();
if ( ! func_only || nextid->Type()->Tag() == TYPE_FUNC ) if ( ! func_only || nextid->Type()->Tag() == TYPE_FUNC )
if ( ! regexec (&re, nextid->Name(), 0, 0, 0) ) if ( ! regexec (&re, nextid->Name(), 0, 0, 0) )
matches.push_back(nextid); matches.push_back(nextid);

View file

@ -114,7 +114,7 @@ void EventHandler::Call(val_list* vl, bool no_remote)
if ( local ) if ( local )
// No try/catch here; we pass exceptions upstream. // No try/catch here; we pass exceptions upstream.
Unref(local->Call(vl)); local->Call(vl);
else else
{ {
for ( auto v : *vl ) for ( auto v : *vl )
@ -138,21 +138,18 @@ 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);
RecordVal* rec = new RecordVal(call_argument); auto rec = make_intrusive<RecordVal>(call_argument);
rec->Assign(0, new StringVal(fname)); rec->Assign(0, make_intrusive<StringVal>(fname));
ODesc d; ODesc d;
d.SetShort(); d.SetShort();
ftype->Describe(&d); ftype->Describe(&d);
rec->Assign(1, new 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] )
{ {
@ -161,7 +158,7 @@ void EventHandler::NewEvent(val_list* vl)
rec->Assign(3, val); rec->Assign(3, val);
} }
vargs->Assign(i, rec); vargs->Assign(i, std::move(rec));
} }
Event* ev = new Event(new_event, { Event* ev = new Event(new_event, {

File diff suppressed because it is too large Load diff

View file

@ -8,6 +8,7 @@
#include "Type.h" #include "Type.h"
#include "EventHandler.h" #include "EventHandler.h"
#include "TraverseTypes.h" #include "TraverseTypes.h"
#include "Val.h"
#include <memory> #include <memory>
#include <string> #include <string>
@ -924,7 +925,13 @@ IntrusivePtr<Expr> get_assign_expr(IntrusivePtr<Expr> op1,
// types or a single type. // types or a single type.
// //
// Note, the type is not "const" because it can be ref'd. // Note, the type is not "const" because it can be ref'd.
extern int check_and_promote_expr(Expr*& e, BroType* t);
/**
* Returns nullptr if the expression cannot match or a promoted
* expression.
*/
extern IntrusivePtr<Expr> check_and_promote_expr(Expr* e, BroType* t);
extern int check_and_promote_exprs(ListExpr* elements, TypeList* types); extern int check_and_promote_exprs(ListExpr* elements, TypeList* types);
extern int check_and_promote_args(ListExpr* args, RecordType* types); extern int check_and_promote_args(ListExpr* args, RecordType* types);
extern int check_and_promote_exprs_to_type(ListExpr* elements, BroType* type); extern int check_and_promote_exprs_to_type(ListExpr* elements, BroType* type);

View file

@ -71,13 +71,13 @@ BroFile::BroFile(FILE* arg_f, const char* arg_name, const char* arg_access)
is_open = (f != 0); is_open = (f != 0);
} }
BroFile::BroFile(const char* arg_name, const char* arg_access, BroType* arg_t) BroFile::BroFile(const char* arg_name, const char* arg_access)
{ {
Init(); Init();
f = 0; f = 0;
name = copy_string(arg_name); name = copy_string(arg_name);
access = copy_string(arg_access); access = copy_string(arg_access);
t = arg_t ? arg_t : base_type(TYPE_STRING); t = base_type(TYPE_STRING);
if ( streq(name, "/dev/stdin") ) if ( streq(name, "/dev/stdin") )
f = stdin; f = stdin;
@ -154,7 +154,6 @@ bool BroFile::Open(FILE* file, const char* mode)
BroFile::~BroFile() BroFile::~BroFile()
{ {
Close(); Close();
Unref(t);
Unref(attrs); Unref(attrs);
delete [] name; delete [] name;
@ -171,7 +170,6 @@ void BroFile::Init()
attrs = 0; attrs = 0;
buffered = true; buffered = true;
raw_output = false; raw_output = false;
t = 0;
#ifdef USE_PERFTOOLS_DEBUG #ifdef USE_PERFTOOLS_DEBUG
heap_checker->IgnoreObject(this); heap_checker->IgnoreObject(this);
@ -286,7 +284,7 @@ RecordVal* BroFile::Rotate()
return 0; return 0;
} }
info->Assign(2, new Val(open_time, TYPE_TIME)); info->Assign(2, make_intrusive<Val>(open_time, TYPE_TIME));
Unlink(); Unlink();
@ -355,6 +353,6 @@ BroFile* BroFile::GetFile(const char* name)
} }
} }
return new BroFile(name, "w", 0); return new BroFile(name, "w");
} }

View file

@ -3,6 +3,7 @@
#pragma once #pragma once
#include "Obj.h" #include "Obj.h"
#include "IntrusivePtr.h"
#include <list> #include <list>
#include <string> #include <string>
@ -22,7 +23,7 @@ class BroFile : public BroObj {
public: public:
explicit BroFile(FILE* arg_f); explicit BroFile(FILE* arg_f);
BroFile(FILE* arg_f, const char* filename, const char* access); BroFile(FILE* arg_f, const char* filename, const char* access);
BroFile(const char* filename, const char* access, BroType* arg_t = 0); BroFile(const char* filename, const char* access);
~BroFile() override; ~BroFile() override;
const char* Name() const; const char* Name() const;
@ -36,7 +37,7 @@ public:
void SetBuf(bool buffered); // false=line buffered, true=fully buffered void SetBuf(bool buffered); // false=line buffered, true=fully buffered
BroType* FType() const { return t; } BroType* FType() const { return t.get(); }
// Whether the file is open in a general sense; it might // Whether the file is open in a general sense; it might
// not be open as a Unix file due to our management of // not be open as a Unix file due to our management of
@ -93,7 +94,7 @@ protected:
void RaiseOpenEvent(); void RaiseOpenEvent();
FILE* f; FILE* f;
BroType* t; IntrusivePtr<BroType> t;
char* name; char* name;
char* access; char* access;
int is_open; // whether the file is open in a general sense int is_open; // whether the file is open in a general sense

View file

@ -25,7 +25,6 @@ Frame::Frame(int arg_size, const BroFunc* func, const val_list* fn_args)
break_before_next_stmt = false; break_before_next_stmt = false;
break_on_return = false; break_on_return = false;
trigger = nullptr;
call = nullptr; call = nullptr;
delayed = false; delayed = false;
@ -43,9 +42,6 @@ Frame::~Frame()
Unref(func); Unref(func);
} }
// Deleting a Frame that is a view is a no-op.
Unref(trigger);
if ( ! weak_closure_ref ) if ( ! weak_closure_ref )
Unref(closure); Unref(closure);
@ -183,11 +179,9 @@ Frame* Frame::Clone() const
other->call = call; other->call = call;
other->trigger = trigger; other->trigger = trigger;
if ( trigger )
Ref(trigger);
for (int i = 0; i < size; i++) for (int i = 0; i < size; i++)
other->frame[i] = frame[i] ? frame[i]->Clone() : nullptr; other->frame[i] = frame[i] ? frame[i]->Clone().release() : nullptr;
return other; return other;
} }
@ -200,23 +194,22 @@ static bool val_is_func(Val* v, BroFunc* func)
return v->AsFunc() == func; return v->AsFunc() == func;
} }
static Val* clone_if_not_func(Val** frame, int offset, BroFunc* func, static void clone_if_not_func(Val** frame, int offset, BroFunc* func,
Frame* other) Frame* other)
{ {
auto v = frame[offset]; auto v = frame[offset];
if ( ! v ) if ( ! v )
return nullptr; return;
if ( val_is_func(v, func) ) if ( val_is_func(v, func) )
{ {
other->SetElement(offset, v, true); other->SetElement(offset, v, true);
return v; return;
} }
auto rval = v->Clone(); auto rval = v->Clone();
other->SetElement(offset, rval); other->SetElement(offset, rval.release());
return rval;
} }
Frame* Frame::SelectiveClone(const id_list& selection, BroFunc* func) const Frame* Frame::SelectiveClone(const id_list& selection, BroFunc* func) const
@ -359,14 +352,14 @@ broker::expected<broker::data> Frame::Serialize(const Frame* target, const id_li
return {std::move(rval)}; return {std::move(rval)};
} }
std::pair<bool, Frame*> Frame::Unserialize(const broker::vector& data) std::pair<bool, IntrusivePtr<Frame>> Frame::Unserialize(const broker::vector& data)
{ {
if ( data.size() == 0 ) if ( data.size() == 0 )
return std::make_pair(true, nullptr); return std::make_pair(true, nullptr);
id_list outer_ids; id_list outer_ids;
std::unordered_map<std::string, int> offset_map; std::unordered_map<std::string, int> offset_map;
Frame* closure = nullptr; IntrusivePtr<Frame> closure;
auto where = data.begin(); auto where = data.begin();
@ -410,7 +403,7 @@ std::pair<bool, Frame*> Frame::Unserialize(const broker::vector& data)
return std::make_pair(false, nullptr); return std::make_pair(false, nullptr);
} }
closure = closure_pair.second; closure = std::move(closure_pair.second);
} }
auto has_vec = broker::get_if<broker::vector>(*where); auto has_vec = broker::get_if<broker::vector>(*where);
@ -448,11 +441,11 @@ std::pair<bool, Frame*> Frame::Unserialize(const broker::vector& data)
int frame_size = body.size(); int frame_size = body.size();
// We'll associate this frame with a function later. // We'll associate this frame with a function later.
Frame* rf = new Frame(frame_size, nullptr, nullptr); auto rf = make_intrusive<Frame>(frame_size, nullptr, nullptr);
rf->offset_map = std::move(offset_map); rf->offset_map = std::move(offset_map);
// Frame takes ownership of unref'ing elements in outer_ids // Frame takes ownership of unref'ing elements in outer_ids
rf->outer_ids = std::move(outer_ids); rf->outer_ids = std::move(outer_ids);
rf->closure = closure; rf->closure = closure.release();
rf->weak_closure_ref = false; rf->weak_closure_ref = false;
for ( int i = 0; i < frame_size; ++i ) for ( int i = 0; i < frame_size; ++i )
@ -463,32 +456,23 @@ std::pair<bool, Frame*> Frame::Unserialize(const broker::vector& data)
broker::vector val_tuple = *has_vec; broker::vector val_tuple = *has_vec;
if ( val_tuple.size() != 2 ) if ( val_tuple.size() != 2 )
{
Unref(rf);
return std::make_pair(false, nullptr); return std::make_pair(false, nullptr);
}
auto has_type = broker::get_if<broker::integer>(val_tuple[1]); auto has_type = broker::get_if<broker::integer>(val_tuple[1]);
if ( ! has_type ) if ( ! has_type )
{
Unref(rf);
return std::make_pair(false, nullptr); return std::make_pair(false, nullptr);
}
broker::integer g = *has_type; broker::integer g = *has_type;
BroType t( static_cast<TypeTag>(g) ); BroType t( static_cast<TypeTag>(g) );
auto val = bro_broker::data_to_val(std::move(val_tuple[0]), &t); auto val = bro_broker::data_to_val(std::move(val_tuple[0]), &t);
if ( ! val ) if ( ! val )
{
Unref(rf);
return std::make_pair(false, nullptr); return std::make_pair(false, nullptr);
}
rf->frame[i] = val.release(); rf->frame[i] = val.release();
} }
return std::make_pair(true, rf); return std::make_pair(true, std::move(rf));
} }
void Frame::AddKnownOffsets(const id_list& ids) void Frame::AddKnownOffsets(const id_list& ids)
@ -521,19 +505,13 @@ void Frame::CaptureClosure(Frame* c, id_list arg_outer_ids)
// if (c) closure = c->SelectiveClone(outer_ids); // if (c) closure = c->SelectiveClone(outer_ids);
} }
void Frame::SetTrigger(trigger::Trigger* arg_trigger) void Frame::SetTrigger(IntrusivePtr<trigger::Trigger> arg_trigger)
{ {
ClearTrigger(); trigger = std::move(arg_trigger);
if ( arg_trigger )
Ref(arg_trigger);
trigger = arg_trigger;
} }
void Frame::ClearTrigger() void Frame::ClearTrigger()
{ {
Unref(trigger);
trigger = nullptr; trigger = nullptr;
} }

View file

@ -4,6 +4,7 @@
#include "BroList.h" // for typedef val_list #include "BroList.h" // for typedef val_list
#include "Obj.h" #include "Obj.h"
#include "IntrusivePtr.h"
#include <unordered_map> #include <unordered_map>
#include <string> #include <string>
@ -189,7 +190,7 @@ public:
* and the second is the unserialized frame with reference count +1, or * and the second is the unserialized frame with reference count +1, or
* null if the serialization wasn't successful. * null if the serialization wasn't successful.
*/ */
static std::pair<bool, Frame*> Unserialize(const broker::vector& data); static std::pair<bool, IntrusivePtr<Frame>> Unserialize(const broker::vector& data);
/** /**
* Sets the IDs that the frame knows offsets for. These offsets will * Sets the IDs that the frame knows offsets for. These offsets will
@ -210,9 +211,9 @@ public:
// If the frame is run in the context of a trigger condition evaluation, // If the frame is run in the context of a trigger condition evaluation,
// the trigger needs to be registered. // the trigger needs to be registered.
void SetTrigger(trigger::Trigger* arg_trigger); void SetTrigger(IntrusivePtr<trigger::Trigger> arg_trigger);
void ClearTrigger(); void ClearTrigger();
trigger::Trigger* GetTrigger() const { return trigger; } trigger::Trigger* GetTrigger() const { return trigger.get(); }
void SetCall(const CallExpr* arg_call) { call = arg_call; } void SetCall(const CallExpr* arg_call) { call = arg_call; }
void ClearCall() { call = 0; } void ClearCall() { call = 0; }
@ -290,7 +291,7 @@ private:
bool break_before_next_stmt; bool break_before_next_stmt;
bool break_on_return; bool break_on_return;
trigger::Trigger* trigger; IntrusivePtr<trigger::Trigger> trigger;
const CallExpr* call; const CallExpr* call;
bool delayed; bool delayed;

View file

@ -111,35 +111,36 @@ std::string render_call_stack()
return rval; return rval;
} }
Func::Func() : scope(0), type(0) Func::Func()
{ {
unique_id = unique_ids.size(); unique_id = unique_ids.size();
unique_ids.push_back(this); unique_ids.push_back(this);
} }
Func::Func(Kind arg_kind) : scope(0), kind(arg_kind), type(0) Func::Func(Kind arg_kind) : kind(arg_kind)
{ {
unique_id = unique_ids.size(); unique_id = unique_ids.size();
unique_ids.push_back(this); unique_ids.push_back(this);
} }
Func::~Func() Func::~Func() = default;
{
Unref(type);
}
void Func::AddBody(Stmt* /* new_body */, id_list* /* new_inits */, void Func::AddBody(IntrusivePtr<Stmt> /* new_body */, id_list* /* new_inits */,
size_t /* new_frame_size */, int /* priority */) size_t /* new_frame_size */, int /* priority */)
{ {
Internal("Func::AddBody called"); Internal("Func::AddBody called");
} }
Func* Func::DoClone() void Func::SetScope(IntrusivePtr<Scope> newscope)
{
scope = std::move(newscope);
}
IntrusivePtr<Func> Func::DoClone()
{ {
// By default, ok just to return a reference. Func does not have any state // By default, ok just to return a reference. Func does not have any state
// that is different across instances. // that is different across instances.
::Ref(this); return {NewRef{}, this};
return this;
} }
void Func::DescribeDebug(ODesc* d, const val_list* args) const void Func::DescribeDebug(ODesc* d, const val_list* args) const
@ -180,7 +181,7 @@ TraversalCode Func::Traverse(TraversalCallback* cb) const
{ {
// FIXME: Make a fake scope for builtins? // FIXME: Make a fake scope for builtins?
Scope* old_scope = cb->current_scope; Scope* old_scope = cb->current_scope;
cb->current_scope = scope; cb->current_scope = scope.get();
TraversalCode tc = cb->PreFunction(this); TraversalCode tc = cb->PreFunction(this);
HANDLE_TC_STMT_PRE(tc); HANDLE_TC_STMT_PRE(tc);
@ -206,13 +207,10 @@ TraversalCode Func::Traverse(TraversalCallback* cb) const
void Func::CopyStateInto(Func* other) const void Func::CopyStateInto(Func* other) const
{ {
std::for_each(bodies.begin(), bodies.end(), [](const Body& b) { Ref(b.stmts); });
other->bodies = bodies; other->bodies = bodies;
other->scope = scope; other->scope = scope;
other->kind = kind; other->kind = kind;
Ref(type);
other->type = type; other->type = type;
other->name = name; other->name = name;
@ -273,17 +271,18 @@ std::pair<bool, Val*> Func::HandlePluginResult(std::pair<bool, Val*> plugin_resu
return plugin_result; return plugin_result;
} }
BroFunc::BroFunc(ID* arg_id, Stmt* arg_body, id_list* aggr_inits, BroFunc::BroFunc(ID* arg_id, IntrusivePtr<Stmt> arg_body, id_list* aggr_inits,
size_t arg_frame_size, int priority) : Func(BRO_FUNC) size_t arg_frame_size, int priority)
: Func(BRO_FUNC)
{ {
name = arg_id->Name(); name = arg_id->Name();
type = arg_id->Type()->Ref(); type = {NewRef{}, arg_id->Type()};
frame_size = arg_frame_size; frame_size = arg_frame_size;
if ( arg_body ) if ( arg_body )
{ {
Body b; Body b;
b.stmts = AddInits(arg_body, aggr_inits); b.stmts = AddInits(std::move(arg_body), aggr_inits);
b.priority = priority; b.priority = priority;
bodies.push_back(b); bodies.push_back(b);
} }
@ -291,9 +290,6 @@ BroFunc::BroFunc(ID* arg_id, Stmt* arg_body, id_list* aggr_inits,
BroFunc::~BroFunc() BroFunc::~BroFunc()
{ {
std::for_each(bodies.begin(), bodies.end(),
[](Body& b) { Unref(b.stmts); });
if ( ! weak_closure_ref ) if ( ! weak_closure_ref )
Unref(closure); Unref(closure);
} }
@ -304,7 +300,7 @@ int BroFunc::IsPure() const
[](const Body& b) { return b.stmts->IsPure(); }); [](const Body& b) { return b.stmts->IsPure(); });
} }
Val* BroFunc::Call(val_list* args, Frame* parent) const IntrusivePtr<Val> BroFunc::Call(val_list* args, Frame* parent) const
{ {
#ifdef PROFILE_BRO_FUNCTIONS #ifdef PROFILE_BRO_FUNCTIONS
DEBUG_MSG("Function: %s\n", Name()); DEBUG_MSG("Function: %s\n", Name());
@ -319,10 +315,7 @@ Val* BroFunc::Call(val_list* args, Frame* parent) const
plugin_result = HandlePluginResult(plugin_result, args, Flavor()); plugin_result = HandlePluginResult(plugin_result, args, Flavor());
if( plugin_result.first ) if( plugin_result.first )
{ return {AdoptRef{}, plugin_result.second};
Val *result = plugin_result.second;
return result;
}
if ( bodies.empty() ) if ( bodies.empty() )
{ {
@ -331,10 +324,10 @@ Val* BroFunc::Call(val_list* args, Frame* parent) const
for ( const auto& arg : *args ) for ( const auto& arg : *args )
Unref(arg); Unref(arg);
return Flavor() == FUNC_FLAVOR_HOOK ? val_mgr->GetTrue() : 0; return Flavor() == FUNC_FLAVOR_HOOK ? IntrusivePtr{AdoptRef{}, val_mgr->GetTrue()} : nullptr;
} }
Frame* f = new Frame(frame_size, this, args); auto f = make_intrusive<Frame>(frame_size, this, args);
if ( closure ) if ( closure )
f->CaptureClosure(closure, outer_ids); f->CaptureClosure(closure, outer_ids);
@ -342,11 +335,11 @@ Val* BroFunc::Call(val_list* args, Frame* parent) const
// Hand down any trigger. // Hand down any trigger.
if ( parent ) if ( parent )
{ {
f->SetTrigger(parent->GetTrigger()); f->SetTrigger({NewRef{}, parent->GetTrigger()});
f->SetCall(parent->GetCall()); f->SetCall(parent->GetCall());
} }
g_frame_stack.push_back(f); // used for backtracing g_frame_stack.push_back(f.get()); // used for backtracing
const CallExpr* call_expr = parent ? parent->GetCall() : nullptr; const CallExpr* call_expr = parent ? parent->GetCall() : nullptr;
call_stack.emplace_back(CallInfo{call_expr, this, args}); call_stack.emplace_back(CallInfo{call_expr, this, args});
@ -360,7 +353,7 @@ Val* BroFunc::Call(val_list* args, Frame* parent) const
} }
stmt_flow_type flow = FLOW_NEXT; stmt_flow_type flow = FLOW_NEXT;
Val* result = 0; IntrusivePtr<Val> result;
for ( const auto& body : bodies ) for ( const auto& body : bodies )
{ {
@ -368,8 +361,6 @@ Val* BroFunc::Call(val_list* args, Frame* parent) const
sample_logger->LocationSeen( sample_logger->LocationSeen(
body.stmts->GetLocationInfo()); body.stmts->GetLocationInfo());
Unref(result);
// Fill in the rest of the frame with the function's arguments. // Fill in the rest of the frame with the function's arguments.
loop_over_list(*args, j) loop_over_list(*args, j)
{ {
@ -387,7 +378,7 @@ Val* BroFunc::Call(val_list* args, Frame* parent) const
try try
{ {
result = body.stmts->Exec(f, flow).release(); result = body.stmts->Exec(f.get(), flow);
} }
catch ( InterpreterException& e ) catch ( InterpreterException& e )
@ -397,7 +388,6 @@ Val* BroFunc::Call(val_list* args, Frame* parent) const
{ {
g_frame_stack.pop_back(); g_frame_stack.pop_back();
call_stack.pop_back(); call_stack.pop_back();
Unref(f);
// Result not set b/c exception was thrown // Result not set b/c exception was thrown
throw; throw;
} }
@ -418,13 +408,12 @@ Val* BroFunc::Call(val_list* args, Frame* parent) const
{ {
// Ignore any return values of hook bodies, final return value // Ignore any return values of hook bodies, final return value
// depends on whether a body returns as a result of break statement. // depends on whether a body returns as a result of break statement.
Unref(result); result = nullptr;
result = 0;
if ( flow == FLOW_BREAK ) if ( flow == FLOW_BREAK )
{ {
// Short-circuit execution of remaining hook handler bodies. // Short-circuit execution of remaining hook handler bodies.
result = val_mgr->GetFalse(); result = {AdoptRef{}, val_mgr->GetFalse()};
break; break;
} }
} }
@ -440,7 +429,7 @@ Val* BroFunc::Call(val_list* args, Frame* parent) const
if ( Flavor() == FUNC_FLAVOR_HOOK ) if ( Flavor() == FUNC_FLAVOR_HOOK )
{ {
if ( ! result ) if ( ! result )
result = val_mgr->GetTrue(); result = {AdoptRef{}, val_mgr->GetTrue()};
} }
// Warn if the function returns something, but we returned from // Warn if the function returns something, but we returned from
@ -462,25 +451,21 @@ Val* BroFunc::Call(val_list* args, Frame* parent) const
g_frame_stack.pop_back(); g_frame_stack.pop_back();
Unref(f);
return result; return result;
} }
void BroFunc::AddBody(Stmt* new_body, id_list* new_inits, void BroFunc::AddBody(IntrusivePtr<Stmt> new_body, id_list* new_inits,
size_t new_frame_size, int priority) size_t new_frame_size, int priority)
{ {
if ( new_frame_size > frame_size ) if ( new_frame_size > frame_size )
frame_size = new_frame_size; frame_size = new_frame_size;
new_body = AddInits(new_body, new_inits); new_body = AddInits(std::move(new_body), new_inits);
if ( Flavor() == FUNC_FLAVOR_FUNCTION ) if ( Flavor() == FUNC_FLAVOR_FUNCTION )
{ {
// For functions, we replace the old body with the new one. // For functions, we replace the old body with the new one.
assert(bodies.size() <= 1); assert(bodies.size() <= 1);
for ( const auto& body : bodies )
Unref(body.stmts);
bodies.clear(); bodies.clear();
} }
@ -535,10 +520,12 @@ void BroFunc::SetClosureFrame(Frame* f)
bool BroFunc::UpdateClosure(const broker::vector& data) bool BroFunc::UpdateClosure(const broker::vector& data)
{ {
auto result = Frame::Unserialize(data); auto result = Frame::Unserialize(data);
if ( ! result.first ) if ( ! result.first )
return false; return false;
Frame* new_closure = result.second; auto& new_closure = result.second;
if ( new_closure ) if ( new_closure )
new_closure->SetFunction(this); new_closure->SetFunction(this);
@ -546,19 +533,19 @@ bool BroFunc::UpdateClosure(const broker::vector& data)
Unref(closure); Unref(closure);
weak_closure_ref = false; weak_closure_ref = false;
closure = new_closure; closure = new_closure.release();
return true; return true;
} }
Func* BroFunc::DoClone() IntrusivePtr<Func> BroFunc::DoClone()
{ {
// BroFunc could hold a closure. In this case a clone of it must // BroFunc could hold a closure. In this case a clone of it must
// store a copy of this closure. // store a copy of this closure.
BroFunc* other = new BroFunc(); auto other = IntrusivePtr{AdoptRef{}, new BroFunc()};
CopyStateInto(other); CopyStateInto(other.get());
other->frame_size = frame_size; other->frame_size = frame_size;
other->closure = closure ? closure->SelectiveClone(outer_ids, this) : nullptr; other->closure = closure ? closure->SelectiveClone(outer_ids, this) : nullptr;
@ -586,14 +573,14 @@ void BroFunc::Describe(ODesc* d) const
} }
} }
Stmt* BroFunc::AddInits(Stmt* body, id_list* inits) IntrusivePtr<Stmt> BroFunc::AddInits(IntrusivePtr<Stmt> body, id_list* inits)
{ {
if ( ! inits || inits->length() == 0 ) if ( ! inits || inits->length() == 0 )
return body; return body;
StmtList* stmt_series = new StmtList; auto stmt_series = make_intrusive<StmtList>();
stmt_series->Stmts().push_back(new InitStmt(inits)); stmt_series->Stmts().push_back(new InitStmt(inits));
stmt_series->Stmts().push_back(body); stmt_series->Stmts().push_back(body.release());
return stmt_series; return stmt_series;
} }
@ -612,7 +599,7 @@ BuiltinFunc::BuiltinFunc(built_in_func arg_func, const char* arg_name,
if ( id->HasVal() ) if ( id->HasVal() )
reporter->InternalError("built-in function %s multiply defined", Name()); reporter->InternalError("built-in function %s multiply defined", Name());
type = id->Type()->Ref(); type = {NewRef{}, id->Type()};
id->SetVal(make_intrusive<Val>(this)); id->SetVal(make_intrusive<Val>(this));
} }
@ -625,7 +612,7 @@ int BuiltinFunc::IsPure() const
return is_pure; return is_pure;
} }
Val* BuiltinFunc::Call(val_list* args, Frame* parent) const IntrusivePtr<Val> BuiltinFunc::Call(val_list* args, Frame* parent) const
{ {
#ifdef PROFILE_BRO_FUNCTIONS #ifdef PROFILE_BRO_FUNCTIONS
DEBUG_MSG("Function: %s\n", Name()); DEBUG_MSG("Function: %s\n", Name());
@ -640,10 +627,7 @@ Val* BuiltinFunc::Call(val_list* args, Frame* parent) const
plugin_result = HandlePluginResult(plugin_result, args, FUNC_FLAVOR_FUNCTION); plugin_result = HandlePluginResult(plugin_result, args, FUNC_FLAVOR_FUNCTION);
if ( plugin_result.first ) if ( plugin_result.first )
{ return {AdoptRef{}, plugin_result.second};
Val *result = plugin_result.second;
return result;
}
if ( g_trace_state.DoTrace() ) if ( g_trace_state.DoTrace() )
{ {
@ -655,7 +639,7 @@ Val* BuiltinFunc::Call(val_list* args, Frame* parent) const
const CallExpr* call_expr = parent ? parent->GetCall() : nullptr; const CallExpr* call_expr = parent ? parent->GetCall() : nullptr;
call_stack.emplace_back(CallInfo{call_expr, this, args}); call_stack.emplace_back(CallInfo{call_expr, this, args});
Val* result = func(parent, args); IntrusivePtr<Val> result{AdoptRef{}, func(parent, args)};
call_stack.pop_back(); call_stack.pop_back();
for ( const auto& arg : *args ) for ( const auto& arg : *args )
@ -885,29 +869,22 @@ static int get_func_priority(const attr_list& attrs)
return priority; return priority;
} }
function_ingredients::function_ingredients(Scope* scope, Stmt* body) function_ingredients::function_ingredients(IntrusivePtr<Scope> scope, IntrusivePtr<Stmt> body)
{ {
frame_size = scope->Length(); frame_size = scope->Length();
inits = scope->GetInits(); inits = scope->GetInits();
this->scope = scope; this->scope = std::move(scope);
::Ref(this->scope); id = {NewRef{}, this->scope->ScopeID()};
id = scope->ScopeID();
::Ref(id);
auto attrs = scope->Attrs(); auto attrs = this->scope->Attrs();
priority = (attrs ? get_func_priority(*attrs) : 0); priority = (attrs ? get_func_priority(*attrs) : 0);
this->body = body; this->body = std::move(body);
::Ref(this->body);
} }
function_ingredients::~function_ingredients() function_ingredients::~function_ingredients()
{ {
Unref(id);
Unref(body);
Unref(scope);
for ( const auto& i : *inits ) for ( const auto& i : *inits )
Unref(i); Unref(i);

View file

@ -4,6 +4,7 @@
#include "BroList.h" #include "BroList.h"
#include "Obj.h" #include "Obj.h"
#include "IntrusivePtr.h"
#include "Type.h" /* for function_flavor */ #include "Type.h" /* for function_flavor */
#include "TraverseTypes.h" #include "TraverseTypes.h"
@ -40,7 +41,7 @@ public:
function_flavor Flavor() const { return FType()->Flavor(); } function_flavor Flavor() const { return FType()->Flavor(); }
struct Body { struct Body {
Stmt* stmts; IntrusivePtr<Stmt> stmts;
int priority; int priority;
bool operator<(const Body& other) const bool operator<(const Body& other) const
{ return priority > other.priority; } // reverse sort { return priority > other.priority; } // reverse sort
@ -49,15 +50,14 @@ public:
const vector<Body>& GetBodies() const { return bodies; } const vector<Body>& GetBodies() const { return bodies; }
bool HasBodies() const { return bodies.size(); } bool HasBodies() const { return bodies.size(); }
// virtual Val* Call(ListExpr* args) const = 0; virtual IntrusivePtr<Val> Call(val_list* args, Frame* parent = 0) const = 0;
virtual Val* Call(val_list* args, Frame* parent = 0) const = 0;
// Add a new event handler to an existing function (event). // Add a new event handler to an existing function (event).
virtual void AddBody(Stmt* new_body, id_list* new_inits, virtual void AddBody(IntrusivePtr<Stmt> new_body, id_list* new_inits,
size_t new_frame_size, int priority = 0); size_t new_frame_size, int priority = 0);
virtual void SetScope(Scope* newscope) { scope = newscope; } virtual void SetScope(IntrusivePtr<Scope> newscope);
virtual Scope* GetScope() const { return scope; } virtual Scope* GetScope() const { return scope.get(); }
virtual FuncType* FType() const { return type->AsFuncType(); } virtual FuncType* FType() const { return type->AsFuncType(); }
@ -69,7 +69,7 @@ public:
void Describe(ODesc* d) const override = 0; void Describe(ODesc* d) const override = 0;
virtual void DescribeDebug(ODesc* d, const val_list* args) const; virtual void DescribeDebug(ODesc* d, const val_list* args) const;
virtual Func* DoClone(); virtual IntrusivePtr<Func> DoClone();
virtual TraversalCode Traverse(TraversalCallback* cb) const; virtual TraversalCode Traverse(TraversalCallback* cb) const;
@ -87,9 +87,9 @@ protected:
std::pair<bool, Val*> HandlePluginResult(std::pair<bool, Val*> plugin_result, val_list* args, function_flavor flavor) const; std::pair<bool, Val*> HandlePluginResult(std::pair<bool, Val*> plugin_result, val_list* args, function_flavor flavor) const;
vector<Body> bodies; vector<Body> bodies;
Scope* scope; IntrusivePtr<Scope> scope;
Kind kind; Kind kind;
BroType* type; IntrusivePtr<BroType> type;
string name; string name;
uint32_t unique_id; uint32_t unique_id;
static vector<Func*> unique_ids; static vector<Func*> unique_ids;
@ -98,11 +98,11 @@ protected:
class BroFunc : public Func { class BroFunc : public Func {
public: public:
BroFunc(ID* id, Stmt* body, id_list* inits, size_t frame_size, int priority); BroFunc(ID* id, IntrusivePtr<Stmt> body, id_list* inits, size_t frame_size, int priority);
~BroFunc() override; ~BroFunc() override;
int IsPure() const override; int IsPure() const override;
Val* Call(val_list* args, Frame* parent) const override; IntrusivePtr<Val> Call(val_list* args, Frame* parent) const override;
/** /**
* Adds adds a closure to the function. Closures are cloned and * Adds adds a closure to the function. Closures are cloned and
@ -133,7 +133,7 @@ public:
*/ */
broker::expected<broker::data> SerializeClosure() const; broker::expected<broker::data> SerializeClosure() const;
void AddBody(Stmt* new_body, id_list* new_inits, void AddBody(IntrusivePtr<Stmt> new_body, id_list* new_inits,
size_t new_frame_size, int priority) override; size_t new_frame_size, int priority) override;
/** Sets this function's outer_id list. */ /** Sets this function's outer_id list. */
@ -144,12 +144,12 @@ public:
protected: protected:
BroFunc() : Func(BRO_FUNC) {} BroFunc() : Func(BRO_FUNC) {}
Stmt* AddInits(Stmt* body, id_list* inits); IntrusivePtr<Stmt> AddInits(IntrusivePtr<Stmt> body, id_list* inits);
/** /**
* Clones this function along with its closures. * Clones this function along with its closures.
*/ */
Func* DoClone() override; IntrusivePtr<Func> DoClone() override;
/** /**
* Performs a selective clone of *f* using the IDs that were * Performs a selective clone of *f* using the IDs that were
@ -177,7 +177,7 @@ public:
~BuiltinFunc() override; ~BuiltinFunc() override;
int IsPure() const override; int IsPure() const override;
Val* Call(val_list* args, Frame* parent) const override; IntrusivePtr<Val> Call(val_list* args, Frame* parent) const override;
built_in_func TheFunc() const { return func; } built_in_func TheFunc() const { return func; }
void Describe(ODesc* d) const override; void Describe(ODesc* d) const override;
@ -208,16 +208,16 @@ struct function_ingredients {
// Gathers all of the information from a scope and a function body needed // Gathers all of the information from a scope and a function body needed
// to build a function. // to build a function.
function_ingredients(Scope* scope, Stmt* body); function_ingredients(IntrusivePtr<Scope> scope, IntrusivePtr<Stmt> body);
~function_ingredients(); ~function_ingredients();
ID* id; IntrusivePtr<ID> id;
Stmt* body; IntrusivePtr<Stmt> body;
id_list* inits; id_list* inits;
int frame_size; int frame_size;
int priority; int priority;
Scope* scope; IntrusivePtr<Scope> scope;
}; };
extern vector<CallInfo> call_stack; extern vector<CallInfo> call_stack;

View file

@ -163,7 +163,7 @@ void ID::UpdateValAttrs()
return; return;
if ( val && val->Type()->Tag() == TYPE_TABLE ) if ( val && val->Type()->Tag() == TYPE_TABLE )
val->AsTableVal()->SetAttrs(attrs.get()); val->AsTableVal()->SetAttrs(attrs);
if ( val && val->Type()->Tag() == TYPE_FILE ) if ( val && val->Type()->Tag() == TYPE_FILE )
val->AsFile()->SetAttrs(attrs.get()); val->AsFile()->SetAttrs(attrs.get());
@ -188,9 +188,9 @@ void ID::UpdateValAttrs()
TypeDecl* fd = rt->FieldDecl(i); TypeDecl* fd = rt->FieldDecl(i);
if ( ! fd->attrs ) if ( ! fd->attrs )
fd->attrs = new Attributes(new attr_list, rt->FieldType(i), true, IsGlobal()); fd->attrs = make_intrusive<Attributes>(new attr_list, IntrusivePtr{NewRef{}, rt->FieldType(i)}, true, IsGlobal());
fd->attrs->AddAttr(new Attr(ATTR_LOG)); fd->attrs->AddAttr(make_intrusive<Attr>(ATTR_LOG));
} }
} }
} }
@ -206,13 +206,13 @@ bool ID::IsDeprecated() const
return FindAttr(ATTR_DEPRECATED) != 0; return FindAttr(ATTR_DEPRECATED) != 0;
} }
void ID::MakeDeprecated(Expr* deprecation) void ID::MakeDeprecated(IntrusivePtr<Expr> deprecation)
{ {
if ( IsDeprecated() ) if ( IsDeprecated() )
return; return;
attr_list* attr = new attr_list{new Attr(ATTR_DEPRECATED, deprecation)}; attr_list* attr = new attr_list{new Attr(ATTR_DEPRECATED, std::move(deprecation))};
AddAttrs(make_intrusive<Attributes>(attr, Type(), false, IsGlobal())); AddAttrs(make_intrusive<Attributes>(attr, IntrusivePtr{NewRef{}, Type()}, false, IsGlobal()));
} }
string ID::GetDeprecationWarning() const string ID::GetDeprecationWarning() const
@ -262,7 +262,7 @@ void ID::SetOption()
if ( ! IsRedefinable() ) if ( ! IsRedefinable() )
{ {
attr_list* attr = new attr_list{new Attr(ATTR_REDEF)}; attr_list* attr = new attr_list{new Attr(ATTR_REDEF)};
AddAttrs(make_intrusive<Attributes>(attr, Type(), false, IsGlobal())); AddAttrs(make_intrusive<Attributes>(attr, IntrusivePtr{NewRef{}, Type()}, false, IsGlobal()));
} }
} }
@ -314,7 +314,7 @@ TraversalCode ID::Traverse(TraversalCallback* cb) const
void ID::Error(const char* msg, const BroObj* o2) void ID::Error(const char* msg, const BroObj* o2)
{ {
BroObj::Error(msg, o2, 1); BroObj::Error(msg, o2, 1);
SetType({AdoptRef{}, error_type()}); SetType(error_type());
} }
void ID::Describe(ODesc* d) const void ID::Describe(ODesc* d) const

View file

@ -86,7 +86,7 @@ public:
bool IsDeprecated() const; bool IsDeprecated() const;
void MakeDeprecated(Expr* deprecation); void MakeDeprecated(IntrusivePtr<Expr> deprecation);
std::string GetDeprecationWarning() const; std::string GetDeprecationWarning() const;

View file

@ -65,7 +65,7 @@ static VectorVal* BuildOptionsVal(const u_char* data, int len)
// PadN or other option // PadN or other option
uint16_t off = 2 * sizeof(uint8_t); uint16_t off = 2 * sizeof(uint8_t);
rv->Assign(1, val_mgr->GetCount(opt->ip6o_len)); rv->Assign(1, val_mgr->GetCount(opt->ip6o_len));
rv->Assign(2, new StringVal( rv->Assign(2, make_intrusive<StringVal>(
new BroString(data + off, opt->ip6o_len, 1))); new BroString(data + off, opt->ip6o_len, 1)));
data += opt->ip6o_len + off; data += opt->ip6o_len + off;
len -= opt->ip6o_len + off; len -= opt->ip6o_len + off;
@ -91,8 +91,8 @@ RecordVal* IPv6_Hdr::BuildRecordVal(VectorVal* chain) const
rv->Assign(2, val_mgr->GetCount(ntohs(ip6->ip6_plen))); rv->Assign(2, val_mgr->GetCount(ntohs(ip6->ip6_plen)));
rv->Assign(3, val_mgr->GetCount(ip6->ip6_nxt)); rv->Assign(3, val_mgr->GetCount(ip6->ip6_nxt));
rv->Assign(4, val_mgr->GetCount(ip6->ip6_hlim)); rv->Assign(4, val_mgr->GetCount(ip6->ip6_hlim));
rv->Assign(5, new AddrVal(IPAddr(ip6->ip6_src))); rv->Assign(5, make_intrusive<AddrVal>(IPAddr(ip6->ip6_src)));
rv->Assign(6, new AddrVal(IPAddr(ip6->ip6_dst))); rv->Assign(6, make_intrusive<AddrVal>(IPAddr(ip6->ip6_dst)));
if ( ! chain ) if ( ! chain )
chain = new VectorVal( chain = new VectorVal(
internal_type("ip6_ext_hdr_chain")->AsVectorType()); internal_type("ip6_ext_hdr_chain")->AsVectorType());
@ -132,7 +132,7 @@ RecordVal* IPv6_Hdr::BuildRecordVal(VectorVal* chain) const
rv->Assign(2, val_mgr->GetCount(rt->ip6r_type)); rv->Assign(2, val_mgr->GetCount(rt->ip6r_type));
rv->Assign(3, val_mgr->GetCount(rt->ip6r_segleft)); rv->Assign(3, val_mgr->GetCount(rt->ip6r_segleft));
uint16_t off = 4 * sizeof(uint8_t); uint16_t off = 4 * sizeof(uint8_t);
rv->Assign(4, new StringVal(new BroString(data + off, Length() - off, 1))); rv->Assign(4, make_intrusive<StringVal>(new BroString(data + off, Length() - off, 1)));
} }
break; break;
@ -163,7 +163,7 @@ RecordVal* IPv6_Hdr::BuildRecordVal(VectorVal* chain) const
// Payload Len was non-zero for this header. // Payload Len was non-zero for this header.
rv->Assign(4, val_mgr->GetCount(ntohl(((uint32_t*)data)[2]))); rv->Assign(4, val_mgr->GetCount(ntohl(((uint32_t*)data)[2])));
uint16_t off = 3 * sizeof(uint32_t); uint16_t off = 3 * sizeof(uint32_t);
rv->Assign(5, new StringVal(new BroString(data + off, Length() - off, 1))); rv->Assign(5, make_intrusive<StringVal>(new BroString(data + off, Length() - off, 1)));
} }
} }
break; break;
@ -284,7 +284,7 @@ RecordVal* IPv6_Hdr::BuildRecordVal(VectorVal* chain) const
RecordVal* m = new RecordVal(hdrType(ip6_mob_brr_type, "ip6_mobility_be")); RecordVal* m = new RecordVal(hdrType(ip6_mob_brr_type, "ip6_mobility_be"));
m->Assign(0, val_mgr->GetCount(*((uint8_t*)msg_data))); m->Assign(0, val_mgr->GetCount(*((uint8_t*)msg_data)));
const in6_addr* hoa = (const in6_addr*)(msg_data + sizeof(uint16_t)); const in6_addr* hoa = (const in6_addr*)(msg_data + sizeof(uint16_t));
m->Assign(1, new AddrVal(IPAddr(*hoa))); m->Assign(1, make_intrusive<AddrVal>(IPAddr(*hoa)));
off += sizeof(uint16_t) + sizeof(in6_addr); off += sizeof(uint16_t) + sizeof(in6_addr);
m->Assign(2, BuildOptionsVal(data + off, Length() - off)); m->Assign(2, BuildOptionsVal(data + off, Length() - off));
msg->Assign(8, m); msg->Assign(8, m);
@ -341,8 +341,8 @@ RecordVal* IP_Hdr::BuildIPHdrVal() const
rval->Assign(3, val_mgr->GetCount(ntohs(ip4->ip_id))); rval->Assign(3, val_mgr->GetCount(ntohs(ip4->ip_id)));
rval->Assign(4, val_mgr->GetCount(ip4->ip_ttl)); rval->Assign(4, val_mgr->GetCount(ip4->ip_ttl));
rval->Assign(5, val_mgr->GetCount(ip4->ip_p)); rval->Assign(5, val_mgr->GetCount(ip4->ip_p));
rval->Assign(6, new AddrVal(ip4->ip_src.s_addr)); rval->Assign(6, make_intrusive<AddrVal>(ip4->ip_src.s_addr));
rval->Assign(7, new AddrVal(ip4->ip_dst.s_addr)); rval->Assign(7, make_intrusive<AddrVal>(ip4->ip_dst.s_addr));
} }
else else
{ {

View file

@ -89,9 +89,7 @@ IntrusivePtr<OpaqueVal> OpaqueVal::Unserialize(const broker::data& data)
return nullptr; return nullptr;
if ( ! val->DoUnserialize((*v)[1]) ) if ( ! val->DoUnserialize((*v)[1]) )
{
return nullptr; return nullptr;
}
return val; return val;
} }
@ -143,17 +141,17 @@ BroType* OpaqueVal::UnserializeType(const broker::data& data)
if ( ! tag ) if ( ! tag )
return nullptr; return nullptr;
return base_type(static_cast<TypeTag>(*tag)); return base_type(static_cast<TypeTag>(*tag)).release();
} }
Val* OpaqueVal::DoClone(CloneState* state) IntrusivePtr<Val> OpaqueVal::DoClone(CloneState* state)
{ {
auto d = OpaqueVal::Serialize(); auto d = OpaqueVal::Serialize();
if ( ! d ) if ( ! d )
return nullptr; return nullptr;
auto rval = OpaqueVal::Unserialize(std::move(*d)); auto rval = OpaqueVal::Unserialize(std::move(*d));
return state->NewClone(this, rval.release()); return state->NewClone(this, std::move(rval));
} }
bool HashVal::IsValid() const bool HashVal::IsValid() const
@ -223,17 +221,19 @@ MD5Val::~MD5Val()
EVP_MD_CTX_free(ctx); EVP_MD_CTX_free(ctx);
} }
Val* MD5Val::DoClone(CloneState* state) IntrusivePtr<Val> MD5Val::DoClone(CloneState* state)
{ {
auto out = new MD5Val(); auto out = make_intrusive<MD5Val>();
if ( IsValid() ) if ( IsValid() )
{ {
if ( ! out->Init() ) if ( ! out->Init() )
return nullptr; return nullptr;
EVP_MD_CTX_copy_ex(out->ctx, ctx); EVP_MD_CTX_copy_ex(out->ctx, ctx);
} }
return state->NewClone(this, out); return state->NewClone(this, std::move(out));
} }
void MD5Val::digest(val_list& vlist, u_char result[MD5_DIGEST_LENGTH]) void MD5Val::digest(val_list& vlist, u_char result[MD5_DIGEST_LENGTH])
@ -374,17 +374,19 @@ SHA1Val::~SHA1Val()
EVP_MD_CTX_free(ctx); EVP_MD_CTX_free(ctx);
} }
Val* SHA1Val::DoClone(CloneState* state) IntrusivePtr<Val> SHA1Val::DoClone(CloneState* state)
{ {
auto out = new SHA1Val(); auto out = make_intrusive<SHA1Val>();
if ( IsValid() ) if ( IsValid() )
{ {
if ( ! out->Init() ) if ( ! out->Init() )
return nullptr; return nullptr;
EVP_MD_CTX_copy_ex(out->ctx, ctx); EVP_MD_CTX_copy_ex(out->ctx, ctx);
} }
return state->NewClone(this, out); return state->NewClone(this, std::move(out));
} }
void SHA1Val::digest(val_list& vlist, u_char result[SHA_DIGEST_LENGTH]) void SHA1Val::digest(val_list& vlist, u_char result[SHA_DIGEST_LENGTH])
@ -518,17 +520,19 @@ SHA256Val::~SHA256Val()
EVP_MD_CTX_free(ctx); EVP_MD_CTX_free(ctx);
} }
Val* SHA256Val::DoClone(CloneState* state) IntrusivePtr<Val> SHA256Val::DoClone(CloneState* state)
{ {
auto out = new SHA256Val(); auto out = make_intrusive<SHA256Val>();
if ( IsValid() ) if ( IsValid() )
{ {
if ( ! out->Init() ) if ( ! out->Init() )
return nullptr; return nullptr;
EVP_MD_CTX_copy_ex(out->ctx, ctx); EVP_MD_CTX_copy_ex(out->ctx, ctx);
} }
return state->NewClone(this, out); return state->NewClone(this, std::move(out));
} }
void SHA256Val::digest(val_list& vlist, u_char result[SHA256_DIGEST_LENGTH]) void SHA256Val::digest(val_list& vlist, u_char result[SHA256_DIGEST_LENGTH])
@ -773,16 +777,16 @@ BloomFilterVal::BloomFilterVal(probabilistic::BloomFilter* bf)
bloom_filter = bf; bloom_filter = bf;
} }
Val* BloomFilterVal::DoClone(CloneState* state) IntrusivePtr<Val> BloomFilterVal::DoClone(CloneState* state)
{ {
if ( bloom_filter ) if ( bloom_filter )
{ {
auto bf = new BloomFilterVal(bloom_filter->Clone()); auto bf = make_intrusive<BloomFilterVal>(bloom_filter->Clone());
bf->Typify(type); bf->Typify(type);
return state->NewClone(this, bf); return state->NewClone(this, std::move(bf));
} }
return state->NewClone(this, new BloomFilterVal()); return state->NewClone(this, make_intrusive<BloomFilterVal>());
} }
bool BloomFilterVal::Typify(BroType* arg_type) bool BloomFilterVal::Typify(BroType* arg_type)
@ -793,8 +797,8 @@ bool BloomFilterVal::Typify(BroType* arg_type)
type = arg_type; type = arg_type;
type->Ref(); type->Ref();
auto tl = make_intrusive<TypeList>(type); auto tl = make_intrusive<TypeList>(IntrusivePtr{NewRef{}, type});
tl->Append(type->Ref()); tl->Append({NewRef{}, type});
hash = new CompositeHash(std::move(tl)); hash = new CompositeHash(std::move(tl));
return true; return true;
@ -949,10 +953,10 @@ CardinalityVal::~CardinalityVal()
delete hash; delete hash;
} }
Val* CardinalityVal::DoClone(CloneState* state) IntrusivePtr<Val> CardinalityVal::DoClone(CloneState* state)
{ {
return state->NewClone(this, return state->NewClone(this,
new CardinalityVal(new probabilistic::CardinalityCounter(*c))); make_intrusive<CardinalityVal>(new probabilistic::CardinalityCounter(*c)));
} }
bool CardinalityVal::Typify(BroType* arg_type) bool CardinalityVal::Typify(BroType* arg_type)
@ -963,8 +967,8 @@ bool CardinalityVal::Typify(BroType* arg_type)
type = arg_type; type = arg_type;
type->Ref(); type->Ref();
auto tl = make_intrusive<TypeList>(type); auto tl = make_intrusive<TypeList>(IntrusivePtr{NewRef{}, type});
tl->Append(type->Ref()); tl->Append({NewRef{}, type});
hash = new CompositeHash(std::move(tl)); hash = new CompositeHash(std::move(tl));
return true; return true;
@ -1043,7 +1047,7 @@ IntrusivePtr<VectorVal> ParaglobVal::Get(StringVal* &pattern)
std::vector<std::string> matches = this->internal_paraglob->get(string_pattern); std::vector<std::string> matches = this->internal_paraglob->get(string_pattern);
for (unsigned int i = 0; i < matches.size(); i++) for (unsigned int i = 0; i < matches.size(); i++)
rval->Assign(i, new StringVal(matches.at(i))); rval->Assign(i, make_intrusive<StringVal>(matches.at(i)));
return rval; return rval;
} }
@ -1097,10 +1101,10 @@ bool ParaglobVal::DoUnserialize(const broker::data& data)
return true; return true;
} }
Val* ParaglobVal::DoClone(CloneState* state) IntrusivePtr<Val> ParaglobVal::DoClone(CloneState* state)
{ {
try { try {
return new ParaglobVal return make_intrusive<ParaglobVal>
(std::make_unique<paraglob::Paraglob>(this->internal_paraglob->serialize())); (std::make_unique<paraglob::Paraglob>(this->internal_paraglob->serialize()));
} }
catch (const paraglob::underflow_error& e) catch (const paraglob::underflow_error& e)

View file

@ -140,7 +140,7 @@ protected:
* may also override this with a more efficient custom clone * may also override this with a more efficient custom clone
* implementation of their own. * implementation of their own.
*/ */
Val* DoClone(CloneState* state) override; IntrusivePtr<Val> DoClone(CloneState* state) override;
/** /**
* Helper function for derived class that need to record a type * Helper function for derived class that need to record a type
@ -191,7 +191,7 @@ public:
MD5Val(); MD5Val();
~MD5Val(); ~MD5Val();
Val* DoClone(CloneState* state) override; IntrusivePtr<Val> DoClone(CloneState* state) override;
protected: protected:
friend class Val; friend class Val;
@ -212,7 +212,7 @@ public:
SHA1Val(); SHA1Val();
~SHA1Val(); ~SHA1Val();
Val* DoClone(CloneState* state) override; IntrusivePtr<Val> DoClone(CloneState* state) override;
protected: protected:
friend class Val; friend class Val;
@ -233,7 +233,7 @@ public:
SHA256Val(); SHA256Val();
~SHA256Val(); ~SHA256Val();
Val* DoClone(CloneState* state) override; IntrusivePtr<Val> DoClone(CloneState* state) override;
protected: protected:
friend class Val; friend class Val;
@ -268,7 +268,7 @@ public:
explicit BloomFilterVal(probabilistic::BloomFilter* bf); explicit BloomFilterVal(probabilistic::BloomFilter* bf);
~BloomFilterVal() override; ~BloomFilterVal() override;
Val* DoClone(CloneState* state) override; IntrusivePtr<Val> DoClone(CloneState* state) override;
BroType* Type() const; BroType* Type() const;
bool Typify(BroType* type); bool Typify(BroType* type);
@ -304,7 +304,7 @@ public:
explicit CardinalityVal(probabilistic::CardinalityCounter*); explicit CardinalityVal(probabilistic::CardinalityCounter*);
~CardinalityVal() override; ~CardinalityVal() override;
Val* DoClone(CloneState* state) override; IntrusivePtr<Val> DoClone(CloneState* state) override;
void Add(const Val* val); void Add(const Val* val);
@ -327,7 +327,7 @@ class ParaglobVal : public OpaqueVal {
public: public:
explicit ParaglobVal(std::unique_ptr<paraglob::Paraglob> p); explicit ParaglobVal(std::unique_ptr<paraglob::Paraglob> p);
IntrusivePtr<VectorVal> Get(StringVal* &pattern); IntrusivePtr<VectorVal> Get(StringVal* &pattern);
Val* DoClone(CloneState* state) override; IntrusivePtr<Val> DoClone(CloneState* state) override;
bool operator==(const ParaglobVal& other) const; bool operator==(const ParaglobVal& other) const;
protected: protected:

View file

@ -145,7 +145,7 @@ RuleConditionEval::RuleConditionEval(const char* func)
rules_error("eval function type must yield a 'bool'", func); rules_error("eval function type must yield a 'bool'", func);
TypeList tl; TypeList tl;
tl.Append(internal_type("signature_state")->Ref()); tl.Append({NewRef{}, internal_type("signature_state")});
tl.Append(base_type(TYPE_STRING)); tl.Append(base_type(TYPE_STRING));
if ( ! f->CheckArgs(tl.Types()) ) if ( ! f->CheckArgs(tl.Types()) )
@ -175,24 +175,16 @@ bool RuleConditionEval::DoMatch(Rule* rule, RuleEndpointState* state,
else else
args.push_back(val_mgr->GetEmptyString()); args.push_back(val_mgr->GetEmptyString());
bool result = 0; bool result = false;
try try
{ {
Val* val = id->ID_Val()->AsFunc()->Call(&args); auto val = id->ID_Val()->AsFunc()->Call(&args);
result = val && val->AsBool();
if ( val )
{
result = val->AsBool();
Unref(val);
}
else
result = false;
} }
catch ( InterpreterException& e ) catch ( InterpreterException& e )
{ {
result = false;
} }
return result; return result;

View file

@ -78,7 +78,7 @@ Val* RuleMatcher::BuildRuleStateValue(const Rule* rule,
const RuleEndpointState* state) const const RuleEndpointState* state) const
{ {
RecordVal* val = new RecordVal(signature_state); RecordVal* val = new RecordVal(signature_state);
val->Assign(0, new StringVal(rule->ID())); val->Assign(0, make_intrusive<StringVal>(rule->ID()));
val->Assign(1, state->GetAnalyzer()->BuildConnVal()); val->Assign(1, state->GetAnalyzer()->BuildConnVal());
val->Assign(2, val_mgr->GetBool(state->is_orig)); val->Assign(2, val_mgr->GetBool(state->is_orig));
val->Assign(3, val_mgr->GetCount(state->payload_size)); val->Assign(3, val_mgr->GetCount(state->payload_size));

View file

@ -16,9 +16,9 @@ static scope_list scopes;
static Scope* top_scope; static Scope* top_scope;
Scope::Scope(ID* id, attr_list* al) Scope::Scope(IntrusivePtr<ID> id, attr_list* al)
: scope_id(std::move(id))
{ {
scope_id = id;
attrs = al; attrs = al;
return_type = 0; return_type = 0;
@ -26,27 +26,20 @@ Scope::Scope(ID* id, attr_list* al)
if ( id ) if ( id )
{ {
BroType* id_type = id->Type(); BroType* id_type = scope_id->Type();
if ( id_type->Tag() == TYPE_ERROR ) if ( id_type->Tag() == TYPE_ERROR )
return; return;
else if ( id_type->Tag() != TYPE_FUNC ) else if ( id_type->Tag() != TYPE_FUNC )
reporter->InternalError("bad scope id"); reporter->InternalError("bad scope id");
Ref(id);
FuncType* ft = id->Type()->AsFuncType(); FuncType* ft = id->Type()->AsFuncType();
return_type = ft->YieldType(); return_type = {NewRef{}, ft->YieldType()};
if ( return_type )
Ref(return_type);
} }
} }
Scope::~Scope() Scope::~Scope()
{ {
for ( const auto& entry : local )
Unref(entry.second);
if ( attrs ) if ( attrs )
{ {
for ( const auto& attr : *attrs ) for ( const auto& attr : *attrs )
@ -55,9 +48,6 @@ Scope::~Scope()
delete attrs; delete attrs;
} }
Unref(scope_id);
Unref(return_type);
if ( inits ) if ( inits )
{ {
for ( const auto& i : *inits ) for ( const auto& i : *inits )
@ -108,7 +98,7 @@ void Scope::Describe(ODesc* d) const
for ( const auto& entry : local ) for ( const auto& entry : local )
{ {
ID* id = entry.second; ID* id = entry.second.get();
id->Describe(d); id->Describe(d);
d->NL(); d->NL();
} }
@ -118,7 +108,7 @@ TraversalCode Scope::Traverse(TraversalCallback* cb) const
{ {
for ( const auto& entry : local ) for ( const auto& entry : local )
{ {
ID* id = entry.second; ID* id = entry.second.get();
TraversalCode tc = id->Traverse(cb); TraversalCode tc = id->Traverse(cb);
HANDLE_TC_STMT_PRE(tc); HANDLE_TC_STMT_PRE(tc);
} }
@ -183,11 +173,11 @@ IntrusivePtr<ID> install_ID(const char* name, const char* module_name,
auto id = make_intrusive<ID>(full_name.data(), scope, is_export); auto id = make_intrusive<ID>(full_name.data(), scope, is_export);
if ( SCOPE_FUNCTION != scope ) if ( SCOPE_FUNCTION != scope )
global_scope()->Insert(std::move(full_name), IntrusivePtr{id}.release()); global_scope()->Insert(std::move(full_name), id);
else else
{ {
id->SetOffset(top_scope->Length()); id->SetOffset(top_scope->Length());
top_scope->Insert(std::move(full_name), IntrusivePtr{id}.release()); top_scope->Insert(std::move(full_name), id);
} }
return id; return id;
@ -198,9 +188,9 @@ void push_existing_scope(Scope* scope)
scopes.push_back(scope); scopes.push_back(scope);
} }
void push_scope(ID* id, attr_list* attrs) void push_scope(IntrusivePtr<ID> id, attr_list* attrs)
{ {
top_scope = new Scope(id, attrs); top_scope = new Scope(std::move(id), attrs);
scopes.push_back(top_scope); scopes.push_back(top_scope);
} }

View file

@ -8,6 +8,7 @@
#include "Obj.h" #include "Obj.h"
#include "BroList.h" #include "BroList.h"
#include "IntrusivePtr.h"
#include "TraverseTypes.h" #include "TraverseTypes.h"
template <class T> class IntrusivePtr; template <class T> class IntrusivePtr;
@ -17,7 +18,7 @@ class ListVal;
class Scope : public BroObj { class Scope : public BroObj {
public: public:
explicit Scope(ID* id, attr_list* al); explicit Scope(IntrusivePtr<ID> id, attr_list* al);
~Scope() override; ~Scope() override;
template<typename N> template<typename N>
@ -26,31 +27,22 @@ public:
const auto& entry = local.find(std::forward<N>(name)); const auto& entry = local.find(std::forward<N>(name));
if ( entry != local.end() ) if ( entry != local.end() )
return entry->second; return entry->second.get();
return nullptr; return nullptr;
} }
template<typename N> template<typename N, typename I>
void Insert(N&& name, ID* id) void Insert(N&& name, I&& id) { local[std::forward<N>(name)] = std::forward<I>(id); }
{
auto [it, inserted] = local.emplace(std::forward<N>(name), id);
if ( ! inserted )
{
Unref(it->second);
it->second = id;
}
}
template<typename N> template<typename N>
ID* Remove(N&& name) IntrusivePtr<ID> Remove(N&& name)
{ {
const auto& entry = local.find(std::forward<N>(name)); const auto& entry = local.find(std::forward<N>(name));
if ( entry != local.end() ) if ( entry != local.end() )
{ {
ID* id = entry->second; auto id = std::move(entry->second);
local.erase(entry); local.erase(entry);
return id; return id;
} }
@ -58,12 +50,12 @@ public:
return nullptr; return nullptr;
} }
ID* ScopeID() const { return scope_id; } ID* ScopeID() const { return scope_id.get(); }
attr_list* Attrs() const { return attrs; } attr_list* Attrs() const { return attrs; }
BroType* ReturnType() const { return return_type; } BroType* ReturnType() const { return return_type.get(); }
size_t Length() const { return local.size(); } size_t Length() const { return local.size(); }
const std::map<std::string, ID*>& Vars() { return local; } const auto& Vars() { return local; }
ID* GenerateTemporary(const char* name); ID* GenerateTemporary(const char* name);
@ -72,17 +64,17 @@ public:
id_list* GetInits(); id_list* GetInits();
// Adds a variable to the list. // Adds a variable to the list.
void AddInit(ID* id) { inits->push_back(id); } void AddInit(IntrusivePtr<ID> id) { inits->push_back(id.release()); }
void Describe(ODesc* d) const override; void Describe(ODesc* d) const override;
TraversalCode Traverse(TraversalCallback* cb) const; TraversalCode Traverse(TraversalCallback* cb) const;
protected: protected:
ID* scope_id; IntrusivePtr<ID> scope_id;
attr_list* attrs; attr_list* attrs;
BroType* return_type; IntrusivePtr<BroType> return_type;
std::map<std::string, ID*> local; std::map<std::string, IntrusivePtr<ID>> local;
id_list* inits; id_list* inits;
}; };
@ -98,7 +90,7 @@ extern IntrusivePtr<ID> lookup_ID(const char* name, const char* module,
extern IntrusivePtr<ID> install_ID(const char* name, const char* module_name, extern IntrusivePtr<ID> install_ID(const char* name, const char* module_name,
bool is_global, bool is_export); bool is_global, bool is_export);
extern void push_scope(ID* id, attr_list* attrs); extern void push_scope(IntrusivePtr<ID> id, attr_list* attrs);
extern void push_existing_scope(Scope* scope); extern void push_existing_scope(Scope* scope);
// Returns the one popped off. // Returns the one popped off.

View file

@ -84,25 +84,25 @@ VectorVal* BroSubstring::VecToPolicy(Vec* vec)
{ {
BroSubstring* bst = (*vec)[i]; BroSubstring* bst = (*vec)[i];
RecordVal* st_val = new RecordVal(sw_substring_type); auto st_val = make_intrusive<RecordVal>(sw_substring_type);
st_val->Assign(0, new StringVal(new BroString(*bst))); st_val->Assign(0, make_intrusive<StringVal>(new BroString(*bst)));
VectorVal* aligns = new VectorVal(sw_align_vec_type); auto aligns = make_intrusive<VectorVal>(sw_align_vec_type);
for ( unsigned int j = 0; j < bst->GetNumAlignments(); ++j ) for ( unsigned int j = 0; j < bst->GetNumAlignments(); ++j )
{ {
const BSSAlign& align = (bst->GetAlignments())[j]; const BSSAlign& align = (bst->GetAlignments())[j];
RecordVal* align_val = new RecordVal(sw_align_type); auto align_val = make_intrusive<RecordVal>(sw_align_type);
align_val->Assign(0, new StringVal(new BroString(*align.string))); align_val->Assign(0, make_intrusive<StringVal>(new BroString(*align.string)));
align_val->Assign(1, val_mgr->GetCount(align.index)); align_val->Assign(1, val_mgr->GetCount(align.index));
aligns->Assign(j+1, align_val); aligns->Assign(j + 1, std::move(align_val));
} }
st_val->Assign(1, aligns); st_val->Assign(1, std::move(aligns));
st_val->Assign(2, val_mgr->GetBool(bst->IsNewAlignment())); st_val->Assign(2, val_mgr->GetBool(bst->IsNewAlignment()));
result->Assign(i+1, st_val); result->Assign(i + 1, std::move(st_val));
} }
} }

View file

@ -252,7 +252,7 @@ void ProfileLogger::Log()
for ( const auto& global : globals ) for ( const auto& global : globals )
{ {
ID* id = global.second; ID* id = global.second.get();
// We don't show/count internal globals as they are always // We don't show/count internal globals as they are always
// contained in some other global user-visible container. // contained in some other global user-visible container.
@ -345,7 +345,7 @@ SampleLogger::SampleLogger()
if ( ! load_sample_info ) if ( ! load_sample_info )
load_sample_info = internal_type("load_sample_info")->AsTableType(); load_sample_info = internal_type("load_sample_info")->AsTableType();
load_samples = new TableVal(load_sample_info); load_samples = new TableVal({NewRef{}, load_sample_info});
} }
SampleLogger::~SampleLogger() SampleLogger::~SampleLogger()

View file

@ -202,9 +202,8 @@ static IntrusivePtr<EnumVal> lookup_enum_val(const char* module_name, const char
int index = et->Lookup(module_name, name); int index = et->Lookup(module_name, name);
assert(index >= 0); assert(index >= 0);
IntrusivePtr<EnumVal> rval{AdoptRef{}, et->GetVal(index)};
return rval; return et->GetVal(index);
} }
static void print_log(val_list* vals) static void print_log(val_list* vals)
@ -217,11 +216,11 @@ static void print_log(val_list* vals)
{ {
ODesc d(DESC_READABLE); ODesc d(DESC_READABLE);
val->Describe(&d); val->Describe(&d);
vec->Assign(vec->Size(), new StringVal(d.Description())); vec->Assign(vec->Size(), make_intrusive<StringVal>(d.Description()));
} }
record->Assign(0, new Val(current_time(), TYPE_TIME)); record->Assign(0, make_intrusive<Val>(current_time(), TYPE_TIME));
record->Assign(1, vec.release()); record->Assign(1, std::move(vec));
log_mgr->Write(plval.get(), record.get()); log_mgr->Write(plval.get(), record.get());
} }
@ -588,7 +587,7 @@ static void int_del_func(void* v)
void SwitchStmt::Init() void SwitchStmt::Init()
{ {
auto t = make_intrusive<TypeList>(); auto t = make_intrusive<TypeList>();
t->Append(e->Type()->Ref()); t->Append({NewRef{}, e->Type()});
comp_hash = new CompositeHash(std::move(t)); comp_hash = new CompositeHash(std::move(t));
case_label_value_map.SetDeleteFunc(int_del_func); case_label_value_map.SetDeleteFunc(int_del_func);
@ -1115,7 +1114,7 @@ ForStmt::ForStmt(id_list* arg_loop_vars, IntrusivePtr<Expr> loop_expr)
BroType* t = (*loop_vars)[0]->Type(); BroType* t = (*loop_vars)[0]->Type();
if ( ! t ) if ( ! t )
add_local({NewRef{}, (*loop_vars)[0]}, {AdoptRef{}, base_type(TYPE_COUNT)}, add_local({NewRef{}, (*loop_vars)[0]}, base_type(TYPE_COUNT),
INIT_NONE, 0, 0, VAR_REGULAR); INIT_NONE, 0, 0, VAR_REGULAR);
else if ( ! IsIntegral(t->Tag()) ) else if ( ! IsIntegral(t->Tag()) )
@ -1136,7 +1135,7 @@ ForStmt::ForStmt(id_list* arg_loop_vars, IntrusivePtr<Expr> loop_expr)
BroType* t = (*loop_vars)[0]->Type(); BroType* t = (*loop_vars)[0]->Type();
if ( ! t ) if ( ! t )
add_local({NewRef{}, (*loop_vars)[0]}, add_local({NewRef{}, (*loop_vars)[0]},
{AdoptRef{}, base_type(TYPE_STRING)}, base_type(TYPE_STRING),
INIT_NONE, 0, 0, VAR_REGULAR); INIT_NONE, 0, 0, VAR_REGULAR);
else if ( t->Tag() != TYPE_STRING ) else if ( t->Tag() != TYPE_STRING )
@ -1432,7 +1431,7 @@ ReturnStmt::ReturnStmt(IntrusivePtr<Expr> arg_e)
{ {
if ( e ) if ( e )
{ {
ft->SetYieldType(e->Type()); ft->SetYieldType({NewRef{}, e->Type()});
s->ScopeID()->SetInferReturnType(false); s->ScopeID()->SetInferReturnType(false);
} }
} }
@ -1451,9 +1450,10 @@ ReturnStmt::ReturnStmt(IntrusivePtr<Expr> arg_e)
else else
{ {
Expr* e_ = e.release(); auto promoted_e = check_and_promote_expr(e.get(), yt);
(void) check_and_promote_expr(e_, yt);
e = {AdoptRef{}, e_}; if ( promoted_e )
e = std::move(promoted_e);
} }
} }
@ -1667,7 +1667,7 @@ IntrusivePtr<Val> InitStmt::Exec(Frame* f, stmt_flow_type& flow) const
v = new VectorVal(t->AsVectorType()); v = new VectorVal(t->AsVectorType());
break; break;
case TYPE_TABLE: case TYPE_TABLE:
v = new TableVal(t->AsTableType(), aggr->Attrs()); v = new TableVal({NewRef{}, t->AsTableType()}, {NewRef{}, aggr->Attrs()});
break; break;
default: default:
break; break;

View file

@ -2,6 +2,7 @@
#include "Tag.h" #include "Tag.h"
#include "Val.h" #include "Val.h"
#include "IntrusivePtr.h"
Tag::Tag(EnumType* etype, type_t arg_type, subtype_t arg_subtype) Tag::Tag(EnumType* etype, type_t arg_type, subtype_t arg_subtype)
{ {
@ -11,7 +12,7 @@ Tag::Tag(EnumType* etype, type_t arg_type, subtype_t arg_subtype)
subtype = arg_subtype; subtype = arg_subtype;
int64_t i = (int64_t)(type) | ((int64_t)subtype << 31); int64_t i = (int64_t)(type) | ((int64_t)subtype << 31);
Ref(etype); Ref(etype);
val = etype->GetVal(i); val = etype->GetVal(i).release();
} }
Tag::Tag(EnumVal* arg_val) Tag::Tag(EnumVal* arg_val)
@ -85,7 +86,7 @@ EnumVal* Tag::AsEnumVal(EnumType* etype) const
{ {
assert(type == 0 && subtype == 0); assert(type == 0 && subtype == 0);
Ref(etype); Ref(etype);
val = etype->GetVal(0); val = etype->GetVal(0).release();
} }
return val; return val;

View file

@ -265,7 +265,7 @@ bool Trigger::Eval()
return false; return false;
} }
f->SetTrigger(this); f->SetTrigger({NewRef{}, this});
IntrusivePtr<Val> v; IntrusivePtr<Val> v;

View file

@ -20,15 +20,15 @@ RecordVal* EncapsulatingConn::GetRecordVal() const
{ {
RecordVal *rv = new RecordVal(BifType::Record::Tunnel::EncapsulatingConn); RecordVal *rv = new RecordVal(BifType::Record::Tunnel::EncapsulatingConn);
RecordVal* id_val = new RecordVal(conn_id); auto id_val = make_intrusive<RecordVal>(conn_id);
id_val->Assign(0, new AddrVal(src_addr)); id_val->Assign(0, make_intrusive<AddrVal>(src_addr));
id_val->Assign(1, val_mgr->GetPort(ntohs(src_port), proto)); id_val->Assign(1, val_mgr->GetPort(ntohs(src_port), proto));
id_val->Assign(2, new AddrVal(dst_addr)); id_val->Assign(2, make_intrusive<AddrVal>(dst_addr));
id_val->Assign(3, val_mgr->GetPort(ntohs(dst_port), proto)); id_val->Assign(3, val_mgr->GetPort(ntohs(dst_port), proto));
rv->Assign(0, id_val); rv->Assign(0, std::move(id_val));
rv->Assign(1, BifType::Enum::Tunnel::Type->GetVal(type)); rv->Assign(1, BifType::Enum::Tunnel::Type->GetVal(type));
rv->Assign(2, new StringVal(uid.Base62("C").c_str())); rv->Assign(2, make_intrusive<StringVal>(uid.Base62("C").c_str()));
return rv; return rv;
} }

View file

@ -100,7 +100,7 @@ int BroType::MatchesIndex(ListExpr* const index) const
if ( index->Exprs().length() != 1 && index->Exprs().length() != 2 ) if ( index->Exprs().length() != 1 && index->Exprs().length() != 2 )
return DOES_NOT_MATCH_INDEX; return DOES_NOT_MATCH_INDEX;
if ( check_and_promote_exprs_to_type(index, ::base_type(TYPE_INT)) ) if ( check_and_promote_exprs_to_type(index, ::base_type(TYPE_INT).get()) )
return MATCHES_INDEX_SCALAR; return MATCHES_INDEX_SCALAR;
} }
@ -109,7 +109,7 @@ int BroType::MatchesIndex(ListExpr* const index) const
BroType* BroType::YieldType() BroType* BroType::YieldType()
{ {
return 0; return nullptr;
} }
int BroType::HasField(const char* /* field */) const int BroType::HasField(const char* /* field */) const
@ -119,7 +119,7 @@ int BroType::HasField(const char* /* field */) const
BroType* BroType::FieldType(const char* /* field */) const BroType* BroType::FieldType(const char* /* field */) const
{ {
return 0; return nullptr;
} }
void BroType::Describe(ODesc* d) const void BroType::Describe(ODesc* d) const
@ -155,8 +155,6 @@ TypeList::~TypeList()
{ {
for ( const auto& type : types ) for ( const auto& type : types )
Unref(type); Unref(type);
Unref(pure_type);
} }
int TypeList::AllMatch(const BroType* t, int is_init) const int TypeList::AllMatch(const BroType* t, int is_init) const
@ -167,23 +165,20 @@ int TypeList::AllMatch(const BroType* t, int is_init) const
return 1; return 1;
} }
void TypeList::Append(BroType* t) void TypeList::Append(IntrusivePtr<BroType> t)
{ {
if ( pure_type && ! same_type(t, pure_type) ) if ( pure_type && ! same_type(t.get(), pure_type.get()) )
reporter->InternalError("pure type-list violation"); reporter->InternalError("pure type-list violation");
types.push_back(t); types.push_back(t.release());
} }
void TypeList::AppendEvenIfNotPure(BroType* t) void TypeList::AppendEvenIfNotPure(IntrusivePtr<BroType> t)
{ {
if ( pure_type && ! same_type(t, pure_type) ) if ( pure_type && ! same_type(t.get(), pure_type.get()) )
{ pure_type = nullptr;
Unref(pure_type);
pure_type = 0;
}
types.push_back(t); types.push_back(t.release());
} }
void TypeList::Describe(ODesc* d) const void TypeList::Describe(ODesc* d) const
@ -220,11 +215,7 @@ unsigned int TypeList::MemoryAllocation() const
+ types.MemoryAllocation() - padded_sizeof(types); + types.MemoryAllocation() - padded_sizeof(types);
} }
IndexType::~IndexType() IndexType::~IndexType() = default;
{
Unref(indices);
Unref(yield_type);
}
int IndexType::MatchesIndex(ListExpr* const index) const int IndexType::MatchesIndex(ListExpr* const index) const
{ {
@ -242,12 +233,12 @@ int IndexType::MatchesIndex(ListExpr* const index) const
BroType* IndexType::YieldType() BroType* IndexType::YieldType()
{ {
return yield_type; return yield_type.get();
} }
const BroType* IndexType::YieldType() const const BroType* IndexType::YieldType() const
{ {
return yield_type; return yield_type.get();
} }
void IndexType::Describe(ODesc* d) const void IndexType::Describe(ODesc* d) const
@ -326,8 +317,8 @@ bool IndexType::IsSubNetIndex() const
return false; return false;
} }
TableType::TableType(TypeList* ind, BroType* yield) TableType::TableType(IntrusivePtr<TypeList> ind, IntrusivePtr<BroType> yield)
: IndexType(TYPE_TABLE, ind, yield) : IndexType(TYPE_TABLE, std::move(ind), std::move(yield))
{ {
if ( ! indices ) if ( ! indices )
return; return;
@ -355,11 +346,6 @@ TableType::TableType(TypeList* ind, BroType* yield)
TableType* TableType::ShallowClone() TableType* TableType::ShallowClone()
{ {
if ( indices )
indices->Ref();
if ( yield_type )
yield_type->Ref();
return new TableType(indices, yield_type); return new TableType(indices, yield_type);
} }
@ -377,20 +363,20 @@ TypeList* TableType::ExpandRecordIndex(RecordType* rt) const
for ( int i = 0; i < n; ++i ) for ( int i = 0; i < n; ++i )
{ {
TypeDecl* td = rt->FieldDecl(i); TypeDecl* td = rt->FieldDecl(i);
tl->Append(td->type->Ref()); tl->Append(td->type);
} }
return tl; return tl;
} }
SetType::SetType(TypeList* ind, ListExpr* arg_elements) : TableType(ind, 0) SetType::SetType(IntrusivePtr<TypeList> ind, IntrusivePtr<ListExpr> arg_elements)
: TableType(std::move(ind), nullptr), elements(std::move(arg_elements))
{ {
elements = arg_elements;
if ( elements ) if ( elements )
{ {
if ( indices ) if ( indices )
{ // We already have a type. { // We already have a type.
if ( ! check_and_promote_exprs(elements, indices) ) if ( ! check_and_promote_exprs(elements.get(), indices.get()) )
SetError(); SetError();
} }
else else
@ -406,21 +392,17 @@ SetType::SetType(TypeList* ind, ListExpr* arg_elements) : TableType(ind, 0)
else if ( tl->length() == 1 ) else if ( tl->length() == 1 )
{ {
BroType* t = flatten_type((*tl)[0]->Ref()); IntrusivePtr<BroType> ft{NewRef{}, flatten_type((*tl)[0])};
indices = new TypeList(t); indices = make_intrusive<TypeList>(ft);
indices->Append(t->Ref()); indices->Append(std::move(ft));
} }
else else
{ {
BroType* t = merge_types((*tl)[0], (*tl)[1]); auto t = merge_types((*tl)[0], (*tl)[1]);
for ( int i = 2; t && i < tl->length(); ++i ) for ( int i = 2; t && i < tl->length(); ++i )
{ t = merge_types(t.get(), (*tl)[i]);
BroType* t_new = merge_types(t, (*tl)[i]);
Unref(t);
t = t_new;
}
if ( ! t ) if ( ! t )
{ {
@ -428,8 +410,8 @@ SetType::SetType(TypeList* ind, ListExpr* arg_elements) : TableType(ind, 0)
return; return;
} }
indices = new TypeList(t); indices = make_intrusive<TypeList>(t);
indices->Append(t); indices->Append(std::move(t));
} }
} }
} }
@ -437,29 +419,18 @@ SetType::SetType(TypeList* ind, ListExpr* arg_elements) : TableType(ind, 0)
SetType* SetType::ShallowClone() SetType* SetType::ShallowClone()
{ {
if ( elements )
elements->Ref();
if ( indices )
indices->Ref();
return new SetType(indices, elements); return new SetType(indices, elements);
} }
SetType::~SetType() SetType::~SetType() = default;
{
Unref(elements);
}
FuncType::FuncType(RecordType* arg_args, BroType* arg_yield, function_flavor arg_flavor) FuncType::FuncType(IntrusivePtr<RecordType> arg_args,
: BroType(TYPE_FUNC) IntrusivePtr<BroType> arg_yield, function_flavor arg_flavor)
: BroType(TYPE_FUNC), args(std::move(arg_args)),
arg_types(make_intrusive<TypeList>()), yield(std::move(arg_yield))
{ {
args = arg_args;
yield = arg_yield;
flavor = arg_flavor; flavor = arg_flavor;
arg_types = new TypeList();
bool has_default_arg = false; bool has_default_arg = false;
for ( int i = 0; i < args->NumFields(); ++i ) for ( int i = 0; i < args->NumFields(); ++i )
@ -476,16 +447,16 @@ FuncType::FuncType(RecordType* arg_args, BroType* arg_yield, function_flavor arg
args->Error(err_str); args->Error(err_str);
} }
arg_types->Append(args->FieldType(i)->Ref()); arg_types->Append({NewRef{}, args->FieldType(i)});
} }
} }
FuncType* FuncType::ShallowClone() FuncType* FuncType::ShallowClone()
{ {
auto f = new FuncType(); auto f = new FuncType();
f->args = args->Ref()->AsRecordType(); f->args = {NewRef{}, args->AsRecordType()};
f->arg_types = arg_types->Ref()->AsTypeList(); f->arg_types = {NewRef{}, arg_types->AsTypeList()};
f->yield = yield->Ref(); f->yield = yield;
f->flavor = flavor; f->flavor = flavor;
return f; return f;
} }
@ -509,26 +480,21 @@ string FuncType::FlavorString() const
} }
} }
FuncType::~FuncType() FuncType::~FuncType() = default;
{
Unref(args);
Unref(arg_types);
Unref(yield);
}
BroType* FuncType::YieldType() BroType* FuncType::YieldType()
{ {
return yield; return yield.get();
} }
const BroType* FuncType::YieldType() const const BroType* FuncType::YieldType() const
{ {
return yield; return yield.get();
} }
int FuncType::MatchesIndex(ListExpr* const index) const int FuncType::MatchesIndex(ListExpr* const index) const
{ {
return check_and_promote_args(index, args) ? return check_and_promote_args(index, args.get()) ?
MATCHES_INDEX_SCALAR : DOES_NOT_MATCH_INDEX; MATCHES_INDEX_SCALAR : DOES_NOT_MATCH_INDEX;
} }
@ -606,28 +572,23 @@ void FuncType::DescribeReST(ODesc* d, bool roles_only) const
} }
} }
TypeDecl::TypeDecl(BroType* t, const char* i, attr_list* arg_attrs, bool in_record) TypeDecl::TypeDecl(IntrusivePtr<BroType> t, const char* i, attr_list* arg_attrs, bool in_record)
: type(std::move(t)),
attrs(arg_attrs ? make_intrusive<Attributes>(arg_attrs, type, in_record, false) : nullptr),
id(i)
{ {
type = t;
attrs = arg_attrs ? new Attributes(arg_attrs, t, in_record, false) : 0;
id = i;
} }
TypeDecl::TypeDecl(const TypeDecl& other) TypeDecl::TypeDecl(const TypeDecl& other)
{ {
type = other.type->Ref(); type = other.type;
attrs = other.attrs; attrs = other.attrs;
if ( attrs )
::Ref(attrs);
id = copy_string(other.id); id = copy_string(other.id);
} }
TypeDecl::~TypeDecl() TypeDecl::~TypeDecl()
{ {
Unref(type);
Unref(attrs);
delete [] id; delete [] id;
} }
@ -692,19 +653,19 @@ BroType* RecordType::FieldType(const char* field) const
BroType* RecordType::FieldType(int field) const BroType* RecordType::FieldType(int field) const
{ {
return (*types)[field]->type; 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);
if ( ! td->attrs ) if ( ! td->attrs )
return 0; return nullptr;
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
@ -806,9 +767,9 @@ static string container_type_name(const BroType* ft)
return s; return s;
} }
TableVal* RecordType::GetRecordFieldsVal(const RecordVal* rv) const IntrusivePtr<TableVal> RecordType::GetRecordFieldsVal(const RecordVal* rv) const
{ {
auto rval = new TableVal(internal_type("record_field_table")->AsTableType()); auto rval = make_intrusive<TableVal>(IntrusivePtr{NewRef{}, internal_type("record_field_table")->AsTableType()});
for ( int i = 0; i < NumFields(); ++i ) for ( int i = 0; i < NumFields(); ++i )
{ {
@ -824,15 +785,15 @@ TableVal* RecordType::GetRecordFieldsVal(const RecordVal* rv) const
bool logged = (fd->attrs && fd->FindAttr(ATTR_LOG) != 0); bool logged = (fd->attrs && fd->FindAttr(ATTR_LOG) != 0);
RecordVal* nr = new RecordVal(internal_type("record_field")->AsRecordType()); auto nr = make_intrusive<RecordVal>(internal_type("record_field")->AsRecordType());
string s = container_type_name(ft); string s = container_type_name(ft);
nr->Assign(0, new StringVal(s)); nr->Assign(0, make_intrusive<StringVal>(s));
nr->Assign(1, val_mgr->GetBool(logged)); nr->Assign(1, val_mgr->GetBool(logged));
nr->Assign(2, fv); nr->Assign(2, fv);
nr->Assign(3, FieldDefault(i)); nr->Assign(3, FieldDefault(i));
Val* field_name = new StringVal(FieldName(i)); Val* field_name = new StringVal(FieldName(i));
rval->Assign(field_name, nr); rval->Assign(field_name, std::move(nr));
Unref(field_name); Unref(field_name);
} }
@ -863,9 +824,9 @@ const char* RecordType::AddFields(type_decl_list* others, attr_list* attr)
if ( log ) if ( log )
{ {
if ( ! td->attrs ) if ( ! td->attrs )
td->attrs = new Attributes(new attr_list, td->type, true, false); td->attrs = make_intrusive<Attributes>(new attr_list, td->type, true, false);
td->attrs->AddAttr(new Attr(ATTR_LOG)); td->attrs->AddAttr(make_intrusive<Attr>(ATTR_LOG));
} }
types->push_back(td); types->push_back(td);
@ -874,7 +835,7 @@ const char* RecordType::AddFields(type_decl_list* others, attr_list* attr)
delete others; delete others;
num_fields = types->length(); num_fields = types->length();
return 0; return nullptr;
} }
void RecordType::DescribeFields(ODesc* d) const void RecordType::DescribeFields(ODesc* d) const
@ -890,7 +851,7 @@ void RecordType::DescribeFields(ODesc* d) const
d->Add(td->id); d->Add(td->id);
d->Add(":"); d->Add(":");
if ( d->FindType(td->type) ) if ( d->FindType(td->type.get()) )
d->Add("<recursion>"); d->Add("<recursion>");
else else
td->type->Describe(d); td->type->Describe(d);
@ -936,7 +897,7 @@ void RecordType::DescribeFieldsReST(ODesc* d, bool func_args) const
const TypeDecl* td = FieldDecl(i); const TypeDecl* td = FieldDecl(i);
if ( d->FindType(td->type) ) if ( d->FindType(td->type.get()) )
d->Add("<recursion>"); d->Add("<recursion>");
else else
{ {
@ -1046,20 +1007,16 @@ void SubNetType::Describe(ODesc* d) const
d->Add(int(Tag())); d->Add(int(Tag()));
} }
FileType::FileType(BroType* yield_type) FileType::FileType(IntrusivePtr<BroType> yield_type)
: BroType(TYPE_FILE) : BroType(TYPE_FILE), yield(std::move(yield_type))
{ {
yield = yield_type;
} }
FileType::~FileType() FileType::~FileType() = default;
{
Unref(yield);
}
BroType* FileType::YieldType() BroType* FileType::YieldType()
{ {
return yield; return yield.get();
} }
void FileType::Describe(ODesc* d) const void FileType::Describe(ODesc* d) const
@ -1104,18 +1061,10 @@ EnumType::EnumType(const string& name)
} }
EnumType::EnumType(const EnumType* e) EnumType::EnumType(const EnumType* e)
: BroType(TYPE_ENUM) : BroType(TYPE_ENUM), names(e->names), vals(e->vals)
{ {
counter = e->counter; counter = e->counter;
SetName(e->GetName()); SetName(e->GetName());
for ( auto it = e->names.begin(); it != e->names.end(); ++it )
names[it->first] = it->second;
vals = e->vals;
for ( auto& kv : vals )
::Ref(kv.second);
} }
EnumType* EnumType::ShallowClone() EnumType* EnumType::ShallowClone()
@ -1126,11 +1075,7 @@ EnumType* EnumType::ShallowClone()
return new EnumType(this); return new EnumType(this);
} }
EnumType::~EnumType() EnumType::~EnumType() = default;
{
for ( auto& kv : vals )
Unref(kv.second);
}
// Note, we use reporter->Error() here (not Error()) to include the current script // Note, we use reporter->Error() here (not Error()) to include the current script
// location in the error message, rather than the one where the type was // location in the error message, rather than the one where the type was
@ -1180,7 +1125,7 @@ void EnumType::CheckAndAddName(const string& module_name, const char* name,
id->SetEnumConst(); id->SetEnumConst();
if ( deprecation ) if ( deprecation )
id->MakeDeprecated(deprecation); id->MakeDeprecated({NewRef{}, deprecation});
zeekygen_mgr->Identifier(std::move(id)); zeekygen_mgr->Identifier(std::move(id));
} }
@ -1203,7 +1148,7 @@ void EnumType::CheckAndAddName(const string& module_name, const char* name,
AddNameInternal(module_name, name, val, is_export); AddNameInternal(module_name, name, val, is_export);
if ( vals.find(val) == vals.end() ) if ( vals.find(val) == vals.end() )
vals[val] = new EnumVal(this, val); vals[val] = IntrusivePtr{AdoptRef{}, new EnumVal(this, val)};
set<BroType*> types = BroType::GetAliases(GetName()); set<BroType*> types = BroType::GetAliases(GetName());
set<BroType*>::const_iterator it; set<BroType*>::const_iterator it;
@ -1239,7 +1184,7 @@ const char* EnumType::Lookup(bro_int_t value) const
if ( iter->second == value ) if ( iter->second == value )
return iter->first.c_str(); return iter->first.c_str();
return 0; return nullptr;
} }
EnumType::enum_name_list EnumType::Names() const EnumType::enum_name_list EnumType::Names() const
@ -1252,20 +1197,19 @@ EnumType::enum_name_list EnumType::Names() const
return n; return n;
} }
EnumVal* EnumType::GetVal(bro_int_t i) IntrusivePtr<EnumVal> EnumType::GetVal(bro_int_t i)
{ {
auto it = vals.find(i); auto it = vals.find(i);
EnumVal* rval; IntrusivePtr<EnumVal> rval;
if ( it == vals.end() ) if ( it == vals.end() )
{ {
rval = new EnumVal(this, i); rval = IntrusivePtr{AdoptRef{}, new EnumVal(this, i)};
vals[i] = rval; vals[i] = rval;
} }
else else
rval = it->second; rval = it->second;
::Ref(rval);
return rval; return rval;
} }
@ -1346,23 +1290,17 @@ void EnumType::DescribeReST(ODesc* d, bool roles_only) const
} }
} }
VectorType::VectorType(BroType* element_type) VectorType::VectorType(IntrusivePtr<BroType> element_type)
: BroType(TYPE_VECTOR), yield_type(element_type) : BroType(TYPE_VECTOR), yield_type(std::move(element_type))
{ {
} }
VectorType* VectorType::ShallowClone() VectorType* VectorType::ShallowClone()
{ {
if ( yield_type )
yield_type->Ref();
return new VectorType(yield_type); return new VectorType(yield_type);
} }
VectorType::~VectorType() VectorType::~VectorType() = default;
{
Unref(yield_type);
}
BroType* VectorType::YieldType() BroType* VectorType::YieldType()
{ {
@ -1371,14 +1309,9 @@ BroType* VectorType::YieldType()
// return any as that's what other code historically expects for type // return any as that's what other code historically expects for type
// comparisions. // comparisions.
if ( IsUnspecifiedVector() ) if ( IsUnspecifiedVector() )
{ return base_type_no_ref(TYPE_ANY);
BroType* ret = ::base_type(TYPE_ANY);
Unref(ret); // unref, because this won't be held by anyone.
assert(ret);
return ret;
}
return yield_type; return yield_type.get();
} }
const BroType* VectorType::YieldType() const const BroType* VectorType::YieldType() const
@ -1389,13 +1322,13 @@ const BroType* VectorType::YieldType() const
// comparisions. // comparisions.
if ( IsUnspecifiedVector() ) if ( IsUnspecifiedVector() )
{ {
BroType* ret = ::base_type(TYPE_ANY); auto ret = ::base_type(TYPE_ANY);
Unref(ret); // unref, because this won't be held by anyone.
assert(ret); assert(ret);
return ret; // release, because this won't be held by anyone.
return ret.release();
} }
return yield_type; return yield_type.get();
} }
int VectorType::MatchesIndex(ListExpr* const index) const int VectorType::MatchesIndex(ListExpr* const index) const
@ -1587,7 +1520,7 @@ int same_type(const BroType* t1, const BroType* t2, int is_init, bool match_reco
const TypeDecl* td2 = rt2->FieldDecl(i); const TypeDecl* td2 = rt2->FieldDecl(i);
if ( (match_record_field_names && ! streq(td1->id, td2->id)) || if ( (match_record_field_names && ! streq(td1->id, td2->id)) ||
! same_type(td1->type, td2->type, is_init, match_record_field_names) ) ! same_type(td1->type.get(), td2->type.get(), is_init, match_record_field_names) )
return 0; return 0;
} }
@ -1767,7 +1700,7 @@ TypeTag max_type(TypeTag t1, TypeTag t2)
} }
} }
BroType* merge_types(const BroType* t1, const BroType* t2) IntrusivePtr<BroType> merge_types(const BroType* t1, const BroType* t2)
{ {
t1 = flatten_type(t1); t1 = flatten_type(t1);
t2 = flatten_type(t2); t2 = flatten_type(t2);
@ -1781,7 +1714,7 @@ BroType* merge_types(const BroType* t1, const BroType* t2)
if ( tg1 != tg2 ) if ( tg1 != tg2 )
{ {
t1->Error("incompatible types", t2); t1->Error("incompatible types", t2);
return 0; return nullptr;
} }
switch ( tg1 ) { switch ( tg1 ) {
@ -1808,7 +1741,7 @@ BroType* merge_types(const BroType* t1, const BroType* t2)
t1->GetName().data(), t2->GetName().data()); t1->GetName().data(), t2->GetName().data());
t1->Error(msg.data(), t2); t1->Error(msg.data(), t2);
return 0; return nullptr;
} }
// Doing a lookup here as a roundabout way of ref-ing t1, without // Doing a lookup here as a roundabout way of ref-ing t1, without
@ -1821,14 +1754,14 @@ BroType* merge_types(const BroType* t1, const BroType* t2)
// than a copy since it may be redef'd later in parsing. If we // than a copy since it may be redef'd later in parsing. If we
// return a copy, then whoever is using this return value won't // return a copy, then whoever is using this return value won't
// actually see those changes from the redef. // actually see those changes from the redef.
return id->AsType()->Ref(); return {NewRef{}, id->AsType()};
std::string msg = fmt("incompatible enum types: '%s' and '%s'" std::string msg = fmt("incompatible enum types: '%s' and '%s'"
" ('%s' enum type ID is invalid)", " ('%s' enum type ID is invalid)",
t1->GetName().data(), t2->GetName().data(), t1->GetName().data(), t2->GetName().data(),
t1->GetName().data()); t1->GetName().data());
t1->Error(msg.data(), t2); t1->Error(msg.data(), t2);
return 0; return nullptr;
} }
case TYPE_TABLE: case TYPE_TABLE:
@ -1838,56 +1771,49 @@ BroType* merge_types(const BroType* t1, const BroType* t2)
const type_list* tl1 = it1->IndexTypes(); const type_list* tl1 = it1->IndexTypes();
const type_list* tl2 = it2->IndexTypes(); const type_list* tl2 = it2->IndexTypes();
TypeList* tl3 = 0; IntrusivePtr<TypeList> tl3;
if ( tl1 || tl2 ) if ( tl1 || tl2 )
{ {
if ( ! tl1 || ! tl2 || tl1->length() != tl2->length() ) if ( ! tl1 || ! tl2 || tl1->length() != tl2->length() )
{ {
t1->Error("incompatible types", t2); t1->Error("incompatible types", t2);
return 0; return nullptr;
} }
tl3 = new TypeList(); tl3 = make_intrusive<TypeList>();
loop_over_list(*tl1, i) loop_over_list(*tl1, i)
{ {
BroType* tl3_i = merge_types((*tl1)[i], (*tl2)[i]); auto tl3_i = merge_types((*tl1)[i], (*tl2)[i]);
if ( ! tl3_i ) if ( ! tl3_i )
{ return nullptr;
Unref(tl3);
return 0;
}
tl3->Append(tl3_i); tl3->Append(std::move(tl3_i));
} }
} }
const BroType* y1 = t1->YieldType(); const BroType* y1 = t1->YieldType();
const BroType* y2 = t2->YieldType(); const BroType* y2 = t2->YieldType();
BroType* y3 = 0; IntrusivePtr<BroType> y3;
if ( y1 || y2 ) if ( y1 || y2 )
{ {
if ( ! y1 || ! y2 ) if ( ! y1 || ! y2 )
{ {
t1->Error("incompatible types", t2); t1->Error("incompatible types", t2);
Unref(tl3); return nullptr;
return 0;
} }
y3 = merge_types(y1, y2); y3 = merge_types(y1, y2);
if ( ! y3 ) if ( ! y3 )
{ return nullptr;
Unref(tl3);
return 0;
}
} }
if ( t1->IsSet() ) if ( t1->IsSet() )
return new SetType(tl3, 0); return make_intrusive<SetType>(std::move(tl3), nullptr);
else else
return new TableType(tl3, y3); return make_intrusive<TableType>(std::move(tl3), std::move(y3));
} }
case TYPE_FUNC: case TYPE_FUNC:
@ -1895,16 +1821,17 @@ BroType* merge_types(const BroType* t1, const BroType* t2)
if ( ! same_type(t1, t2) ) if ( ! same_type(t1, t2) )
{ {
t1->Error("incompatible types", t2); t1->Error("incompatible types", t2);
return 0; return nullptr;
} }
const FuncType* ft1 = (const FuncType*) t1; const FuncType* ft1 = (const FuncType*) t1;
const FuncType* ft2 = (const FuncType*) t1; const FuncType* ft2 = (const FuncType*) t1;
BroType* args = merge_types(ft1->Args(), ft2->Args()); auto args = merge_types(ft1->Args(), ft2->Args());
BroType* yield = t1->YieldType() ? auto yield = t1->YieldType() ?
merge_types(t1->YieldType(), t2->YieldType()) : 0; merge_types(t1->YieldType(), t2->YieldType()) : nullptr;
return new FuncType(args->AsRecordType(), yield, ft1->Flavor()); return make_intrusive<FuncType>(IntrusivePtr{AdoptRef{}, args.release()->AsRecordType()},
std::move(yield), ft1->Flavor());
} }
case TYPE_RECORD: case TYPE_RECORD:
@ -1913,7 +1840,7 @@ BroType* merge_types(const BroType* t1, const BroType* t2)
const RecordType* rt2 = (const RecordType*) t2; const RecordType* rt2 = (const RecordType*) t2;
if ( rt1->NumFields() != rt2->NumFields() ) if ( rt1->NumFields() != rt2->NumFields() )
return 0; return nullptr;
type_decl_list* tdl3 = new type_decl_list(rt1->NumFields()); type_decl_list* tdl3 = new type_decl_list(rt1->NumFields());
@ -1921,20 +1848,19 @@ BroType* merge_types(const BroType* t1, const BroType* t2)
{ {
const TypeDecl* td1 = rt1->FieldDecl(i); const TypeDecl* td1 = rt1->FieldDecl(i);
const TypeDecl* td2 = rt2->FieldDecl(i); const TypeDecl* td2 = rt2->FieldDecl(i);
BroType* tdl3_i = merge_types(td1->type, td2->type); auto tdl3_i = merge_types(td1->type.get(), td2->type.get());
if ( ! streq(td1->id, td2->id) || ! tdl3_i ) if ( ! streq(td1->id, td2->id) || ! tdl3_i )
{ {
t1->Error("incompatible record fields", t2); t1->Error("incompatible record fields", t2);
delete tdl3; delete tdl3;
Unref(tdl3_i); return nullptr;
return 0;
} }
tdl3->push_back(new TypeDecl(tdl3_i, copy_string(td1->id))); tdl3->push_back(new TypeDecl(std::move(tdl3_i), copy_string(td1->id)));
} }
return new RecordType(tdl3); return make_intrusive<RecordType>(tdl3);
} }
case TYPE_LIST: case TYPE_LIST:
@ -1945,7 +1871,7 @@ BroType* merge_types(const BroType* t1, const BroType* t2)
if ( tl1->IsPure() != tl2->IsPure() ) if ( tl1->IsPure() != tl2->IsPure() )
{ {
tl1->Error("incompatible lists", tl2); tl1->Error("incompatible lists", tl2);
return 0; return nullptr;
} }
const type_list* l1 = tl1->Types(); const type_list* l1 = tl1->Types();
@ -1957,7 +1883,7 @@ BroType* merge_types(const BroType* t1, const BroType* t2)
tl1->Error("empty list"); tl1->Error("empty list");
else else
tl2->Error("empty list"); tl2->Error("empty list");
return 0; return nullptr;
} }
if ( tl1->IsPure() ) if ( tl1->IsPure() )
@ -1974,10 +1900,10 @@ BroType* merge_types(const BroType* t1, const BroType* t2)
if ( l1->length() != l2->length() ) if ( l1->length() != l2->length() )
{ {
tl1->Error("different number of indices", tl2); tl1->Error("different number of indices", tl2);
return 0; return nullptr;
} }
TypeList* tl3 = new TypeList(); auto tl3 = make_intrusive<TypeList>();
loop_over_list(*l1, i) loop_over_list(*l1, i)
tl3->Append(merge_types((*l1)[i], (*l2)[i])); tl3->Append(merge_types((*l1)[i], (*l2)[i]));
@ -1988,31 +1914,31 @@ BroType* merge_types(const BroType* t1, const BroType* t2)
if ( ! same_type(t1->YieldType(), t2->YieldType()) ) if ( ! same_type(t1->YieldType(), t2->YieldType()) )
{ {
t1->Error("incompatible types", t2); t1->Error("incompatible types", t2);
return 0; return nullptr;
} }
return new VectorType(merge_types(t1->YieldType(), t2->YieldType())); return make_intrusive<VectorType>(merge_types(t1->YieldType(), t2->YieldType()));
case TYPE_FILE: case TYPE_FILE:
if ( ! same_type(t1->YieldType(), t2->YieldType()) ) if ( ! same_type(t1->YieldType(), t2->YieldType()) )
{ {
t1->Error("incompatible types", t2); t1->Error("incompatible types", t2);
return 0; return nullptr;
} }
return new FileType(merge_types(t1->YieldType(), t2->YieldType())); return make_intrusive<FileType>(merge_types(t1->YieldType(), t2->YieldType()));
case TYPE_UNION: case TYPE_UNION:
reporter->InternalError("union type in merge_types()"); reporter->InternalError("union type in merge_types()");
return 0; return nullptr;
default: default:
reporter->InternalError("bad type in merge_types()"); reporter->InternalError("bad type in merge_types()");
return 0; return nullptr;
} }
} }
BroType* merge_type_list(ListExpr* elements) IntrusivePtr<BroType> merge_type_list(ListExpr* elements)
{ {
TypeList* tl_type = elements->Type()->AsTypeList(); TypeList* tl_type = elements->Type()->AsTypeList();
type_list* tl = tl_type->Types(); type_list* tl = tl_type->Types();
@ -2020,20 +1946,16 @@ BroType* merge_type_list(ListExpr* elements)
if ( tl->length() < 1 ) if ( tl->length() < 1 )
{ {
reporter->Error("no type can be inferred for empty list"); reporter->Error("no type can be inferred for empty list");
return 0; return nullptr;
} }
BroType* t = (*tl)[0]->Ref(); IntrusivePtr<BroType> t{NewRef{}, (*tl)[0]};
if ( tl->length() == 1 ) if ( tl->length() == 1 )
return t; return t;
for ( int i = 1; t && i < tl->length(); ++i ) for ( int i = 1; t && i < tl->length(); ++i )
{ t = merge_types(t.get(), (*tl)[i]);
BroType* t_new = merge_types(t, (*tl)[i]);
Unref(t);
t = t_new;
}
if ( ! t ) if ( ! t )
reporter->Error("inconsistent types in list"); reporter->Error("inconsistent types in list");
@ -2060,7 +1982,7 @@ static BroType* reduce_type(BroType* t)
return t; return t;
} }
BroType* init_type(Expr* init) IntrusivePtr<BroType> init_type(Expr* init)
{ {
if ( init->Tag() != EXPR_LIST ) if ( init->Tag() != EXPR_LIST )
{ {
@ -2076,7 +1998,7 @@ BroType* init_type(Expr* init)
return nullptr; return nullptr;
} }
return t.release(); return t;
} }
ListExpr* init_list = init->AsListExpr(); ListExpr* init_list = init->AsListExpr();
@ -2094,7 +2016,7 @@ BroType* init_type(Expr* init)
if ( e0->IsRecordElement(0) ) if ( e0->IsRecordElement(0) )
// ListExpr's know how to build a record from their // ListExpr's know how to build a record from their
// components. // components.
return init_list->InitType().release(); return init_list->InitType();
auto t = e0->InitType(); auto t = e0->InitType();
@ -2115,7 +2037,7 @@ BroType* init_type(Expr* init)
if ( same_type(t.get(), ti) ) if ( same_type(t.get(), ti) )
continue; continue;
t = IntrusivePtr<BroType>{AdoptRef{}, merge_types(t.get(), ti)}; t = merge_types(t.get(), ti);
} }
if ( ! t ) if ( ! t )
@ -2126,18 +2048,18 @@ BroType* init_type(Expr* init)
if ( t->Tag() == TYPE_TABLE && ! t->AsTableType()->IsSet() ) if ( t->Tag() == TYPE_TABLE && ! t->AsTableType()->IsSet() )
// A list of table elements. // A list of table elements.
return t.release(); return t;
// A set. If the index type isn't yet a type list, make // A set. If the index type isn't yet a type list, make
// it one, as that's what's required for creating a set type. // it one, as that's what's required for creating a set type.
if ( t->Tag() != TYPE_LIST ) if ( t->Tag() != TYPE_LIST )
{ {
auto tl = make_intrusive<TypeList>(t.get()->Ref()); auto tl = make_intrusive<TypeList>(t);
tl->Append(t.release()); tl->Append(std::move(t));
t = std::move(tl); t = std::move(tl);
} }
return new SetType(t.release()->AsTypeList(), 0); return make_intrusive<SetType>(IntrusivePtr{AdoptRef{}, t.release()->AsTypeList()}, nullptr);
} }
bool is_atomic_type(const BroType* t) bool is_atomic_type(const BroType* t)

View file

@ -5,6 +5,7 @@
#include "Obj.h" #include "Obj.h"
#include "Attr.h" #include "Attr.h"
#include "BroList.h" #include "BroList.h"
#include "IntrusivePtr.h"
#include <string> #include <string>
#include <set> #include <set>
@ -346,12 +347,11 @@ private:
class TypeList : public BroType { class TypeList : public BroType {
public: public:
explicit TypeList(BroType* arg_pure_type = 0) : BroType(TYPE_LIST) explicit TypeList(IntrusivePtr<BroType> arg_pure_type = nullptr)
: BroType(TYPE_LIST), pure_type(std::move(arg_pure_type))
{ {
pure_type = arg_pure_type;
if ( pure_type )
pure_type->Ref();
} }
~TypeList() override; ~TypeList() override;
const type_list* Types() const { return &types; } const type_list* Types() const { return &types; }
@ -361,23 +361,23 @@ public:
// Returns the underlying pure type, or nil if the list // Returns the underlying pure type, or nil if the list
// is not pure or is empty. // is not pure or is empty.
BroType* PureType() { return pure_type; } BroType* PureType() { return pure_type.get(); }
const BroType* PureType() const { return pure_type; } const BroType* PureType() const { return pure_type.get(); }
// True if all of the types match t, false otherwise. If // True if all of the types match t, false otherwise. If
// is_init is true, then the matching is done in the context // is_init is true, then the matching is done in the context
// of an initialization. // of an initialization.
int AllMatch(const BroType* t, int is_init) const; int AllMatch(const BroType* t, int is_init) const;
void Append(BroType* t); void Append(IntrusivePtr<BroType> t);
void AppendEvenIfNotPure(BroType* t); void AppendEvenIfNotPure(IntrusivePtr<BroType> t);
void Describe(ODesc* d) const override; void Describe(ODesc* d) const override;
unsigned int MemoryAllocation() const override; unsigned int MemoryAllocation() const override;
protected: protected:
BroType* pure_type; IntrusivePtr<BroType> pure_type;
type_list types; type_list types;
}; };
@ -385,7 +385,7 @@ class IndexType : public BroType {
public: public:
int MatchesIndex(ListExpr* index) const override; int MatchesIndex(ListExpr* index) const override;
TypeList* Indices() const { return indices; } TypeList* Indices() const { return indices.get(); }
const type_list* IndexTypes() const { return indices->Types(); } const type_list* IndexTypes() const { return indices->Types(); }
BroType* YieldType() override; BroType* YieldType() override;
const BroType* YieldType() const override; const BroType* YieldType() const override;
@ -397,22 +397,22 @@ public:
bool IsSubNetIndex() const; bool IsSubNetIndex() const;
protected: protected:
IndexType(){ indices = 0; yield_type = 0; } IndexType(TypeTag t, IntrusivePtr<TypeList> arg_indices,
IndexType(TypeTag t, TypeList* arg_indices, BroType* arg_yield_type) : IntrusivePtr<BroType> arg_yield_type)
BroType(t) : BroType(t), indices(std::move(arg_indices)),
yield_type(std::move(arg_yield_type))
{ {
indices = arg_indices;
yield_type = arg_yield_type;
} }
~IndexType() override; ~IndexType() override;
TypeList* indices; IntrusivePtr<TypeList> indices;
BroType* yield_type; IntrusivePtr<BroType> yield_type;
}; };
class TableType : public IndexType { class TableType : public IndexType {
public: public:
TableType(TypeList* ind, BroType* yield); TableType(IntrusivePtr<TypeList> ind, IntrusivePtr<BroType> yield);
TableType* ShallowClone() override; TableType* ShallowClone() override;
@ -421,87 +421,81 @@ public:
bool IsUnspecifiedTable() const; bool IsUnspecifiedTable() const;
protected: protected:
TableType() {}
TypeList* ExpandRecordIndex(RecordType* rt) const; TypeList* ExpandRecordIndex(RecordType* rt) const;
}; };
class SetType : public TableType { class SetType : public TableType {
public: public:
SetType(TypeList* ind, ListExpr* arg_elements); SetType(IntrusivePtr<TypeList> ind, IntrusivePtr<ListExpr> arg_elements);
~SetType() override; ~SetType() override;
SetType* ShallowClone() override; SetType* ShallowClone() override;
ListExpr* SetElements() const { return elements; } ListExpr* SetElements() const { return elements.get(); }
protected: protected:
SetType() {} IntrusivePtr<ListExpr> elements;
ListExpr* elements;
}; };
class FuncType : public BroType { class FuncType : public BroType {
public: public:
FuncType(RecordType* args, BroType* yield, function_flavor f); FuncType(IntrusivePtr<RecordType> args, IntrusivePtr<BroType> yield,
function_flavor f);
FuncType* ShallowClone() override; FuncType* ShallowClone() override;
~FuncType() override; ~FuncType() override;
RecordType* Args() const { return args; } RecordType* Args() const { return args.get(); }
BroType* YieldType() override; BroType* YieldType() override;
const BroType* YieldType() const override; const BroType* YieldType() const override;
void SetYieldType(BroType* arg_yield) { yield = arg_yield; } void SetYieldType(IntrusivePtr<BroType> arg_yield) { yield = std::move(arg_yield); }
function_flavor Flavor() const { return flavor; } function_flavor Flavor() const { return flavor; }
std::string FlavorString() const; std::string FlavorString() const;
// Used to convert a function type to an event or hook type. // Used to convert a function type to an event or hook type.
void ClearYieldType(function_flavor arg_flav) void ClearYieldType(function_flavor arg_flav)
{ Unref(yield); yield = 0; flavor = arg_flav; } { yield = nullptr; flavor = arg_flav; }
int MatchesIndex(ListExpr* index) const override; int MatchesIndex(ListExpr* index) const override;
int CheckArgs(const type_list* args, bool is_init = false) const; int CheckArgs(const type_list* args, bool is_init = false) const;
TypeList* ArgTypes() const { return arg_types; } TypeList* ArgTypes() const { return arg_types.get(); }
void Describe(ODesc* d) const override; void Describe(ODesc* d) const override;
void DescribeReST(ODesc* d, bool roles_only = false) const override; void DescribeReST(ODesc* d, bool roles_only = false) const override;
protected: protected:
FuncType() : BroType(TYPE_FUNC) { args = 0; arg_types = 0; yield = 0; flavor = FUNC_FLAVOR_FUNCTION; } FuncType() : BroType(TYPE_FUNC) { flavor = FUNC_FLAVOR_FUNCTION; }
RecordType* args; IntrusivePtr<RecordType> args;
TypeList* arg_types; IntrusivePtr<TypeList> arg_types;
BroType* yield; IntrusivePtr<BroType> yield;
function_flavor flavor; function_flavor flavor;
}; };
class TypeType : public BroType { class TypeType : public BroType {
public: public:
explicit TypeType(BroType* t) : BroType(TYPE_TYPE) { type = t->Ref(); } explicit TypeType(IntrusivePtr<BroType> t) : BroType(TYPE_TYPE), type(std::move(t)) {}
TypeType* ShallowClone() override { return new TypeType(type); } TypeType* ShallowClone() override { return new TypeType(type); }
~TypeType() override { Unref(type); }
BroType* Type() { return type; } BroType* Type() { return type.get(); }
protected: protected:
TypeType() {} IntrusivePtr<BroType> type;
BroType* type;
}; };
class TypeDecl { class TypeDecl final {
public: public:
TypeDecl(BroType* t, const char* i, attr_list* attrs = 0, bool in_record = false); TypeDecl(IntrusivePtr<BroType> t, const char* i, attr_list* attrs = 0, bool in_record = false);
TypeDecl(const TypeDecl& other); TypeDecl(const TypeDecl& other);
virtual ~TypeDecl(); ~TypeDecl();
const Attr* FindAttr(attr_tag a) const const Attr* FindAttr(attr_tag a) const
{ return attrs ? attrs->FindAttr(a) : 0; } { return attrs ? attrs->FindAttr(a) : 0; }
virtual void DescribeReST(ODesc* d, bool roles_only = false) const; void DescribeReST(ODesc* d, bool roles_only = false) const;
BroType* type; IntrusivePtr<BroType> type;
Attributes* attrs; IntrusivePtr<Attributes> attrs;
const char* id; const char* id;
}; };
@ -517,7 +511,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.
@ -539,7 +533,7 @@ public:
* @param rv an optional record value, if given the values of * @param rv an optional record value, if given the values of
* all fields will be provided in the returned table. * all fields will be provided in the returned table.
*/ */
TableVal* GetRecordFieldsVal(const RecordVal* rv = nullptr) const; IntrusivePtr<TableVal> GetRecordFieldsVal(const RecordVal* rv = nullptr) const;
// Returns 0 if all is ok, otherwise a pointer to an error message. // Returns 0 if all is ok, otherwise a pointer to an error message.
// Takes ownership of list. // Takes ownership of list.
@ -579,8 +573,8 @@ public:
class FileType : public BroType { class FileType : public BroType {
public: public:
explicit FileType(BroType* yield_type); explicit FileType(IntrusivePtr<BroType> yield_type);
FileType* ShallowClone() override { return new FileType(yield->Ref()); } FileType* ShallowClone() override { return new FileType(yield); }
~FileType() override; ~FileType() override;
BroType* YieldType() override; BroType* YieldType() override;
@ -588,9 +582,7 @@ public:
void Describe(ODesc* d) const override; void Describe(ODesc* d) const override;
protected: protected:
FileType() { yield = 0; } IntrusivePtr<BroType> yield;
BroType* yield;
}; };
class OpaqueType : public BroType { class OpaqueType : public BroType {
@ -638,11 +630,9 @@ public:
void DescribeReST(ODesc* d, bool roles_only = false) const override; void DescribeReST(ODesc* d, bool roles_only = false) const override;
EnumVal* GetVal(bro_int_t i); IntrusivePtr<EnumVal> GetVal(bro_int_t i);
protected: protected:
EnumType() { counter = 0; }
void AddNameInternal(const std::string& module_name, void AddNameInternal(const std::string& module_name,
const char* name, bro_int_t val, bool is_export); const char* name, bro_int_t val, bool is_export);
@ -653,7 +643,7 @@ protected:
typedef std::map<std::string, bro_int_t> NameMap; typedef std::map<std::string, bro_int_t> NameMap;
NameMap names; NameMap names;
using ValMap = std::unordered_map<bro_int_t, EnumVal*>; using ValMap = std::unordered_map<bro_int_t, IntrusivePtr<EnumVal>>;
ValMap vals; ValMap vals;
// The counter is initialized to 0 and incremented on every implicit // The counter is initialized to 0 and incremented on every implicit
@ -667,7 +657,7 @@ protected:
class VectorType : public BroType { class VectorType : public BroType {
public: public:
explicit VectorType(BroType* t); explicit VectorType(IntrusivePtr<BroType> t);
VectorType* ShallowClone() override; VectorType* ShallowClone() override;
~VectorType() override; ~VectorType() override;
BroType* YieldType() override; BroType* YieldType() override;
@ -683,9 +673,7 @@ public:
void DescribeReST(ODesc* d, bool roles_only = false) const override; void DescribeReST(ODesc* d, bool roles_only = false) const override;
protected: protected:
VectorType() { yield_type = 0; } IntrusivePtr<BroType> yield_type;
BroType* yield_type;
}; };
extern OpaqueType* md5_type; extern OpaqueType* md5_type;
@ -705,11 +693,11 @@ BroType* base_type_no_ref(TypeTag tag);
// Returns the basic (non-parameterized) type with the given type. // Returns the basic (non-parameterized) type with the given type.
// The caller assumes responsibility for a reference to the type. // The caller assumes responsibility for a reference to the type.
inline BroType* base_type(TypeTag tag) inline IntrusivePtr<BroType> base_type(TypeTag tag)
{ return base_type_no_ref(tag)->Ref(); } { return {NewRef{}, base_type_no_ref(tag)}; }
// Returns the basic error type. // Returns the basic error type.
inline BroType* error_type() { return base_type(TYPE_ERROR); } inline IntrusivePtr<BroType> error_type() { return base_type(TYPE_ERROR); }
// True if the two types are equivalent. If is_init is true then the test is // True if the two types are equivalent. If is_init is true then the test is
// done in the context of an initialization. If match_record_field_names is // done in the context of an initialization. If match_record_field_names is
@ -735,15 +723,15 @@ extern TypeTag max_type(TypeTag t1, TypeTag t2);
// Given two types, returns the "merge", in which promotable types // Given two types, returns the "merge", in which promotable types
// are promoted to the maximum of the two. Returns nil (and generates // are promoted to the maximum of the two. Returns nil (and generates
// an error message) if the types are incompatible. // an error message) if the types are incompatible.
extern BroType* merge_types(const BroType* t1, const BroType* t2); IntrusivePtr<BroType> merge_types(const BroType* t1, const BroType* t2);
// Given a list of expressions, returns a (ref'd) type reflecting // Given a list of expressions, returns a (ref'd) type reflecting
// a merged type consistent across all of them, or nil if this // a merged type consistent across all of them, or nil if this
// cannot be done. // cannot be done.
BroType* merge_type_list(ListExpr* elements); IntrusivePtr<BroType> merge_type_list(ListExpr* elements);
// Given an expression, infer its type when used for an initialization. // Given an expression, infer its type when used for an initialization.
extern BroType* init_type(Expr* init); IntrusivePtr<BroType> init_type(Expr* init);
// Returns true if argument is an atomic type. // Returns true if argument is an atomic type.
bool is_atomic_type(const BroType* t); bool is_atomic_type(const BroType* t);

File diff suppressed because it is too large Load diff

145
src/Val.h
View file

@ -2,6 +2,7 @@
#pragma once #pragma once
#include "IntrusivePtr.h"
#include "Type.h" #include "Type.h"
#include "Timer.h" #include "Timer.h"
#include "Notifier.h" #include "Notifier.h"
@ -27,9 +28,7 @@ using std::string;
#define UDP_PORT_MASK 0x20000 #define UDP_PORT_MASK 0x20000
#define ICMP_PORT_MASK 0x30000 #define ICMP_PORT_MASK 0x30000
template <class T> class IntrusivePtr;
template<typename T> class PDict; template<typename T> class PDict;
template <class T> class IntrusivePtr;
class IterCookie; class IterCookie;
class Val; class Val;
@ -130,7 +129,7 @@ union BroValUnion {
class Val : public BroObj { class Val : public BroObj {
public: public:
Val(double d, TypeTag t) Val(double d, TypeTag t)
: val(d), type(base_type(t)) : val(d), type(base_type(t).release())
{ {
} }
@ -142,19 +141,19 @@ public:
// Extra arg to differentiate from protected version. // Extra arg to differentiate from protected version.
Val(BroType* t, bool type_type) Val(BroType* t, bool type_type)
: type(new TypeType(t->Ref())) : type(new TypeType({NewRef{}, t}))
{ {
} }
Val() Val()
: val(bro_int_t(0)), type(base_type(TYPE_ERROR)) : val(bro_int_t(0)), type(base_type(TYPE_ERROR).release())
{ {
} }
~Val() override; ~Val() override;
Val* Ref() { ::Ref(this); return this; } Val* Ref() { ::Ref(this); return this; }
Val* Clone(); IntrusivePtr<Val> Clone();
int IsZero() const; int IsZero() const;
int IsOne() const; int IsOne() const;
@ -169,7 +168,7 @@ public:
// Returns a new Val with the "size" of this Val. What constitutes // Returns a new Val with the "size" of this Val. What constitutes
// size depends on the Val's type. // size depends on the Val's type.
virtual Val* SizeVal() const; virtual IntrusivePtr<Val> SizeVal() const;
// Bytes in total value object. // Bytes in total value object.
virtual unsigned int MemoryAllocation() const; virtual unsigned int MemoryAllocation() const;
@ -323,9 +322,9 @@ public:
static bool WouldOverflow(const BroType* from_type, const BroType* to_type, const Val* val); static bool WouldOverflow(const BroType* from_type, const BroType* to_type, const Val* val);
TableVal* GetRecordFields(); IntrusivePtr<TableVal> GetRecordFields();
StringVal* ToJSON(bool only_loggable=false, RE_Matcher* re=nullptr); IntrusivePtr<StringVal> ToJSON(bool only_loggable=false, RE_Matcher* re=nullptr);
protected: protected:
@ -356,7 +355,7 @@ protected:
template<typename V> template<typename V>
Val(V &&v, TypeTag t) noexcept Val(V &&v, TypeTag t) noexcept
: val(std::forward<V>(v)), type(base_type(t)) : val(std::forward<V>(v)), type(base_type(t).release())
{ {
} }
@ -379,17 +378,13 @@ protected:
// Caches a cloned value for later reuse during the same // Caches a cloned value for later reuse during the same
// cloning operation. For recursive types, call this *before* // cloning operation. For recursive types, call this *before*
// descending down. // descending down.
Val* NewClone(Val *src, Val* dst) IntrusivePtr<Val> NewClone(Val* src, IntrusivePtr<Val> dst);
{
clones.insert(std::make_pair(src, dst));
return dst;
}
std::unordered_map<Val*, Val*> clones; std::unordered_map<Val*, Val*> clones;
}; };
Val* Clone(CloneState* state); IntrusivePtr<Val> Clone(CloneState* state);
virtual Val* DoClone(CloneState* state); virtual IntrusivePtr<Val> DoClone(CloneState* state);
BroValUnion val; BroValUnion val;
BroType* type; BroType* type;
@ -476,7 +471,7 @@ protected:
class PortVal : public Val { class PortVal : public Val {
public: public:
Val* SizeVal() const override { return val_mgr->GetInt(val.uint_val); } IntrusivePtr<Val> SizeVal() const override;
// Returns the port number in host order (not including the mask). // Returns the port number in host order (not including the mask).
uint32_t Port() const; uint32_t Port() const;
@ -507,7 +502,7 @@ protected:
PortVal(uint32_t p); PortVal(uint32_t p);
void ValDescribe(ODesc* d) const override; void ValDescribe(ODesc* d) const override;
Val* DoClone(CloneState* state) override; IntrusivePtr<Val> DoClone(CloneState* state) override;
}; };
class AddrVal : public Val { class AddrVal : public Val {
@ -516,7 +511,7 @@ public:
explicit AddrVal(const std::string& text); explicit AddrVal(const std::string& text);
~AddrVal() override; ~AddrVal() override;
Val* SizeVal() const override; IntrusivePtr<Val> SizeVal() const override;
// Constructor for address already in network order. // Constructor for address already in network order.
explicit AddrVal(uint32_t addr); // IPv4. explicit AddrVal(uint32_t addr); // IPv4.
@ -526,7 +521,7 @@ public:
unsigned int MemoryAllocation() const override; unsigned int MemoryAllocation() const override;
protected: protected:
Val* DoClone(CloneState* state) override; IntrusivePtr<Val> DoClone(CloneState* state) override;
}; };
class SubNetVal : public Val { class SubNetVal : public Val {
@ -539,7 +534,7 @@ public:
explicit SubNetVal(const IPPrefix& prefix); explicit SubNetVal(const IPPrefix& prefix);
~SubNetVal() override; ~SubNetVal() override;
Val* SizeVal() const override; IntrusivePtr<Val> SizeVal() const override;
const IPAddr& Prefix() const; const IPAddr& Prefix() const;
int Width() const; int Width() const;
@ -551,7 +546,7 @@ public:
protected: protected:
void ValDescribe(ODesc* d) const override; void ValDescribe(ODesc* d) const override;
Val* DoClone(CloneState* state) override; IntrusivePtr<Val> DoClone(CloneState* state) override;
}; };
class StringVal : public Val { class StringVal : public Val {
@ -561,7 +556,7 @@ public:
explicit StringVal(const string& s); explicit StringVal(const string& s);
StringVal(int length, const char* s); StringVal(int length, const char* s);
Val* SizeVal() const override; IntrusivePtr<Val> SizeVal() const override;
int Len(); int Len();
const u_char* Bytes(); const u_char* Bytes();
@ -581,7 +576,7 @@ public:
protected: protected:
void ValDescribe(ODesc* d) const override; void ValDescribe(ODesc* d) const override;
Val* DoClone(CloneState* state) override; IntrusivePtr<Val> DoClone(CloneState* state) override;
}; };
class PatternVal : public Val { class PatternVal : public Val {
@ -597,7 +592,7 @@ public:
protected: protected:
void ValDescribe(ODesc* d) const override; void ValDescribe(ODesc* d) const override;
Val* DoClone(CloneState* state) override; IntrusivePtr<Val> DoClone(CloneState* state) override;
}; };
// ListVals are mainly used to index tables that have more than one // ListVals are mainly used to index tables that have more than one
@ -609,7 +604,7 @@ public:
TypeTag BaseTag() const { return tag; } TypeTag BaseTag() const { return tag; }
Val* SizeVal() const override { return val_mgr->GetCount(vals.length()); } IntrusivePtr<Val> SizeVal() const override;
int Length() const { return vals.length(); } int Length() const { return vals.length(); }
Val* Index(const int n) { return vals[n]; } Val* Index(const int n) { return vals[n]; }
@ -638,7 +633,7 @@ public:
unsigned int MemoryAllocation() const override; unsigned int MemoryAllocation() const override;
protected: protected:
Val* DoClone(CloneState* state) override; IntrusivePtr<Val> DoClone(CloneState* state) override;
val_list vals; val_list vals;
TypeTag tag; TypeTag tag;
@ -648,27 +643,18 @@ extern double bro_start_network_time;
class TableEntryVal { class TableEntryVal {
public: public:
explicit TableEntryVal(Val* v) template<typename V>
explicit TableEntryVal(V&& v)
: val(std::forward<V>(v))
{ {
val = v;
last_access_time = network_time; last_access_time = network_time;
expire_access_time = expire_access_time =
int(network_time - bro_start_network_time); int(network_time - bro_start_network_time);
} }
TableEntryVal* Clone(Val::CloneState* state) TableEntryVal* Clone(Val::CloneState* state);
{
auto rval = new TableEntryVal(val ? val->Clone(state) : nullptr);
rval->last_access_time = last_access_time;
rval->expire_access_time = expire_access_time;
return rval;
}
~TableEntryVal() { } Val* Value() { return val.get(); }
Val* Value() { return val; }
void Ref() { val->Ref(); }
void Unref() { ::Unref(val); }
// Returns/sets time of last expiration relevant access to this value. // Returns/sets time of last expiration relevant access to this value.
double ExpireAccessTime() const double ExpireAccessTime() const
@ -679,7 +665,7 @@ public:
protected: protected:
friend class TableVal; friend class TableVal;
Val* val; IntrusivePtr<Val> val;
double last_access_time; double last_access_time;
// The next entry stores seconds since Bro's start. We use ints here // The next entry stores seconds since Bro's start. We use ints here
@ -707,7 +693,7 @@ class Frame;
class TableVal : public Val, public notifier::Modifiable { class TableVal : public Val, public notifier::Modifiable {
public: public:
explicit TableVal(TableType* t, Attributes* attrs = 0); explicit TableVal(IntrusivePtr<TableType> t, IntrusivePtr<Attributes> attrs = nullptr);
~TableVal() override; ~TableVal() override;
// Returns true if the assignment typechecked, false if not. The // Returns true if the assignment typechecked, false if not. The
@ -715,10 +701,12 @@ public:
// version takes a HashKey and Unref()'s it when done. If we're a // version takes a HashKey and Unref()'s it when done. If we're a
// set, new_val has to be nil. If we aren't a set, index may be nil // set, new_val has to be nil. If we aren't a set, index may be nil
// in the second version. // in the second version.
int Assign(Val* index, IntrusivePtr<Val> new_val);
int Assign(Val* index, Val* new_val); int Assign(Val* index, Val* new_val);
int Assign(Val* index, HashKey* k, IntrusivePtr<Val> new_val);
int Assign(Val* index, HashKey* k, Val* new_val); int Assign(Val* index, HashKey* k, Val* new_val);
Val* SizeVal() const override { return val_mgr->GetCount(Size()); } IntrusivePtr<Val> SizeVal() const override;
// Add the entire contents of the table to the given value, // Add the entire contents of the table to the given value,
// which must also be a TableVal. // which must also be a TableVal.
@ -761,17 +749,17 @@ public:
// Returns the element's value if it exists in the table, // Returns the element's value if it exists in the table,
// nil otherwise. Note, "index" is not const because we // nil otherwise. Note, "index" is not const because we
// need to Ref/Unref it when calling the default function. // need to Ref/Unref it when calling the default function.
Val* Lookup(Val* index, bool use_default_val = true); IntrusivePtr<Val> Lookup(Val* index, bool use_default_val = true);
// For a table[subnet]/set[subnet], return all subnets that cover // For a table[subnet]/set[subnet], return all subnets that cover
// the given subnet. // the given subnet.
// Causes an internal error if called for any other kind of table. // Causes an internal error if called for any other kind of table.
VectorVal* LookupSubnets(const SubNetVal* s); IntrusivePtr<VectorVal> LookupSubnets(const SubNetVal* s);
// For a set[subnet]/table[subnet], return a new table that only contains // For a set[subnet]/table[subnet], return a new table that only contains
// entries that cover the given subnet. // entries that cover the given subnet.
// Causes an internal error if called for any other kind of table. // Causes an internal error if called for any other kind of table.
TableVal* LookupSubnetValues(const SubNetVal* s); IntrusivePtr<TableVal> LookupSubnetValues(const SubNetVal* s);
// Sets the timestamp for the given index to network time. // Sets the timestamp for the given index to network time.
// Returns false if index does not exist. // Returns false if index does not exist.
@ -781,16 +769,16 @@ public:
ListVal* RecoverIndex(const HashKey* k) const; ListVal* RecoverIndex(const HashKey* k) const;
// Returns the element if it was in the table, false otherwise. // Returns the element if it was in the table, false otherwise.
Val* Delete(const Val* index); IntrusivePtr<Val> Delete(const Val* index);
Val* Delete(const HashKey* k); IntrusivePtr<Val> Delete(const HashKey* k);
// Returns a ListVal representation of the table (which must be a set). // Returns a ListVal representation of the table (which must be a set).
ListVal* ConvertToList(TypeTag t=TYPE_ANY) const; ListVal* ConvertToList(TypeTag t=TYPE_ANY) const;
ListVal* ConvertToPureList() const; // must be single index type ListVal* ConvertToPureList() const; // must be single index type
void SetAttrs(Attributes* attrs); void SetAttrs(IntrusivePtr<Attributes> attrs);
Attr* FindAttr(attr_tag t) const; Attr* FindAttr(attr_tag t) const;
Attributes* Attrs() { return attrs; } Attributes* Attrs() { return attrs.get(); }
// Returns the size of the table. // Returns the size of the table.
int Size() const; int Size() const;
@ -824,14 +812,14 @@ public:
notifier::Modifiable* Modifiable() override { return this; } notifier::Modifiable* Modifiable() override { return this; }
protected: protected:
void Init(TableType* t); void Init(IntrusivePtr<TableType> t);
void CheckExpireAttr(attr_tag at); void CheckExpireAttr(attr_tag at);
int ExpandCompoundAndInit(val_list* vl, int k, IntrusivePtr<Val> new_val); int ExpandCompoundAndInit(val_list* vl, int k, IntrusivePtr<Val> new_val);
int CheckAndAssign(Val* index, IntrusivePtr<Val> new_val); int CheckAndAssign(Val* index, IntrusivePtr<Val> new_val);
// Calculates default value for index. Returns 0 if none. // Calculates default value for index. Returns 0 if none.
Val* Default(Val* index); IntrusivePtr<Val> Default(Val* index);
// Returns true if item expiration is enabled. // Returns true if item expiration is enabled.
bool ExpirationEnabled() { return expire_time != 0; } bool ExpirationEnabled() { return expire_time != 0; }
@ -851,18 +839,18 @@ protected:
// Calls &change_func. Does not take ownership of values. (Refs if needed). // Calls &change_func. Does not take ownership of values. (Refs if needed).
void CallChangeFunc(const Val* index, Val* old_value, OnChangeType tpe); void CallChangeFunc(const Val* index, Val* old_value, OnChangeType tpe);
Val* DoClone(CloneState* state) override; IntrusivePtr<Val> DoClone(CloneState* state) override;
TableType* table_type; IntrusivePtr<TableType> table_type;
CompositeHash* table_hash; CompositeHash* table_hash;
Attributes* attrs; IntrusivePtr<Attributes> attrs;
Expr* expire_time; IntrusivePtr<Expr> expire_time;
Expr* expire_func; IntrusivePtr<Expr> expire_func;
TableValTimer* timer; TableValTimer* timer;
IterCookie* expire_cookie; IterCookie* expire_cookie;
PrefixTable* subnets; PrefixTable* subnets;
Val* def_val; IntrusivePtr<Val> def_val;
Expr* change_func = nullptr; IntrusivePtr<Expr> change_func;
// prevent recursion of change functions // prevent recursion of change functions
bool in_change_func = false; bool in_change_func = false;
}; };
@ -872,12 +860,12 @@ public:
explicit RecordVal(RecordType* t, bool init_fields = true); explicit RecordVal(RecordType* t, bool init_fields = true);
~RecordVal() override; ~RecordVal() override;
Val* SizeVal() const override IntrusivePtr<Val> SizeVal() const override;
{ return val_mgr->GetCount(Type()->AsRecordType()->NumFields()); }
void Assign(int field, IntrusivePtr<Val> new_val);
void Assign(int field, Val* new_val); void Assign(int field, Val* new_val);
Val* Lookup(int field) const; // Does not Ref() value. Val* Lookup(int field) const; // Does not Ref() value.
Val* LookupWithDefault(int field) const; // Does Ref() value. IntrusivePtr<Val> LookupWithDefault(int field) const;
/** /**
* Looks up the value of a field by field name. If the field doesn't * Looks up the value of a field by field name. If the field doesn't
@ -885,17 +873,16 @@ public:
* @param field name of field to lookup. * @param field name of field to lookup.
* @param with_default whether to rely on field's &default attribute when * @param with_default whether to rely on field's &default attribute when
* the field has yet to be initialized. * the field has yet to be initialized.
* @return the value in field \a field. It is Ref()'d only if * @return the value in field \a field.
* \a with_default is true.
*/ */
Val* Lookup(const char* field, bool with_default = false) const; IntrusivePtr<Val> Lookup(const char* field, bool with_default = false) const;
void Describe(ODesc* d) const override; void Describe(ODesc* d) const override;
/** /**
* Returns a "record_field_table" value for introspection purposes. * Returns a "record_field_table" value for introspection purposes.
*/ */
TableVal* GetRecordFieldsVal() const; IntrusivePtr<TableVal> GetRecordFieldsVal() const;
// This is an experiment to associate a BroObj within the // This is an experiment to associate a BroObj within the
// event engine to a record value in bro script. // event engine to a record value in bro script.
@ -913,8 +900,8 @@ public:
// //
// The *allow_orphaning* parameter allows for a record to be demoted // The *allow_orphaning* parameter allows for a record to be demoted
// down to a record type that contains less fields. // down to a record type that contains less fields.
RecordVal* CoerceTo(const RecordType* other, Val* aggr, bool allow_orphaning = false) const; IntrusivePtr<RecordVal> CoerceTo(const RecordType* other, Val* aggr, bool allow_orphaning = false) const;
RecordVal* CoerceTo(RecordType* other, bool allow_orphaning = false); IntrusivePtr<RecordVal> CoerceTo(RecordType* other, bool allow_orphaning = false);
unsigned int MemoryAllocation() const override; unsigned int MemoryAllocation() const override;
void DescribeReST(ODesc* d) const override; void DescribeReST(ODesc* d) const override;
@ -927,7 +914,7 @@ public:
static void ResizeParseTimeRecords(); static void ResizeParseTimeRecords();
protected: protected:
Val* DoClone(CloneState* state) override; IntrusivePtr<Val> DoClone(CloneState* state) override;
BroObj* origin; BroObj* origin;
@ -936,7 +923,7 @@ protected:
class EnumVal : public Val { class EnumVal : public Val {
public: public:
Val* SizeVal() const override { return val_mgr->GetInt(val.int_val); } IntrusivePtr<Val> SizeVal() const override;
protected: protected:
friend class Val; friend class Val;
@ -947,7 +934,7 @@ protected:
} }
void ValDescribe(ODesc* d) const override; void ValDescribe(ODesc* d) const override;
Val* DoClone(CloneState* state) override; IntrusivePtr<Val> DoClone(CloneState* state) override;
}; };
@ -956,8 +943,7 @@ public:
explicit VectorVal(VectorType* t); explicit VectorVal(VectorType* t);
~VectorVal() override; ~VectorVal() override;
Val* SizeVal() const override IntrusivePtr<Val> SizeVal() const override;
{ return val_mgr->GetCount(uint32_t(val.vector_val->size())); }
// Returns false if the type of the argument was wrong. // Returns false if the type of the argument was wrong.
// The vector will automatically grow to accomodate the index. // The vector will automatically grow to accomodate the index.
@ -965,11 +951,14 @@ public:
// Note: does NOT Ref() the element! Remember to do so unless // Note: does NOT Ref() the element! Remember to do so unless
// the element was just created and thus has refcount 1. // the element was just created and thus has refcount 1.
// //
bool Assign(unsigned int index, IntrusivePtr<Val> element);
bool Assign(unsigned int index, Val* element); bool Assign(unsigned int index, Val* element);
bool Assign(Val* index, Val* element)
template<typename E>
bool Assign(Val* index, E&& element)
{ {
return Assign(index->AsListVal()->Index(0)->CoerceToUnsigned(), return Assign(index->AsListVal()->Index(0)->CoerceToUnsigned(),
element); std::forward<E>(element));
} }
// Assigns the value to how_many locations starting at index. // Assigns the value to how_many locations starting at index.
@ -1009,7 +998,7 @@ public:
protected: protected:
void ValDescribe(ODesc* d) const override; void ValDescribe(ODesc* d) const override;
Val* DoClone(CloneState* state) override; IntrusivePtr<Val> DoClone(CloneState* state) override;
VectorType* vector_type; VectorType* vector_type;
}; };

View file

@ -64,7 +64,7 @@ static void make_var(ID* id, IntrusivePtr<BroType> t, init_class c,
if ( id->Type() && id->Type()->Tag() != TYPE_ERROR ) if ( id->Type() && id->Type()->Tag() != TYPE_ERROR )
{ {
if ( dt != VAR_REDEF && if ( dt != VAR_REDEF &&
(! init || ! do_init || (! t && ! (t = {AdoptRef{}, init_type(init.get())}))) ) (! init || ! do_init || (! t && ! (t = init_type(init.get())))) )
{ {
id->Error("already defined", init.get()); id->Error("already defined", init.get());
return; return;
@ -103,10 +103,10 @@ static void make_var(ID* id, IntrusivePtr<BroType> t, init_class c,
return; return;
} }
t = {AdoptRef{}, init_type(init.get())}; t = init_type(init.get());
if ( ! t ) if ( ! t )
{ {
id->SetType({AdoptRef{}, error_type()}); id->SetType(error_type());
return; return;
} }
} }
@ -114,7 +114,7 @@ static void make_var(ID* id, IntrusivePtr<BroType> t, init_class c,
id->SetType(t); id->SetType(t);
if ( attr ) if ( attr )
id->AddAttrs(make_intrusive<Attributes>(attr, t.get(), false, id->IsGlobal())); id->AddAttrs(make_intrusive<Attributes>(attr, t, false, id->IsGlobal()));
if ( init ) if ( init )
{ {
@ -168,7 +168,8 @@ static void make_var(ID* id, IntrusivePtr<BroType> t, init_class c,
} }
else if ( t->Tag() == TYPE_TABLE ) else if ( t->Tag() == TYPE_TABLE )
aggr = make_intrusive<TableVal>(t->AsTableType(), id->Attrs()); aggr = make_intrusive<TableVal>(IntrusivePtr{NewRef{}, t->AsTableType()},
IntrusivePtr{NewRef{}, id->Attrs()});
else if ( t->Tag() == TYPE_VECTOR ) else if ( t->Tag() == TYPE_VECTOR )
aggr = make_intrusive<VectorVal>(t->AsVectorType()); aggr = make_intrusive<VectorVal>(t->AsVectorType());
@ -254,7 +255,7 @@ IntrusivePtr<Stmt> add_local(IntrusivePtr<ID> id, IntrusivePtr<BroType> t,
else else
{ {
current_scope()->AddInit(id.release()); current_scope()->AddInit(std::move(id));
return make_intrusive<NullStmt>(); return make_intrusive<NullStmt>();
} }
} }
@ -294,7 +295,7 @@ void add_type(ID* id, IntrusivePtr<BroType> t, attr_list* attr)
id->MakeType(); id->MakeType();
if ( attr ) if ( attr )
id->SetAttrs(make_intrusive<Attributes>(attr, tnew.get(), false, false)); id->SetAttrs(make_intrusive<Attributes>(attr, tnew, false, false));
} }
static void transfer_arg_defaults(RecordType* args, RecordType* recv) static void transfer_arg_defaults(RecordType* args, RecordType* recv)
@ -312,11 +313,11 @@ static void transfer_arg_defaults(RecordType* args, RecordType* recv)
if ( ! recv_i->attrs ) if ( ! recv_i->attrs )
{ {
attr_list* a = new attr_list{def}; attr_list* a = new attr_list{def};
recv_i->attrs = new Attributes(a, recv_i->type, true, false); recv_i->attrs = make_intrusive<Attributes>(a, recv_i->type, true, false);
} }
else if ( ! recv_i->attrs->FindAttr(ATTR_DEFAULT) ) else if ( ! recv_i->attrs->FindAttr(ATTR_DEFAULT) )
recv_i->attrs->AddAttr(def); recv_i->attrs->AddAttr({NewRef{}, def});
} }
} }
@ -394,7 +395,7 @@ void begin_func(ID* id, const char* module_name, function_flavor flavor,
else else
id->SetType(t); id->SetType(t);
push_scope(id, attrs); push_scope({NewRef{}, id}, attrs);
RecordType* args = t->Args(); RecordType* args = t->Args();
int num_args = args->NumFields(); int num_args = args->NumFields();
@ -408,11 +409,11 @@ void begin_func(ID* id, const char* module_name, function_flavor flavor,
arg_id->Error("argument name used twice"); arg_id->Error("argument name used twice");
arg_id = install_ID(arg_i->id, module_name, false, false); arg_id = install_ID(arg_i->id, module_name, false, false);
arg_id->SetType({NewRef{}, arg_i->type}); arg_id->SetType(arg_i->type);
} }
if ( Attr* depr_attr = find_attr(attrs, ATTR_DEPRECATED) ) if ( Attr* depr_attr = find_attr(attrs, ATTR_DEPRECATED) )
id->MakeDeprecated(depr_attr->AttrExpr()); id->MakeDeprecated({NewRef{}, depr_attr->AttrExpr()});
} }
class OuterIDBindingFinder : public TraversalCallback { class OuterIDBindingFinder : public TraversalCallback {
@ -473,12 +474,11 @@ TraversalCode OuterIDBindingFinder::PostExpr(const Expr* expr)
void end_func(IntrusivePtr<Stmt> body) void end_func(IntrusivePtr<Stmt> body)
{ {
auto ingredients = std::make_unique<function_ingredients>( auto ingredients = std::make_unique<function_ingredients>(pop_scope(), std::move(body));
pop_scope().release(), body.release());
if ( streq(ingredients->id->Name(), "anonymous-function") ) if ( streq(ingredients->id->Name(), "anonymous-function") )
{ {
OuterIDBindingFinder cb(ingredients->scope); OuterIDBindingFinder cb(ingredients->scope.get());
ingredients->body->Traverse(&cb); ingredients->body->Traverse(&cb);
for ( size_t i = 0; i < cb.outer_id_references.size(); ++i ) for ( size_t i = 0; i < cb.outer_id_references.size(); ++i )
@ -495,7 +495,7 @@ void end_func(IntrusivePtr<Stmt> body)
else else
{ {
Func* f = new BroFunc( Func* f = new BroFunc(
ingredients->id, ingredients->id.get(),
ingredients->body, ingredients->body,
ingredients->inits, ingredients->inits,
ingredients->frame_size, ingredients->frame_size,

View file

@ -4,6 +4,7 @@
#include "Hash.h" #include "Hash.h"
#include "Val.h" #include "Val.h"
#include "IntrusivePtr.h"
#include "protocol/conn-size/ConnSize.h" #include "protocol/conn-size/ConnSize.h"
#include "protocol/icmp/ICMP.h" #include "protocol/icmp/ICMP.h"
@ -440,13 +441,12 @@ bool Manager::BuildInitialAnalyzerTree(Connection* conn)
if ( tcp_contents && ! reass ) if ( tcp_contents && ! reass )
{ {
auto dport = val_mgr->GetPort(ntohs(conn->RespPort()), TRANSPORT_TCP); auto dport = val_mgr->GetPort(ntohs(conn->RespPort()), TRANSPORT_TCP);
Val* result;
if ( ! reass ) if ( ! reass )
reass = tcp_content_delivery_ports_orig->Lookup(dport); reass = (bool)tcp_content_delivery_ports_orig->Lookup(dport);
if ( ! reass ) if ( ! reass )
reass = tcp_content_delivery_ports_resp->Lookup(dport); reass = (bool)tcp_content_delivery_ports_resp->Lookup(dport);
Unref(dport); Unref(dport);
} }

View file

@ -45,7 +45,7 @@ BitTorrentTracker_Analyzer::BitTorrentTracker_Analyzer(Connection* c)
req_buf_pos = req_buf; req_buf_pos = req_buf;
req_buf_len = 0; req_buf_len = 0;
req_val_uri = 0; req_val_uri = 0;
req_val_headers = new TableVal(bt_tracker_headers); req_val_headers = new TableVal({NewRef{}, bt_tracker_headers});
res_state = BTT_RES_STATUS; res_state = BTT_RES_STATUS;
res_allow_blank_line = false; res_allow_blank_line = false;
@ -53,9 +53,9 @@ BitTorrentTracker_Analyzer::BitTorrentTracker_Analyzer(Connection* c)
res_buf_pos = res_buf; res_buf_pos = res_buf;
res_buf_len = 0; res_buf_len = 0;
res_status = 0; res_status = 0;
res_val_headers = new TableVal(bt_tracker_headers); res_val_headers = new TableVal({NewRef{}, bt_tracker_headers});
res_val_peers = new TableVal(bittorrent_peer_set); res_val_peers = new TableVal({NewRef{}, bittorrent_peer_set});
res_val_benc = new TableVal(bittorrent_benc_dir); res_val_benc = new TableVal({NewRef{}, bittorrent_benc_dir});
InitBencParser(); InitBencParser();
@ -137,7 +137,7 @@ void BitTorrentTracker_Analyzer::ClientRequest(int len, const u_char* data)
memmove(req_buf, req_buf_pos, req_buf_len); memmove(req_buf, req_buf_pos, req_buf_len);
req_buf_pos = req_buf; req_buf_pos = req_buf;
req_val_headers = req_val_headers =
new TableVal(bt_tracker_headers); new TableVal({NewRef{}, bt_tracker_headers});
} }
} }
} }
@ -199,9 +199,9 @@ void BitTorrentTracker_Analyzer::ServerReply(int len, const u_char* data)
res_buf_pos = res_buf; res_buf_pos = res_buf;
res_status = 0; res_status = 0;
res_val_headers = new TableVal(bt_tracker_headers); res_val_headers = new TableVal({NewRef{}, bt_tracker_headers});
res_val_peers = new TableVal(bittorrent_peer_set); res_val_peers = new TableVal({NewRef{}, bittorrent_peer_set});
res_val_benc = new TableVal(bittorrent_benc_dir); res_val_benc = new TableVal({NewRef{}, bittorrent_benc_dir});
InitBencParser(); InitBencParser();
} }
@ -481,7 +481,7 @@ void BitTorrentTracker_Analyzer::ResponseBenc(int name_len, char* name,
uint16_t pt = ntohs((value[4] << 8) | value[5]); uint16_t pt = ntohs((value[4] << 8) | value[5]);
RecordVal* peer = new RecordVal(bittorrent_peer); RecordVal* peer = new RecordVal(bittorrent_peer);
peer->Assign(0, new AddrVal(ad)); peer->Assign(0, make_intrusive<AddrVal>(ad));
peer->Assign(1, val_mgr->GetPort(pt, TRANSPORT_TCP)); peer->Assign(1, val_mgr->GetPort(pt, TRANSPORT_TCP));
res_val_peers->Assign(peer, 0); res_val_peers->Assign(peer, 0);
@ -491,9 +491,9 @@ void BitTorrentTracker_Analyzer::ResponseBenc(int name_len, char* name,
else else
{ {
StringVal* name_ = new StringVal(name_len, name); StringVal* name_ = new StringVal(name_len, name);
RecordVal* benc_value = new RecordVal(bittorrent_benc_value); auto benc_value = make_intrusive<RecordVal>(bittorrent_benc_value);
benc_value->Assign(type, new StringVal(value_len, value)); benc_value->Assign(type, make_intrusive<StringVal>(value_len, value));
res_val_benc->Assign(name_, benc_value); res_val_benc->Assign(name_, std::move(benc_value));
Unref(name_); Unref(name_);
} }

View file

@ -42,7 +42,7 @@ refine connection DCE_RPC_Conn += {
${header.is_orig}, ${header.is_orig},
fid, fid,
${header.PTYPE}, ${header.PTYPE},
BifType::Enum::DCE_RPC::PType->GetVal(${header.PTYPE})); BifType::Enum::DCE_RPC::PType->GetVal(${header.PTYPE}).release());
} }
return true; return true;
%} %}

View file

@ -61,13 +61,13 @@ refine flow DHCP_Flow += {
dhcp_msg_val->Assign(0, val_mgr->GetCount(${msg.op})); dhcp_msg_val->Assign(0, val_mgr->GetCount(${msg.op}));
dhcp_msg_val->Assign(1, val_mgr->GetCount(${msg.type})); dhcp_msg_val->Assign(1, val_mgr->GetCount(${msg.type}));
dhcp_msg_val->Assign(2, val_mgr->GetCount(${msg.xid})); dhcp_msg_val->Assign(2, val_mgr->GetCount(${msg.xid}));
dhcp_msg_val->Assign(3, new Val(secs, TYPE_INTERVAL)); dhcp_msg_val->Assign(3, make_intrusive<Val>(secs, TYPE_INTERVAL));
dhcp_msg_val->Assign(4, val_mgr->GetCount(${msg.flags})); dhcp_msg_val->Assign(4, val_mgr->GetCount(${msg.flags}));
dhcp_msg_val->Assign(5, new AddrVal(htonl(${msg.ciaddr}))); dhcp_msg_val->Assign(5, make_intrusive<AddrVal>(htonl(${msg.ciaddr})));
dhcp_msg_val->Assign(6, new AddrVal(htonl(${msg.yiaddr}))); dhcp_msg_val->Assign(6, make_intrusive<AddrVal>(htonl(${msg.yiaddr})));
dhcp_msg_val->Assign(7, new AddrVal(htonl(${msg.siaddr}))); dhcp_msg_val->Assign(7, make_intrusive<AddrVal>(htonl(${msg.siaddr})));
dhcp_msg_val->Assign(8, new AddrVal(htonl(${msg.giaddr}))); dhcp_msg_val->Assign(8, make_intrusive<AddrVal>(htonl(${msg.giaddr})));
dhcp_msg_val->Assign(9, new StringVal(mac_str)); dhcp_msg_val->Assign(9, make_intrusive<StringVal>(mac_str));
int last_non_null = 0; int last_non_null = 0;
@ -78,7 +78,7 @@ refine flow DHCP_Flow += {
} }
if ( last_non_null > 0 ) if ( last_non_null > 0 )
dhcp_msg_val->Assign(10, new StringVal(last_non_null + 1, dhcp_msg_val->Assign(10, make_intrusive<StringVal>(last_non_null + 1,
reinterpret_cast<const char*>(${msg.sname}.begin()))); reinterpret_cast<const char*>(${msg.sname}.begin())));
last_non_null = 0; last_non_null = 0;
@ -90,7 +90,7 @@ refine flow DHCP_Flow += {
} }
if ( last_non_null > 0 ) if ( last_non_null > 0 )
dhcp_msg_val->Assign(11, new StringVal(last_non_null + 1, dhcp_msg_val->Assign(11, make_intrusive<StringVal>(last_non_null + 1,
reinterpret_cast<const char*>(${msg.file_n}.begin()))); reinterpret_cast<const char*>(${msg.file_n}.begin())));
init_options(); init_options();

View file

@ -11,7 +11,7 @@ refine casetype OptionValue += {
refine flow DHCP_Flow += { refine flow DHCP_Flow += {
function process_subnet_option(v: OptionValue): bool function process_subnet_option(v: OptionValue): bool
%{ %{
${context.flow}->options->Assign(1, new AddrVal(htonl(${v.subnet}))); ${context.flow}->options->Assign(1, make_intrusive<AddrVal>(htonl(${v.subnet})));
return true; return true;
%} %}
}; };
@ -64,7 +64,7 @@ refine flow DHCP_Flow += {
for ( int i = 0; i < num_routers; ++i ) for ( int i = 0; i < num_routers; ++i )
{ {
uint32 raddr = (*rlist)[i]; uint32 raddr = (*rlist)[i];
router_list->Assign(i, new AddrVal(htonl(raddr))); router_list->Assign(i, make_intrusive<AddrVal>(htonl(raddr)));
} }
${context.flow}->options->Assign(2, router_list); ${context.flow}->options->Assign(2, router_list);
@ -98,7 +98,7 @@ refine flow DHCP_Flow += {
for ( int i = 0; i < num_servers; ++i ) for ( int i = 0; i < num_servers; ++i )
{ {
uint32 raddr = (*rlist)[i]; uint32 raddr = (*rlist)[i];
timeserver_list->Assign(i, new AddrVal(htonl(raddr))); timeserver_list->Assign(i, make_intrusive<AddrVal>(htonl(raddr)));
} }
${context.flow}->options->Assign(26, timeserver_list); ${context.flow}->options->Assign(26, timeserver_list);
@ -132,7 +132,7 @@ refine flow DHCP_Flow += {
for ( int i = 0; i < num_servers; ++i ) for ( int i = 0; i < num_servers; ++i )
{ {
uint32 raddr = (*rlist)[i]; uint32 raddr = (*rlist)[i];
nameserver_list->Assign(i, new AddrVal(htonl(raddr))); nameserver_list->Assign(i, make_intrusive<AddrVal>(htonl(raddr)));
} }
${context.flow}->options->Assign(27, nameserver_list); ${context.flow}->options->Assign(27, nameserver_list);
@ -166,7 +166,7 @@ refine flow DHCP_Flow += {
for ( int i = 0; i < num_servers; ++i ) for ( int i = 0; i < num_servers; ++i )
{ {
uint32 raddr = (*rlist)[i]; uint32 raddr = (*rlist)[i];
server_list->Assign(i, new AddrVal(htonl(raddr))); server_list->Assign(i, make_intrusive<AddrVal>(htonl(raddr)));
} }
${context.flow}->options->Assign(3, server_list); ${context.flow}->options->Assign(3, server_list);
@ -192,7 +192,7 @@ refine casetype OptionValue += {
refine flow DHCP_Flow += { refine flow DHCP_Flow += {
function process_host_name_option(v: OptionValue): bool function process_host_name_option(v: OptionValue): bool
%{ %{
${context.flow}->options->Assign(4, new StringVal(${v.host_name}.length(), ${context.flow}->options->Assign(4, make_intrusive<StringVal>(${v.host_name}.length(),
reinterpret_cast<const char*>(${v.host_name}.begin()))); reinterpret_cast<const char*>(${v.host_name}.begin())));
return true; return true;
@ -225,7 +225,7 @@ refine flow DHCP_Flow += {
last_non_null = i; last_non_null = i;
} }
${context.flow}->options->Assign(5, new StringVal(last_non_null == 0 ? 0 : last_non_null + 1, ${context.flow}->options->Assign(5, make_intrusive<StringVal>(last_non_null == 0 ? 0 : last_non_null + 1,
reinterpret_cast<const char*>(${v.domain_name}.begin()))); reinterpret_cast<const char*>(${v.domain_name}.begin())));
return true; return true;
@ -274,7 +274,7 @@ refine casetype OptionValue += {
refine flow DHCP_Flow += { refine flow DHCP_Flow += {
function process_broadcast_address_option(v: OptionValue): bool function process_broadcast_address_option(v: OptionValue): bool
%{ %{
${context.flow}->options->Assign(7, new AddrVal(htonl(${v.broadcast_address}))); ${context.flow}->options->Assign(7, make_intrusive<AddrVal>(htonl(${v.broadcast_address})));
return true; return true;
%} %}
@ -305,7 +305,7 @@ refine flow DHCP_Flow += {
for ( int i = 0; i < num_servers; ++i ) for ( int i = 0; i < num_servers; ++i )
{ {
uint32 raddr = (*rlist)[i]; uint32 raddr = (*rlist)[i];
ntpserver_list->Assign(i, new AddrVal(htonl(raddr))); ntpserver_list->Assign(i, make_intrusive<AddrVal>(htonl(raddr)));
} }
${context.flow}->options->Assign(28, ntpserver_list); ${context.flow}->options->Assign(28, ntpserver_list);
@ -331,7 +331,7 @@ refine casetype OptionValue += {
refine flow DHCP_Flow += { refine flow DHCP_Flow += {
function process_vendor_specific_option(v: OptionValue): bool function process_vendor_specific_option(v: OptionValue): bool
%{ %{
${context.flow}->options->Assign(8, new StringVal(${v.vendor_specific}.length(), ${context.flow}->options->Assign(8, make_intrusive<StringVal>(${v.vendor_specific}.length(),
reinterpret_cast<const char*>(${v.vendor_specific}.begin()))); reinterpret_cast<const char*>(${v.vendor_specific}.begin())));
return true; return true;
@ -363,7 +363,7 @@ refine flow DHCP_Flow += {
for ( int i = 0; i < num_servers; ++i ) for ( int i = 0; i < num_servers; ++i )
{ {
uint32 raddr = (*rlist)[i]; uint32 raddr = (*rlist)[i];
server_list->Assign(i, new AddrVal(htonl(raddr))); server_list->Assign(i, make_intrusive<AddrVal>(htonl(raddr)));
} }
${context.flow}->options->Assign(9, server_list); ${context.flow}->options->Assign(9, server_list);
@ -389,7 +389,7 @@ refine casetype OptionValue += {
refine flow DHCP_Flow += { refine flow DHCP_Flow += {
function process_addr_request_option(v: OptionValue): bool function process_addr_request_option(v: OptionValue): bool
%{ %{
${context.flow}->options->Assign(10, new AddrVal(htonl(${v.addr_request}))); ${context.flow}->options->Assign(10, make_intrusive<AddrVal>(htonl(${v.addr_request})));
return true; return true;
%} %}
@ -414,7 +414,7 @@ refine flow DHCP_Flow += {
function process_lease_option(v: OptionValue): bool function process_lease_option(v: OptionValue): bool
%{ %{
double lease = static_cast<double>(${v.lease}); double lease = static_cast<double>(${v.lease});
${context.flow}->options->Assign(11, new Val(lease, TYPE_INTERVAL)); ${context.flow}->options->Assign(11, make_intrusive<Val>(lease, TYPE_INTERVAL));
return true; return true;
%} %}
@ -438,7 +438,7 @@ refine casetype OptionValue += {
refine flow DHCP_Flow += { refine flow DHCP_Flow += {
function process_serv_id_option(v: OptionValue): bool function process_serv_id_option(v: OptionValue): bool
%{ %{
${context.flow}->options->Assign(12, new AddrVal(htonl(${v.serv_addr}))); ${context.flow}->options->Assign(12, make_intrusive<AddrVal>(htonl(${v.serv_addr})));
return true; return true;
%} %}
@ -496,7 +496,7 @@ refine casetype OptionValue += {
refine flow DHCP_Flow += { refine flow DHCP_Flow += {
function process_message_option(v: OptionValue): bool function process_message_option(v: OptionValue): bool
%{ %{
${context.flow}->options->Assign(14, new StringVal(${v.message}.length(), ${context.flow}->options->Assign(14, make_intrusive<StringVal>(${v.message}.length(),
reinterpret_cast<const char*>(${v.message}.begin()))); reinterpret_cast<const char*>(${v.message}.begin())));
return true; return true;
@ -546,7 +546,7 @@ refine flow DHCP_Flow += {
function process_renewal_time_option(v: OptionValue): bool function process_renewal_time_option(v: OptionValue): bool
%{ %{
double renewal_time = static_cast<double>(${v.renewal_time}); double renewal_time = static_cast<double>(${v.renewal_time});
${context.flow}->options->Assign(16, new Val(renewal_time, TYPE_INTERVAL)); ${context.flow}->options->Assign(16, make_intrusive<Val>(renewal_time, TYPE_INTERVAL));
return true; return true;
%} %}
@ -571,7 +571,7 @@ refine flow DHCP_Flow += {
function process_rebinding_time_option(v: OptionValue): bool function process_rebinding_time_option(v: OptionValue): bool
%{ %{
double rebinding_time = static_cast<double>(${v.rebinding_time}); double rebinding_time = static_cast<double>(${v.rebinding_time});
${context.flow}->options->Assign(17, new Val(rebinding_time, TYPE_INTERVAL)); ${context.flow}->options->Assign(17, make_intrusive<Val>(rebinding_time, TYPE_INTERVAL));
return true; return true;
%} %}
@ -595,7 +595,7 @@ refine casetype OptionValue += {
refine flow DHCP_Flow += { refine flow DHCP_Flow += {
function process_vendor_class_option(v: OptionValue): bool function process_vendor_class_option(v: OptionValue): bool
%{ %{
${context.flow}->options->Assign(18, new StringVal(${v.vendor_class}.length(), ${context.flow}->options->Assign(18, make_intrusive<StringVal>(${v.vendor_class}.length(),
reinterpret_cast<const char*>(${v.vendor_class}.begin()))); reinterpret_cast<const char*>(${v.vendor_class}.begin())));
return true; return true;
@ -627,7 +627,7 @@ refine flow DHCP_Flow += {
%{ %{
RecordVal* client_id = new RecordVal(BifType::Record::DHCP::ClientID); RecordVal* client_id = new RecordVal(BifType::Record::DHCP::ClientID);
client_id->Assign(0, val_mgr->GetCount(${v.client_id.hwtype})); client_id->Assign(0, val_mgr->GetCount(${v.client_id.hwtype}));
client_id->Assign(1, new StringVal(fmt_mac(${v.client_id.hwaddr}.begin(), ${v.client_id.hwaddr}.length()))); client_id->Assign(1, make_intrusive<StringVal>(fmt_mac(${v.client_id.hwaddr}.begin(), ${v.client_id.hwaddr}.length())));
${context.flow}->options->Assign(19, client_id); ${context.flow}->options->Assign(19, client_id);
@ -653,7 +653,7 @@ refine casetype OptionValue += {
refine flow DHCP_Flow += { refine flow DHCP_Flow += {
function process_user_class_option(v: OptionValue): bool function process_user_class_option(v: OptionValue): bool
%{ %{
${context.flow}->options->Assign(20, new StringVal(${v.user_class}.length(), ${context.flow}->options->Assign(20, make_intrusive<StringVal>(${v.user_class}.length(),
reinterpret_cast<const char*>(${v.user_class}.begin()))); reinterpret_cast<const char*>(${v.user_class}.begin())));
return true; return true;
@ -690,7 +690,7 @@ refine flow DHCP_Flow += {
client_fqdn->Assign(1, val_mgr->GetCount(${v.client_fqdn.rcode1})); client_fqdn->Assign(1, val_mgr->GetCount(${v.client_fqdn.rcode1}));
client_fqdn->Assign(2, val_mgr->GetCount(${v.client_fqdn.rcode2})); client_fqdn->Assign(2, val_mgr->GetCount(${v.client_fqdn.rcode2}));
const char* domain_name = reinterpret_cast<const char*>(${v.client_fqdn.domain_name}.begin()); const char* domain_name = reinterpret_cast<const char*>(${v.client_fqdn.domain_name}.begin());
client_fqdn->Assign(3, new StringVal(${v.client_fqdn.domain_name}.length(), domain_name)); client_fqdn->Assign(3, make_intrusive<StringVal>(${v.client_fqdn.domain_name}.length(), domain_name));
${context.flow}->options->Assign(21, client_fqdn); ${context.flow}->options->Assign(21, client_fqdn);
@ -809,7 +809,7 @@ refine flow DHCP_Flow += {
if ( string_len == 0 ) if ( string_len == 0 )
{ {
${context.flow}->options->Assign(24, new StringVal(0, "")); ${context.flow}->options->Assign(24, make_intrusive<StringVal>(0, ""));
return true; return true;
} }
@ -821,7 +821,7 @@ refine flow DHCP_Flow += {
if ( has_newline ) if ( has_newline )
--string_len; --string_len;
${context.flow}->options->Assign(24, new StringVal(string_len, ${context.flow}->options->Assign(24, make_intrusive<StringVal>(string_len,
reinterpret_cast<const char*>(${v.auto_proxy_config}.begin()))); reinterpret_cast<const char*>(${v.auto_proxy_config}.begin())));
return true; return true;

View file

@ -603,13 +603,13 @@ int DNS_Interpreter::ParseRR_SOA(DNS_MsgInfo* msg,
if ( dns_SOA_reply && ! msg->skip_event ) if ( dns_SOA_reply && ! msg->skip_event )
{ {
RecordVal* r = new RecordVal(dns_soa); RecordVal* r = new RecordVal(dns_soa);
r->Assign(0, new StringVal(new BroString(mname, mname_end - mname, 1))); r->Assign(0, make_intrusive<StringVal>(new BroString(mname, mname_end - mname, 1)));
r->Assign(1, new StringVal(new BroString(rname, rname_end - rname, 1))); r->Assign(1, make_intrusive<StringVal>(new BroString(rname, rname_end - rname, 1)));
r->Assign(2, val_mgr->GetCount(serial)); r->Assign(2, val_mgr->GetCount(serial));
r->Assign(3, new IntervalVal(double(refresh), Seconds)); r->Assign(3, make_intrusive<IntervalVal>(double(refresh), Seconds));
r->Assign(4, new IntervalVal(double(retry), Seconds)); r->Assign(4, make_intrusive<IntervalVal>(double(retry), Seconds));
r->Assign(5, new IntervalVal(double(expire), Seconds)); r->Assign(5, make_intrusive<IntervalVal>(double(expire), Seconds));
r->Assign(6, new IntervalVal(double(minimum), Seconds)); r->Assign(6, make_intrusive<IntervalVal>(double(minimum), Seconds));
analyzer->ConnectionEventFast(dns_SOA_reply, { analyzer->ConnectionEventFast(dns_SOA_reply, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
@ -1029,7 +1029,7 @@ int DNS_Interpreter::ParseRR_NSEC(DNS_MsgInfo* msg,
} }
BroString* bitmap = ExtractStream(data, len, bmlen); BroString* bitmap = ExtractStream(data, len, bmlen);
char_strings->Assign(char_strings->Size(), new StringVal(bitmap)); char_strings->Assign(char_strings->Size(), make_intrusive<StringVal>(bitmap));
typebitmaps_len = typebitmaps_len - (2 + bmlen); typebitmaps_len = typebitmaps_len - (2 + bmlen);
} }
@ -1106,7 +1106,7 @@ int DNS_Interpreter::ParseRR_NSEC3(DNS_MsgInfo* msg,
} }
BroString* bitmap = ExtractStream(data, len, bmlen); BroString* bitmap = ExtractStream(data, len, bmlen);
char_strings->Assign(char_strings->Size(), new StringVal(bitmap)); char_strings->Assign(char_strings->Size(), make_intrusive<StringVal>(bitmap));
typebitmaps_len = typebitmaps_len - (2 + bmlen); typebitmaps_len = typebitmaps_len - (2 + bmlen);
} }
@ -1496,7 +1496,7 @@ Val* DNS_MsgInfo::BuildAnswerVal()
r->Assign(1, query_name); r->Assign(1, query_name);
r->Assign(2, val_mgr->GetCount(atype)); r->Assign(2, val_mgr->GetCount(atype));
r->Assign(3, val_mgr->GetCount(aclass)); r->Assign(3, val_mgr->GetCount(aclass));
r->Assign(4, new IntervalVal(double(ttl), Seconds)); r->Assign(4, make_intrusive<IntervalVal>(double(ttl), Seconds));
return r; return r;
} }
@ -1531,7 +1531,7 @@ Val* DNS_MsgInfo::BuildEDNS_Val()
r->Assign(4, val_mgr->GetCount(return_error)); r->Assign(4, val_mgr->GetCount(return_error));
r->Assign(5, val_mgr->GetCount(version)); r->Assign(5, val_mgr->GetCount(version));
r->Assign(6, val_mgr->GetCount(z)); r->Assign(6, val_mgr->GetCount(z));
r->Assign(7, new IntervalVal(double(ttl), Seconds)); r->Assign(7, make_intrusive<IntervalVal>(double(ttl), Seconds));
r->Assign(8, val_mgr->GetCount(is_query)); r->Assign(8, val_mgr->GetCount(is_query));
return r; return r;
@ -1546,10 +1546,10 @@ Val* DNS_MsgInfo::BuildTSIG_Val(struct TSIG_DATA* tsig)
// r->Assign(0, val_mgr->GetCount(int(answer_type))); // r->Assign(0, val_mgr->GetCount(int(answer_type)));
r->Assign(0, query_name); r->Assign(0, query_name);
r->Assign(1, val_mgr->GetCount(int(answer_type))); r->Assign(1, val_mgr->GetCount(int(answer_type)));
r->Assign(2, new StringVal(tsig->alg_name)); r->Assign(2, make_intrusive<StringVal>(tsig->alg_name));
r->Assign(3, new StringVal(tsig->sig)); r->Assign(3, make_intrusive<StringVal>(tsig->sig));
r->Assign(4, new Val(rtime, TYPE_TIME)); r->Assign(4, make_intrusive<Val>(rtime, TYPE_TIME));
r->Assign(5, new Val(double(tsig->fudge), TYPE_TIME)); r->Assign(5, make_intrusive<Val>(double(tsig->fudge), TYPE_TIME));
r->Assign(6, val_mgr->GetCount(tsig->orig_id)); r->Assign(6, val_mgr->GetCount(tsig->orig_id));
r->Assign(7, val_mgr->GetCount(tsig->rr_error)); r->Assign(7, val_mgr->GetCount(tsig->rr_error));
r->Assign(8, val_mgr->GetCount(is_query)); r->Assign(8, val_mgr->GetCount(is_query));
@ -1567,12 +1567,12 @@ Val* DNS_MsgInfo::BuildRRSIG_Val(RRSIG_DATA* rrsig)
r->Assign(2, val_mgr->GetCount(rrsig->type_covered)); r->Assign(2, val_mgr->GetCount(rrsig->type_covered));
r->Assign(3, val_mgr->GetCount(rrsig->algorithm)); r->Assign(3, val_mgr->GetCount(rrsig->algorithm));
r->Assign(4, val_mgr->GetCount(rrsig->labels)); r->Assign(4, val_mgr->GetCount(rrsig->labels));
r->Assign(5, new IntervalVal(double(rrsig->orig_ttl), Seconds)); r->Assign(5, make_intrusive<IntervalVal>(double(rrsig->orig_ttl), Seconds));
r->Assign(6, new Val(double(rrsig->sig_exp), TYPE_TIME)); r->Assign(6, make_intrusive<Val>(double(rrsig->sig_exp), TYPE_TIME));
r->Assign(7, new Val(double(rrsig->sig_incep), TYPE_TIME)); r->Assign(7, make_intrusive<Val>(double(rrsig->sig_incep), TYPE_TIME));
r->Assign(8, val_mgr->GetCount(rrsig->key_tag)); r->Assign(8, val_mgr->GetCount(rrsig->key_tag));
r->Assign(9, new StringVal(rrsig->signer_name)); r->Assign(9, make_intrusive<StringVal>(rrsig->signer_name));
r->Assign(10, new StringVal(rrsig->signature)); r->Assign(10, make_intrusive<StringVal>(rrsig->signature));
r->Assign(11, val_mgr->GetCount(is_query)); r->Assign(11, val_mgr->GetCount(is_query));
return r; return r;
@ -1588,7 +1588,7 @@ Val* DNS_MsgInfo::BuildDNSKEY_Val(DNSKEY_DATA* dnskey)
r->Assign(2, val_mgr->GetCount(dnskey->dflags)); r->Assign(2, val_mgr->GetCount(dnskey->dflags));
r->Assign(3, val_mgr->GetCount(dnskey->dprotocol)); r->Assign(3, val_mgr->GetCount(dnskey->dprotocol));
r->Assign(4, val_mgr->GetCount(dnskey->dalgorithm)); r->Assign(4, val_mgr->GetCount(dnskey->dalgorithm));
r->Assign(5, new StringVal(dnskey->public_key)); r->Assign(5, make_intrusive<StringVal>(dnskey->public_key));
r->Assign(6, val_mgr->GetCount(is_query)); r->Assign(6, val_mgr->GetCount(is_query));
return r; return r;
@ -1605,9 +1605,9 @@ Val* DNS_MsgInfo::BuildNSEC3_Val(NSEC3_DATA* nsec3)
r->Assign(3, val_mgr->GetCount(nsec3->nsec_hash_algo)); r->Assign(3, val_mgr->GetCount(nsec3->nsec_hash_algo));
r->Assign(4, val_mgr->GetCount(nsec3->nsec_iter)); r->Assign(4, val_mgr->GetCount(nsec3->nsec_iter));
r->Assign(5, val_mgr->GetCount(nsec3->nsec_salt_len)); r->Assign(5, val_mgr->GetCount(nsec3->nsec_salt_len));
r->Assign(6, new StringVal(nsec3->nsec_salt)); r->Assign(6, make_intrusive<StringVal>(nsec3->nsec_salt));
r->Assign(7, val_mgr->GetCount(nsec3->nsec_hlen)); r->Assign(7, val_mgr->GetCount(nsec3->nsec_hlen));
r->Assign(8, new StringVal(nsec3->nsec_hash)); r->Assign(8, make_intrusive<StringVal>(nsec3->nsec_hash));
r->Assign(9, nsec3->bitmaps); r->Assign(9, nsec3->bitmaps);
r->Assign(10, val_mgr->GetCount(is_query)); r->Assign(10, val_mgr->GetCount(is_query));
@ -1624,7 +1624,7 @@ Val* DNS_MsgInfo::BuildDS_Val(DS_DATA* ds)
r->Assign(2, val_mgr->GetCount(ds->key_tag)); r->Assign(2, val_mgr->GetCount(ds->key_tag));
r->Assign(3, val_mgr->GetCount(ds->algorithm)); r->Assign(3, val_mgr->GetCount(ds->algorithm));
r->Assign(4, val_mgr->GetCount(ds->digest_type)); r->Assign(4, val_mgr->GetCount(ds->digest_type));
r->Assign(5, new StringVal(ds->digest_val)); r->Assign(5, make_intrusive<StringVal>(ds->digest_val));
r->Assign(6, val_mgr->GetCount(is_query)); r->Assign(6, val_mgr->GetCount(is_query));
return r; return r;

View file

@ -33,13 +33,13 @@ static Val* parse_port(const char* line)
good = 0; good = 0;
} }
r->Assign(0, new AddrVal(htonl(addr))); r->Assign(0, make_intrusive<AddrVal>(htonl(addr)));
r->Assign(1, val_mgr->GetPort(port, TRANSPORT_TCP)); r->Assign(1, val_mgr->GetPort(port, TRANSPORT_TCP));
r->Assign(2, val_mgr->GetBool(good)); r->Assign(2, val_mgr->GetBool(good));
} }
else else
{ {
r->Assign(0, new AddrVal(uint32_t(0))); r->Assign(0, make_intrusive<AddrVal>(uint32_t(0)));
r->Assign(1, val_mgr->GetPort(0, TRANSPORT_TCP)); r->Assign(1, val_mgr->GetPort(0, TRANSPORT_TCP));
r->Assign(2, val_mgr->GetBool(0)); r->Assign(2, val_mgr->GetBool(0));
} }
@ -109,7 +109,7 @@ static Val* parse_eftp(const char* line)
} }
r->Assign(0, new AddrVal(addr)); r->Assign(0, make_intrusive<AddrVal>(addr));
r->Assign(1, val_mgr->GetPort(port, TRANSPORT_TCP)); r->Assign(1, val_mgr->GetPort(port, TRANSPORT_TCP));
r->Assign(2, val_mgr->GetBool(good)); r->Assign(2, val_mgr->GetBool(good));

View file

@ -97,15 +97,15 @@ Val* BuildEndUserAddr(const InformationElement* ie)
switch ( ie->end_user_addr()->pdp_type_num() ) { switch ( ie->end_user_addr()->pdp_type_num() ) {
case 0x21: case 0x21:
ev->Assign(2, new AddrVal( ev->Assign(2, make_intrusive<AddrVal>(
IPAddr(IPv4, (const uint32*) d, IPAddr::Network))); IPAddr(IPv4, (const uint32*) d, IPAddr::Network)));
break; break;
case 0x57: case 0x57:
ev->Assign(2, new AddrVal( ev->Assign(2, make_intrusive<AddrVal>(
IPAddr(IPv6, (const uint32*) d, IPAddr::Network))); IPAddr(IPv6, (const uint32*) d, IPAddr::Network)));
break; break;
default: default:
ev->Assign(3, new StringVal( ev->Assign(3, make_intrusive<StringVal>(
new BroString((const u_char*) d, len, 0))); new BroString((const u_char*) d, len, 0)));
break; break;
} }
@ -136,13 +136,13 @@ Val* BuildGSN_Addr(const InformationElement* ie)
const uint8* d = ie->gsn_addr()->value().data(); const uint8* d = ie->gsn_addr()->value().data();
if ( len == 4 ) if ( len == 4 )
ev->Assign(0, new AddrVal( ev->Assign(0, make_intrusive<AddrVal>(
IPAddr(IPv4, (const uint32*) d, IPAddr::Network))); IPAddr(IPv4, (const uint32*) d, IPAddr::Network)));
else if ( len == 16 ) else if ( len == 16 )
ev->Assign(0, new AddrVal( ev->Assign(0, make_intrusive<AddrVal>(
IPAddr(IPv6, (const uint32*) d, IPAddr::Network))); IPAddr(IPv6, (const uint32*) d, IPAddr::Network)));
else else
ev->Assign(1, new StringVal(new BroString((const u_char*) d, len, 0))); ev->Assign(1, make_intrusive<StringVal>(new BroString((const u_char*) d, len, 0)));
return ev; return ev;
} }
@ -162,7 +162,7 @@ Val* BuildQoS_Profile(const InformationElement* ie)
int len = ie->qos_profile()->data().length(); int len = ie->qos_profile()->data().length();
ev->Assign(0, val_mgr->GetCount(ie->qos_profile()->alloc_retention_priority())); ev->Assign(0, val_mgr->GetCount(ie->qos_profile()->alloc_retention_priority()));
ev->Assign(1, new StringVal(new BroString(d, len, 0))); ev->Assign(1, make_intrusive<StringVal>(new BroString(d, len, 0)));
return ev; return ev;
} }
@ -196,7 +196,7 @@ Val* BuildPrivateExt(const InformationElement* ie)
int len = ie->private_ext()->value().length(); int len = ie->private_ext()->value().length();
ev->Assign(0, val_mgr->GetCount(ie->private_ext()->id())); ev->Assign(0, val_mgr->GetCount(ie->private_ext()->id()));
ev->Assign(1, new StringVal(new BroString((const u_char*) d, len, 0))); ev->Assign(1, make_intrusive<StringVal>(new BroString((const u_char*) d, len, 0)));
return ev; return ev;
} }

View file

@ -617,9 +617,9 @@ Val* HTTP_Message::BuildMessageStat(const int interrupted, const char* msg)
{ {
RecordVal* stat = new RecordVal(http_message_stat); RecordVal* stat = new RecordVal(http_message_stat);
int field = 0; int field = 0;
stat->Assign(field++, new Val(start_time, TYPE_TIME)); stat->Assign(field++, make_intrusive<Val>(start_time, TYPE_TIME));
stat->Assign(field++, val_mgr->GetBool(interrupted)); stat->Assign(field++, val_mgr->GetBool(interrupted));
stat->Assign(field++, new StringVal(msg)); stat->Assign(field++, make_intrusive<StringVal>(msg));
stat->Assign(field++, val_mgr->GetCount(body_length)); stat->Assign(field++, val_mgr->GetCount(body_length));
stat->Assign(field++, val_mgr->GetCount(content_gap_length)); stat->Assign(field++, val_mgr->GetCount(content_gap_length));
stat->Assign(field++, val_mgr->GetCount(header_length)); stat->Assign(field++, val_mgr->GetCount(header_length));
@ -1185,8 +1185,8 @@ void HTTP_Analyzer::GenStats()
RecordVal* r = new RecordVal(http_stats_rec); RecordVal* r = new RecordVal(http_stats_rec);
r->Assign(0, val_mgr->GetCount(num_requests)); r->Assign(0, val_mgr->GetCount(num_requests));
r->Assign(1, val_mgr->GetCount(num_replies)); r->Assign(1, val_mgr->GetCount(num_replies));
r->Assign(2, new Val(request_version.ToDouble(), TYPE_DOUBLE)); r->Assign(2, make_intrusive<Val>(request_version.ToDouble(), TYPE_DOUBLE));
r->Assign(3, new Val(reply_version.ToDouble(), TYPE_DOUBLE)); r->Assign(3, make_intrusive<Val>(reply_version.ToDouble(), TYPE_DOUBLE));
// DEBUG_MSG("%.6f http_stats\n", network_time); // DEBUG_MSG("%.6f http_stats\n", network_time);
ConnectionEventFast(http_stats, {BuildConnVal(), r}); ConnectionEventFast(http_stats, {BuildConnVal(), r});

View file

@ -228,8 +228,8 @@ RecordVal* ICMP_Analyzer::BuildICMPVal(const struct icmp* icmpp, int len,
{ {
icmp_conn_val = new RecordVal(icmp_conn); icmp_conn_val = new RecordVal(icmp_conn);
icmp_conn_val->Assign(0, new AddrVal(Conn()->OrigAddr())); icmp_conn_val->Assign(0, make_intrusive<AddrVal>(Conn()->OrigAddr()));
icmp_conn_val->Assign(1, new AddrVal(Conn()->RespAddr())); icmp_conn_val->Assign(1, make_intrusive<AddrVal>(Conn()->RespAddr()));
icmp_conn_val->Assign(2, val_mgr->GetCount(icmpp->icmp_type)); icmp_conn_val->Assign(2, val_mgr->GetCount(icmpp->icmp_type));
icmp_conn_val->Assign(3, val_mgr->GetCount(icmpp->icmp_code)); icmp_conn_val->Assign(3, val_mgr->GetCount(icmpp->icmp_code));
icmp_conn_val->Assign(4, val_mgr->GetCount(len)); icmp_conn_val->Assign(4, val_mgr->GetCount(len));
@ -356,9 +356,9 @@ RecordVal* ICMP_Analyzer::ExtractICMP4Context(int len, const u_char*& data)
RecordVal* iprec = new RecordVal(icmp_context); RecordVal* iprec = new RecordVal(icmp_context);
RecordVal* id_val = new RecordVal(conn_id); RecordVal* id_val = new RecordVal(conn_id);
id_val->Assign(0, new AddrVal(src_addr)); id_val->Assign(0, make_intrusive<AddrVal>(src_addr));
id_val->Assign(1, val_mgr->GetPort(src_port, proto)); id_val->Assign(1, val_mgr->GetPort(src_port, proto));
id_val->Assign(2, new AddrVal(dst_addr)); id_val->Assign(2, make_intrusive<AddrVal>(dst_addr));
id_val->Assign(3, val_mgr->GetPort(dst_port, proto)); id_val->Assign(3, val_mgr->GetPort(dst_port, proto));
iprec->Assign(0, id_val); iprec->Assign(0, id_val);
@ -415,9 +415,9 @@ RecordVal* ICMP_Analyzer::ExtractICMP6Context(int len, const u_char*& data)
RecordVal* iprec = new RecordVal(icmp_context); RecordVal* iprec = new RecordVal(icmp_context);
RecordVal* id_val = new RecordVal(conn_id); RecordVal* id_val = new RecordVal(conn_id);
id_val->Assign(0, new AddrVal(src_addr)); id_val->Assign(0, make_intrusive<AddrVal>(src_addr));
id_val->Assign(1, val_mgr->GetPort(src_port, proto)); id_val->Assign(1, val_mgr->GetPort(src_port, proto));
id_val->Assign(2, new AddrVal(dst_addr)); id_val->Assign(2, make_intrusive<AddrVal>(dst_addr));
id_val->Assign(3, val_mgr->GetPort(dst_port, proto)); id_val->Assign(3, val_mgr->GetPort(dst_port, proto));
iprec->Assign(0, id_val); iprec->Assign(0, id_val);
@ -778,7 +778,7 @@ VectorVal* ICMP_Analyzer::BuildNDOptionsVal(int caplen, const u_char* data)
if ( caplen >= length ) if ( caplen >= length )
{ {
BroString* link_addr = new BroString(data, length, 0); BroString* link_addr = new BroString(data, length, 0);
rv->Assign(2, new StringVal(link_addr)); rv->Assign(2, make_intrusive<StringVal>(link_addr));
} }
else else
set_payload_field = true; set_payload_field = true;
@ -801,9 +801,9 @@ VectorVal* ICMP_Analyzer::BuildNDOptionsVal(int caplen, const u_char* data)
info->Assign(0, val_mgr->GetCount(prefix_len)); info->Assign(0, val_mgr->GetCount(prefix_len));
info->Assign(1, val_mgr->GetBool(L_flag)); info->Assign(1, val_mgr->GetBool(L_flag));
info->Assign(2, val_mgr->GetBool(A_flag)); info->Assign(2, val_mgr->GetBool(A_flag));
info->Assign(3, new IntervalVal((double)ntohl(valid_life), Seconds)); info->Assign(3, make_intrusive<IntervalVal>((double)ntohl(valid_life), Seconds));
info->Assign(4, new IntervalVal((double)ntohl(prefer_life), Seconds)); info->Assign(4, make_intrusive<IntervalVal>((double)ntohl(prefer_life), Seconds));
info->Assign(5, new AddrVal(IPAddr(prefix))); info->Assign(5, make_intrusive<AddrVal>(IPAddr(prefix)));
rv->Assign(3, info); rv->Assign(3, info);
} }
@ -849,7 +849,7 @@ VectorVal* ICMP_Analyzer::BuildNDOptionsVal(int caplen, const u_char* data)
{ {
BroString* payload = BroString* payload =
new BroString(data, min((int)length, caplen), 0); new BroString(data, min((int)length, caplen), 0);
rv->Assign(6, new StringVal(payload)); rv->Assign(6, make_intrusive<StringVal>(payload));
} }
data += length; data += length;

View file

@ -63,7 +63,7 @@ refine connection IMAP_Conn += {
for ( unsigned int i = 0; i< capabilities->size(); i++ ) for ( unsigned int i = 0; i< capabilities->size(); i++ )
{ {
const bytestring& capability = (*capabilities)[i]->cap(); const bytestring& capability = (*capabilities)[i]->cap();
capv->Assign(i, new StringVal(capability.length(), (const char*)capability.data())); capv->Assign(i, make_intrusive<StringVal>(capability.length(), (const char*)capability.data()));
} }
BifEvent::generate_imap_capabilities(bro_analyzer(), bro_analyzer()->Conn(), capv); BifEvent::generate_imap_capabilities(bro_analyzer(), bro_analyzer()->Conn(), capv);

View file

@ -270,7 +270,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
if ( parts.size() > 0 && parts[0][0] == ':' ) if ( parts.size() > 0 && parts[0][0] == ':' )
parts[0] = parts[0].substr(1); parts[0] = parts[0].substr(1);
TableVal* set = new TableVal(string_set); TableVal* set = new TableVal({NewRef{}, string_set});
for ( unsigned int i = 0; i < parts.size(); ++i ) for ( unsigned int i = 0; i < parts.size(); ++i )
{ {
@ -463,7 +463,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
if ( parts.size() > 0 && parts[0][0] == ':' ) if ( parts.size() > 0 && parts[0][0] == ':' )
parts[0] = parts[0].substr(1); parts[0] = parts[0].substr(1);
TableVal* set = new TableVal(string_set); TableVal* set = new TableVal({NewRef{}, string_set});
for ( unsigned int i = 0; i < parts.size(); ++i ) for ( unsigned int i = 0; i < parts.size(); ++i )
{ {
@ -841,7 +841,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
nickname = prefix.substr(0, pos); nickname = prefix.substr(0, pos);
} }
TableVal* list = new TableVal(irc_join_list); TableVal* list = new TableVal({NewRef{}, irc_join_list});
vector<string> channels = SplitWords(parts[0], ','); vector<string> channels = SplitWords(parts[0], ',');
vector<string> passwords; vector<string> passwords;
@ -853,14 +853,14 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
for ( unsigned int i = 0; i < channels.size(); ++i ) for ( unsigned int i = 0; i < channels.size(); ++i )
{ {
RecordVal* info = new RecordVal(irc_join_info); RecordVal* info = new RecordVal(irc_join_info);
info->Assign(0, new StringVal(nickname.c_str())); info->Assign(0, make_intrusive<StringVal>(nickname.c_str()));
info->Assign(1, new StringVal(channels[i].c_str())); info->Assign(1, make_intrusive<StringVal>(channels[i].c_str()));
if ( i < passwords.size() ) if ( i < passwords.size() )
info->Assign(2, new StringVal(passwords[i].c_str())); info->Assign(2, make_intrusive<StringVal>(passwords[i].c_str()));
else else
info->Assign(2, new StringVal(empty_string.c_str())); info->Assign(2, make_intrusive<StringVal>(empty_string.c_str()));
// User mode. // User mode.
info->Assign(3, new StringVal(empty_string.c_str())); info->Assign(3, make_intrusive<StringVal>(empty_string.c_str()));
list->Assign(info, 0); list->Assign(info, 0);
Unref(info); Unref(info);
} }
@ -886,7 +886,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
parts[1] = parts[1].substr(1); parts[1] = parts[1].substr(1);
vector<string> users = SplitWords(parts[1], ','); vector<string> users = SplitWords(parts[1], ',');
TableVal* list = new TableVal(irc_join_list); TableVal* list = new TableVal({NewRef{}, irc_join_list});
string empty_string = ""; string empty_string = "";
@ -916,12 +916,12 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
mode = "voice"; mode = "voice";
} }
info->Assign(0, new StringVal(nick.c_str())); info->Assign(0, make_intrusive<StringVal>(nick.c_str()));
info->Assign(1, new StringVal(channel.c_str())); info->Assign(1, make_intrusive<StringVal>(channel.c_str()));
// Password: // Password:
info->Assign(2, new StringVal(empty_string.c_str())); info->Assign(2, make_intrusive<StringVal>(empty_string.c_str()));
// User mode: // User mode:
info->Assign(3, new StringVal(mode.c_str())); info->Assign(3, make_intrusive<StringVal>(mode.c_str()));
list->Assign(info, 0); list->Assign(info, 0);
Unref(info); Unref(info);
} }
@ -957,7 +957,7 @@ void IRC_Analyzer::DeliverStream(int length, const u_char* line, bool orig)
nick = nick.substr(0, pos); nick = nick.substr(0, pos);
vector<string> channelList = SplitWords(channels, ','); vector<string> channelList = SplitWords(channels, ',');
TableVal* set = new TableVal(string_set); TableVal* set = new TableVal({NewRef{}, string_set});
for ( unsigned int i = 0; i < channelList.size(); ++i ) for ( unsigned int i = 0; i < channelList.size(); ++i )
{ {

View file

@ -61,7 +61,7 @@ RecordVal* proc_host_address(const BroAnalyzer a, const KRB_Host_Address* addr)
} }
auto bytes = reinterpret_cast<const uint32_t*>(addr_bytes.data()); auto bytes = reinterpret_cast<const uint32_t*>(addr_bytes.data());
rv->Assign(0, new AddrVal(IPAddr(IPv4, bytes, IPAddr::Network))); rv->Assign(0, make_intrusive<AddrVal>(IPAddr(IPv4, bytes, IPAddr::Network)));
return rv; return rv;
} }
case 24: case 24:
@ -73,7 +73,7 @@ RecordVal* proc_host_address(const BroAnalyzer a, const KRB_Host_Address* addr)
} }
auto bytes = reinterpret_cast<const uint32_t*>(addr_bytes.data()); auto bytes = reinterpret_cast<const uint32_t*>(addr_bytes.data());
rv->Assign(0, new AddrVal(IPAddr(IPv6, bytes, IPAddr::Network))); rv->Assign(0, make_intrusive<AddrVal>(IPAddr(IPv6, bytes, IPAddr::Network)));
return rv; return rv;
} }
case 20: case 20:

View file

@ -1299,7 +1299,7 @@ RecordVal* MIME_Message::BuildHeaderVal(MIME_Header* h)
TableVal* MIME_Message::BuildHeaderTable(MIME_HeaderList& hlist) TableVal* MIME_Message::BuildHeaderTable(MIME_HeaderList& hlist)
{ {
TableVal* t = new TableVal(mime_header_list); TableVal* t = new TableVal({NewRef{}, mime_header_list});
for ( unsigned int i = 0; i < hlist.size(); ++i ) for ( unsigned int i = 0; i < hlist.size(); ++i )
{ {

View file

@ -45,12 +45,12 @@ refine flow MQTT_Flow += {
if ( mqtt_connect ) if ( mqtt_connect )
{ {
auto m = new RecordVal(BifType::Record::MQTT::ConnectMsg); auto m = new RecordVal(BifType::Record::MQTT::ConnectMsg);
m->Assign(0, new StringVal(${msg.protocol_name.str}.length(), m->Assign(0, make_intrusive<StringVal>(${msg.protocol_name.str}.length(),
reinterpret_cast<const char*>(${msg.protocol_name.str}.begin()))); reinterpret_cast<const char*>(${msg.protocol_name.str}.begin())));
m->Assign(1, val_mgr->GetCount(${msg.protocol_version})); m->Assign(1, val_mgr->GetCount(${msg.protocol_version}));
m->Assign(2, new StringVal(${msg.client_id.str}.length(), m->Assign(2, make_intrusive<StringVal>(${msg.client_id.str}.length(),
reinterpret_cast<const char*>(${msg.client_id.str}.begin()))); reinterpret_cast<const char*>(${msg.client_id.str}.begin())));
m->Assign(3, new IntervalVal(double(${msg.keep_alive}), Seconds)); m->Assign(3, make_intrusive<IntervalVal>(double(${msg.keep_alive}), Seconds));
m->Assign(4, val_mgr->GetBool(${msg.clean_session})); m->Assign(4, val_mgr->GetBool(${msg.clean_session}));
m->Assign(5, val_mgr->GetBool(${msg.will_retain})); m->Assign(5, val_mgr->GetBool(${msg.will_retain}));
@ -58,20 +58,20 @@ refine flow MQTT_Flow += {
if ( ${msg.will_flag} ) if ( ${msg.will_flag} )
{ {
m->Assign(7, new StringVal(${msg.will.topic.str}.length(), m->Assign(7, make_intrusive<StringVal>(${msg.will.topic.str}.length(),
reinterpret_cast<const char*>(${msg.will.topic.str}.begin()))); reinterpret_cast<const char*>(${msg.will.topic.str}.begin())));
m->Assign(8, new StringVal(${msg.will.msg.str}.length(), m->Assign(8, make_intrusive<StringVal>(${msg.will.msg.str}.length(),
reinterpret_cast<const char*>(${msg.will.msg.str}.begin()))); reinterpret_cast<const char*>(${msg.will.msg.str}.begin())));
} }
if ( ${msg.username} ) if ( ${msg.username} )
{ {
m->Assign(9, new StringVal(${msg.uname.str}.length(), m->Assign(9, make_intrusive<StringVal>(${msg.uname.str}.length(),
reinterpret_cast<const char*>(${msg.uname.str}.begin()))); reinterpret_cast<const char*>(${msg.uname.str}.begin())));
} }
if ( ${msg.password} ) if ( ${msg.password} )
{ {
m->Assign(10, new StringVal(${msg.pass.str}.length(), m->Assign(10, make_intrusive<StringVal>(${msg.pass.str}.length(),
reinterpret_cast<const char*>(${msg.pass.str}.begin()))); reinterpret_cast<const char*>(${msg.pass.str}.begin())));
} }

View file

@ -87,7 +87,7 @@ refine flow MySQL_Flow += {
auto& bstring = ${msg.row.first_field.val}; auto& bstring = ${msg.row.first_field.val};
auto ptr = reinterpret_cast<const char*>(bstring.data()); auto ptr = reinterpret_cast<const char*>(bstring.data());
vv->Assign(vv->Size(), new StringVal(bstring.length(), ptr)); vv->Assign(vv->Size(), make_intrusive<StringVal>(bstring.length(), ptr));
auto& fields = *${msg.row.fields}; auto& fields = *${msg.row.fields};
@ -95,7 +95,7 @@ refine flow MySQL_Flow += {
{ {
auto& bstring = f->val(); auto& bstring = f->val();
auto ptr = reinterpret_cast<const char*>(bstring.data()); auto ptr = reinterpret_cast<const char*>(bstring.data());
vv->Assign(vv->Size(), new StringVal(bstring.length(), ptr)); vv->Assign(vv->Size(), make_intrusive<StringVal>(bstring.length(), ptr));
} }
BifEvent::generate_mysql_result_row(connection()->bro_analyzer(), BifEvent::generate_mysql_result_row(connection()->bro_analyzer(),

View file

@ -38,8 +38,8 @@ refine flow NTP_Flow += {
RecordVal* rv = new RecordVal(BifType::Record::NTP::StandardMessage); RecordVal* rv = new RecordVal(BifType::Record::NTP::StandardMessage);
rv->Assign(0, val_mgr->GetCount(${nsm.stratum})); rv->Assign(0, val_mgr->GetCount(${nsm.stratum}));
rv->Assign(1, new Val(pow(2, ${nsm.poll}), TYPE_INTERVAL)); rv->Assign(1, make_intrusive<Val>(pow(2, ${nsm.poll}), TYPE_INTERVAL));
rv->Assign(2, new Val(pow(2, ${nsm.precision}), TYPE_INTERVAL)); rv->Assign(2, make_intrusive<Val>(pow(2, ${nsm.precision}), TYPE_INTERVAL));
rv->Assign(3, proc_ntp_short(${nsm.root_delay})); rv->Assign(3, proc_ntp_short(${nsm.root_delay}));
rv->Assign(4, proc_ntp_short(${nsm.root_dispersion})); rv->Assign(4, proc_ntp_short(${nsm.root_dispersion}));
@ -55,7 +55,7 @@ refine flow NTP_Flow += {
default: default:
{ {
const uint8* d = ${nsm.reference_id}.data(); const uint8* d = ${nsm.reference_id}.data();
rv->Assign(7, new AddrVal(IPAddr(IPv4, (const uint32*) d, IPAddr::Network))); rv->Assign(7, make_intrusive<AddrVal>(IPAddr(IPv4, (const uint32*) d, IPAddr::Network)));
} }
break; break;
} }

View file

@ -14,13 +14,13 @@ refine flow RADIUS_Flow += {
if ( ${msg.attributes}->size() ) if ( ${msg.attributes}->size() )
{ {
TableVal* attributes = new TableVal(BifType::Table::RADIUS::Attributes); TableVal* attributes = new TableVal({NewRef{}, BifType::Table::RADIUS::Attributes});
for ( uint i = 0; i < ${msg.attributes}->size(); ++i ) { for ( uint i = 0; i < ${msg.attributes}->size(); ++i ) {
Val* index = val_mgr->GetCount(${msg.attributes[i].code}); Val* index = val_mgr->GetCount(${msg.attributes[i].code});
// Do we already have a vector of attributes for this type? // Do we already have a vector of attributes for this type?
Val* current = attributes->Lookup(index); auto current = attributes->Lookup(index);
Val* val = bytestring_to_val(${msg.attributes[i].value}); Val* val = bytestring_to_val(${msg.attributes[i].value});
if ( current ) if ( current )

View file

@ -139,7 +139,7 @@ int MOUNT_Interp::RPC_BuildReply(RPC_CallInfo* c, BifEnum::rpc_status rpc_status
// Otherwise DeliverRPC would complain about // Otherwise DeliverRPC would complain about
// excess_RPC. // excess_RPC.
n = 0; n = 0;
reply = BifType::Enum::MOUNT3::proc_t->GetVal(c->Proc()); reply = BifType::Enum::MOUNT3::proc_t->GetVal(c->Proc()).release();
event = mount_proc_not_implemented; event = mount_proc_not_implemented;
} }
else else
@ -201,16 +201,16 @@ val_list MOUNT_Interp::event_common_vl(RPC_CallInfo *c,
RecordVal* info = new RecordVal(BifType::Record::MOUNT3::info_t); RecordVal* info = new RecordVal(BifType::Record::MOUNT3::info_t);
info->Assign(0, BifType::Enum::rpc_status->GetVal(rpc_status)); info->Assign(0, BifType::Enum::rpc_status->GetVal(rpc_status));
info->Assign(1, BifType::Enum::MOUNT3::status_t->GetVal(mount_status)); info->Assign(1, BifType::Enum::MOUNT3::status_t->GetVal(mount_status));
info->Assign(2, new Val(c->StartTime(), TYPE_TIME)); info->Assign(2, make_intrusive<Val>(c->StartTime(), TYPE_TIME));
info->Assign(3, new Val(c->LastTime() - c->StartTime(), TYPE_INTERVAL)); info->Assign(3, make_intrusive<Val>(c->LastTime() - c->StartTime(), TYPE_INTERVAL));
info->Assign(4, val_mgr->GetCount(c->RPCLen())); info->Assign(4, val_mgr->GetCount(c->RPCLen()));
info->Assign(5, new Val(rep_start_time, TYPE_TIME)); info->Assign(5, make_intrusive<Val>(rep_start_time, TYPE_TIME));
info->Assign(6, new Val(rep_last_time - rep_start_time, TYPE_INTERVAL)); info->Assign(6, make_intrusive<Val>(rep_last_time - rep_start_time, TYPE_INTERVAL));
info->Assign(7, val_mgr->GetCount(reply_len)); info->Assign(7, val_mgr->GetCount(reply_len));
info->Assign(8, val_mgr->GetCount(c->Uid())); info->Assign(8, val_mgr->GetCount(c->Uid()));
info->Assign(9, val_mgr->GetCount(c->Gid())); info->Assign(9, val_mgr->GetCount(c->Gid()));
info->Assign(10, val_mgr->GetCount(c->Stamp())); info->Assign(10, val_mgr->GetCount(c->Stamp()));
info->Assign(11, new StringVal(c->MachineName())); info->Assign(11, make_intrusive<StringVal>(c->MachineName()));
info->Assign(12, auxgids); info->Assign(12, auxgids);
vl.push_back(info); vl.push_back(info);
@ -220,7 +220,7 @@ val_list MOUNT_Interp::event_common_vl(RPC_CallInfo *c,
EnumVal* MOUNT_Interp::mount3_auth_flavor(const u_char*& buf, int& n) EnumVal* MOUNT_Interp::mount3_auth_flavor(const u_char*& buf, int& n)
{ {
BifEnum::MOUNT3::auth_flavor_t t = (BifEnum::MOUNT3::auth_flavor_t)extract_XDR_uint32(buf, n); BifEnum::MOUNT3::auth_flavor_t t = (BifEnum::MOUNT3::auth_flavor_t)extract_XDR_uint32(buf, n);
return BifType::Enum::MOUNT3::auth_flavor_t->GetVal(t); return BifType::Enum::MOUNT3::auth_flavor_t->GetVal(t).release();
} }
StringVal* MOUNT_Interp::mount3_fh(const u_char*& buf, int& n) StringVal* MOUNT_Interp::mount3_fh(const u_char*& buf, int& n)

View file

@ -251,7 +251,7 @@ int NFS_Interp::RPC_BuildReply(RPC_CallInfo* c, BifEnum::rpc_status rpc_status,
// Otherwise DeliverRPC would complain about // Otherwise DeliverRPC would complain about
// excess_RPC. // excess_RPC.
n = 0; n = 0;
reply = BifType::Enum::NFS3::proc_t->GetVal(c->Proc()); reply = BifType::Enum::NFS3::proc_t->GetVal(c->Proc()).release();
event = nfs_proc_not_implemented; event = nfs_proc_not_implemented;
} }
else else
@ -335,16 +335,16 @@ val_list NFS_Interp::event_common_vl(RPC_CallInfo *c, BifEnum::rpc_status rpc_st
RecordVal *info = new RecordVal(BifType::Record::NFS3::info_t); RecordVal *info = new RecordVal(BifType::Record::NFS3::info_t);
info->Assign(0, BifType::Enum::rpc_status->GetVal(rpc_status)); info->Assign(0, BifType::Enum::rpc_status->GetVal(rpc_status));
info->Assign(1, BifType::Enum::NFS3::status_t->GetVal(nfs_status)); info->Assign(1, BifType::Enum::NFS3::status_t->GetVal(nfs_status));
info->Assign(2, new Val(c->StartTime(), TYPE_TIME)); info->Assign(2, make_intrusive<Val>(c->StartTime(), TYPE_TIME));
info->Assign(3, new Val(c->LastTime()-c->StartTime(), TYPE_INTERVAL)); info->Assign(3, make_intrusive<Val>(c->LastTime()-c->StartTime(), TYPE_INTERVAL));
info->Assign(4, val_mgr->GetCount(c->RPCLen())); info->Assign(4, val_mgr->GetCount(c->RPCLen()));
info->Assign(5, new Val(rep_start_time, TYPE_TIME)); info->Assign(5, make_intrusive<Val>(rep_start_time, TYPE_TIME));
info->Assign(6, new Val(rep_last_time-rep_start_time, TYPE_INTERVAL)); info->Assign(6, make_intrusive<Val>(rep_last_time-rep_start_time, TYPE_INTERVAL));
info->Assign(7, val_mgr->GetCount(reply_len)); info->Assign(7, val_mgr->GetCount(reply_len));
info->Assign(8, val_mgr->GetCount(c->Uid())); info->Assign(8, val_mgr->GetCount(c->Uid()));
info->Assign(9, val_mgr->GetCount(c->Gid())); info->Assign(9, val_mgr->GetCount(c->Gid()));
info->Assign(10, val_mgr->GetCount(c->Stamp())); info->Assign(10, val_mgr->GetCount(c->Stamp()));
info->Assign(11, new StringVal(c->MachineName())); info->Assign(11, make_intrusive<StringVal>(c->MachineName()));
info->Assign(12, auxgids); info->Assign(12, auxgids);
vl.push_back(info); vl.push_back(info);
@ -437,13 +437,13 @@ RecordVal* NFS_Interp::nfs3_fattr(const u_char*& buf, int& n)
EnumVal* NFS_Interp::nfs3_time_how(const u_char*& buf, int& n) EnumVal* NFS_Interp::nfs3_time_how(const u_char*& buf, int& n)
{ {
BifEnum::NFS3::time_how_t t = (BifEnum::NFS3::time_how_t)extract_XDR_uint32(buf, n); BifEnum::NFS3::time_how_t t = (BifEnum::NFS3::time_how_t)extract_XDR_uint32(buf, n);
return BifType::Enum::NFS3::time_how_t->GetVal(t); return BifType::Enum::NFS3::time_how_t->GetVal(t).release();
} }
EnumVal* NFS_Interp::nfs3_ftype(const u_char*& buf, int& n) EnumVal* NFS_Interp::nfs3_ftype(const u_char*& buf, int& n)
{ {
BifEnum::NFS3::file_type_t t = (BifEnum::NFS3::file_type_t)extract_XDR_uint32(buf, n); BifEnum::NFS3::file_type_t t = (BifEnum::NFS3::file_type_t)extract_XDR_uint32(buf, n);
return BifType::Enum::NFS3::file_type_t->GetVal(t); return BifType::Enum::NFS3::file_type_t->GetVal(t).release();
} }
RecordVal* NFS_Interp::nfs3_wcc_attr(const u_char*& buf, int& n) RecordVal* NFS_Interp::nfs3_wcc_attr(const u_char*& buf, int& n)
@ -532,7 +532,7 @@ RecordVal* NFS_Interp::nfs3_pre_op_attr(const u_char*& buf, int& n)
EnumVal *NFS_Interp::nfs3_stable_how(const u_char*& buf, int& n) EnumVal *NFS_Interp::nfs3_stable_how(const u_char*& buf, int& n)
{ {
BifEnum::NFS3::stable_how_t stable = (BifEnum::NFS3::stable_how_t)extract_XDR_uint32(buf, n); BifEnum::NFS3::stable_how_t stable = (BifEnum::NFS3::stable_how_t)extract_XDR_uint32(buf, n);
return BifType::Enum::NFS3::stable_how_t->GetVal(stable); return BifType::Enum::NFS3::stable_how_t->GetVal(stable).release();
} }
RecordVal* NFS_Interp::nfs3_lookup_reply(const u_char*& buf, int& n, BifEnum::NFS3::status_t status) RecordVal* NFS_Interp::nfs3_lookup_reply(const u_char*& buf, int& n, BifEnum::NFS3::status_t status)

View file

@ -139,7 +139,7 @@ int PortmapperInterp::RPC_BuildReply(RPC_CallInfo* c, BifEnum::rpc_status status
event = success ? pm_request_dump : pm_attempt_dump; event = success ? pm_request_dump : pm_attempt_dump;
if ( success ) if ( success )
{ {
TableVal* mappings = new TableVal(pm_mappings); TableVal* mappings = new TableVal({NewRef{}, pm_mappings});
uint32_t nmap = 0; uint32_t nmap = 0;
// Each call in the loop test pulls the next "opted" // Each call in the loop test pulls the next "opted"
@ -295,7 +295,7 @@ void PortmapperInterp::Event(EventHandlerPtr f, Val* request, BifEnum::rpc_statu
} }
else else
{ {
vl.push_back(BifType::Enum::rpc_status->GetVal(status)); vl.push_back(BifType::Enum::rpc_status->GetVal(status).release());
if ( request ) if ( request )
vl.push_back(request); vl.push_back(request);
} }

View file

@ -344,7 +344,7 @@ void RPC_Interpreter::Event_RPC_Dialogue(RPC_CallInfo* c, BifEnum::rpc_status st
val_mgr->GetCount(c->Program()), val_mgr->GetCount(c->Program()),
val_mgr->GetCount(c->Version()), val_mgr->GetCount(c->Version()),
val_mgr->GetCount(c->Proc()), val_mgr->GetCount(c->Proc()),
BifType::Enum::rpc_status->GetVal(status), BifType::Enum::rpc_status->GetVal(status).release(),
new Val(c->StartTime(), TYPE_TIME), new Val(c->StartTime(), TYPE_TIME),
val_mgr->GetCount(c->CallLen()), val_mgr->GetCount(c->CallLen()),
val_mgr->GetCount(reply_len), val_mgr->GetCount(reply_len),
@ -374,7 +374,7 @@ void RPC_Interpreter::Event_RPC_Reply(uint32_t xid, BifEnum::rpc_status status,
analyzer->ConnectionEventFast(rpc_reply, { analyzer->ConnectionEventFast(rpc_reply, {
analyzer->BuildConnVal(), analyzer->BuildConnVal(),
val_mgr->GetCount(xid), val_mgr->GetCount(xid),
BifType::Enum::rpc_status->GetVal(status), BifType::Enum::rpc_status->GetVal(status).release(),
val_mgr->GetCount(reply_len), val_mgr->GetCount(reply_len),
}); });
} }

View file

@ -65,7 +65,7 @@ refine flow SIP_Flow += {
function build_sip_headers_val(): BroVal function build_sip_headers_val(): BroVal
%{ %{
TableVal* t = new TableVal(mime_header_list); TableVal* t = new TableVal({NewRef{}, mime_header_list});
for ( unsigned int i = 0; i < headers.size(); ++i ) for ( unsigned int i = 0; i < headers.size(); ++i )
{ // index starting from 1 { // index starting from 1

View file

@ -25,7 +25,7 @@ refine connection SOCKS_Conn += {
if ( socks_request ) if ( socks_request )
{ {
RecordVal* sa = new RecordVal(socks_address); RecordVal* sa = new RecordVal(socks_address);
sa->Assign(0, new AddrVal(htonl(${request.addr}))); sa->Assign(0, make_intrusive<AddrVal>(htonl(${request.addr})));
if ( ${request.v4a} ) if ( ${request.v4a} )
sa->Assign(1, array_to_string(${request.name})); sa->Assign(1, array_to_string(${request.name}));
@ -49,7 +49,7 @@ refine connection SOCKS_Conn += {
if ( socks_reply ) if ( socks_reply )
{ {
RecordVal* sa = new RecordVal(socks_address); RecordVal* sa = new RecordVal(socks_address);
sa->Assign(0, new AddrVal(htonl(${reply.addr}))); sa->Assign(0, make_intrusive<AddrVal>(htonl(${reply.addr})));
BifEvent::generate_socks_reply(bro_analyzer(), BifEvent::generate_socks_reply(bro_analyzer(),
bro_analyzer()->Conn(), bro_analyzer()->Conn(),
@ -86,16 +86,16 @@ refine connection SOCKS_Conn += {
switch ( ${request.remote_name.addr_type} ) switch ( ${request.remote_name.addr_type} )
{ {
case 1: case 1:
sa->Assign(0, new AddrVal(htonl(${request.remote_name.ipv4}))); sa->Assign(0, make_intrusive<AddrVal>(htonl(${request.remote_name.ipv4})));
break; break;
case 3: case 3:
sa->Assign(1, new StringVal(${request.remote_name.domain_name.name}.length(), sa->Assign(1, make_intrusive<StringVal>(${request.remote_name.domain_name.name}.length(),
(const char*) ${request.remote_name.domain_name.name}.data())); (const char*) ${request.remote_name.domain_name.name}.data()));
break; break;
case 4: case 4:
sa->Assign(0, new AddrVal(IPAddr(IPv6, (const uint32_t*) ${request.remote_name.ipv6}, IPAddr::Network))); sa->Assign(0, make_intrusive<AddrVal>(IPAddr(IPv6, (const uint32_t*) ${request.remote_name.ipv6}, IPAddr::Network)));
break; break;
default: default:
@ -128,16 +128,16 @@ refine connection SOCKS_Conn += {
switch ( ${reply.bound.addr_type} ) switch ( ${reply.bound.addr_type} )
{ {
case 1: case 1:
sa->Assign(0, new AddrVal(htonl(${reply.bound.ipv4}))); sa->Assign(0, make_intrusive<AddrVal>(htonl(${reply.bound.ipv4})));
break; break;
case 3: case 3:
sa->Assign(1, new StringVal(${reply.bound.domain_name.name}.length(), sa->Assign(1, make_intrusive<StringVal>(${reply.bound.domain_name.name}.length(),
(const char*) ${reply.bound.domain_name.name}.data())); (const char*) ${reply.bound.domain_name.name}.data()));
break; break;
case 4: case 4:
sa->Assign(0, new AddrVal(IPAddr(IPv6, (const uint32_t*) ${reply.bound.ipv6}, IPAddr::Network))); sa->Assign(0, make_intrusive<AddrVal>(IPAddr(IPv6, (const uint32_t*) ${reply.bound.ipv6}, IPAddr::Network)));
break; break;
default: default:

View file

@ -32,7 +32,7 @@ VectorVal* name_list_to_vector(const bytestring& nl)
{ {
word = name_list.substr(start, split_pos - start); word = name_list.substr(start, split_pos - start);
if ( word.size() > 0 && word[0] != ',' ) if ( word.size() > 0 && word[0] != ',' )
vv->Assign(vv->Size(), new StringVal(word)); vv->Assign(vv->Size(), make_intrusive<StringVal>(word));
start = split_pos + 1; start = split_pos + 1;
} }
@ -41,7 +41,7 @@ VectorVal* name_list_to_vector(const bytestring& nl)
if ( start < name_list.size() ) if ( start < name_list.size() )
{ {
word = name_list.substr(start, name_list.size() - start); word = name_list.substr(start, name_list.size() - start);
vv->Assign(vv->Size(), new StringVal(word)); vv->Assign(vv->Size(), make_intrusive<StringVal>(word));
} }
return vv; return vv;
} }

View file

@ -183,7 +183,7 @@ refine connection Handshake_Conn += {
if ( protocols ) if ( protocols )
{ {
for ( unsigned int i = 0; i < protocols->size(); ++i ) for ( unsigned int i = 0; i < protocols->size(); ++i )
plist->Assign(i, new StringVal((*protocols)[i]->name().length(), (const char*) (*protocols)[i]->name().data())); plist->Assign(i, make_intrusive<StringVal>((*protocols)[i]->name().length(), (const char*) (*protocols)[i]->name().data()));
} }
BifEvent::generate_ssl_extension_application_layer_protocol_negotiation(bro_analyzer(), bro_analyzer()->Conn(), BifEvent::generate_ssl_extension_application_layer_protocol_negotiation(bro_analyzer(), bro_analyzer()->Conn(),
@ -208,7 +208,7 @@ refine connection Handshake_Conn += {
} }
if ( servername->host_name() ) if ( servername->host_name() )
servers->Assign(j++, new StringVal(servername->host_name()->host_name().length(), (const char*) servername->host_name()->host_name().data())); servers->Assign(j++, make_intrusive<StringVal>(servername->host_name()->host_name().length(), (const char*) servername->host_name()->host_name().data()));
else else
bro_analyzer()->Weird("Empty server_name extension in ssl connection"); bro_analyzer()->Weird("Empty server_name extension in ssl connection");
} }
@ -487,7 +487,7 @@ refine connection Handshake_Conn += {
for ( auto&& identity : *(identities->identities()) ) for ( auto&& identity : *(identities->identities()) )
{ {
RecordVal* el = new RecordVal(BifType::Record::SSL::PSKIdentity); RecordVal* el = new RecordVal(BifType::Record::SSL::PSKIdentity);
el->Assign(0, new StringVal(identity->identity().length(), (const char*) identity->identity().data())); el->Assign(0, make_intrusive<StringVal>(identity->identity().length(), (const char*) identity->identity().data()));
el->Assign(1, val_mgr->GetCount(identity->obfuscated_ticket_age())); el->Assign(1, val_mgr->GetCount(identity->obfuscated_ticket_age()));
slist->Assign(slist->Size(), el); slist->Assign(slist->Size(), el);
} }
@ -497,7 +497,7 @@ refine connection Handshake_Conn += {
if ( binders && binders->binders() ) if ( binders && binders->binders() )
{ {
for ( auto&& binder : *(binders->binders()) ) for ( auto&& binder : *(binders->binders()) )
blist->Assign(blist->Size(), new StringVal(binder->binder().length(), (const char*) binder->binder().data())); blist->Assign(blist->Size(), make_intrusive<StringVal>(binder->binder().length(), (const char*) binder->binder().data()));
} }
BifEvent::generate_ssl_extension_pre_shared_key_client_hello(bro_analyzer(), bro_analyzer()->Conn(), BifEvent::generate_ssl_extension_pre_shared_key_client_hello(bro_analyzer(), bro_analyzer()->Conn(),

View file

@ -1366,7 +1366,7 @@ int TCP_Analyzer::ParseTCPOptions(const struct tcphdr* tcp, bool is_orig)
auto data_len = olen - 2; auto data_len = olen - 2;
auto data = reinterpret_cast<const char*>(odata + 2); auto data = reinterpret_cast<const char*>(odata + 2);
rv->Assign(2, new StringVal(data_len, data)); rv->Assign(2, make_intrusive<StringVal>(data_len, data));
}; };
for ( const auto& o : opts ) for ( const auto& o : opts )

View file

@ -47,7 +47,7 @@ TCP_Reassembler::TCP_Reassembler(analyzer::Analyzer* arg_dst_analyzer,
TableVal* ports = IsOrig() ? TableVal* ports = IsOrig() ?
tcp_content_delivery_ports_orig : tcp_content_delivery_ports_orig :
tcp_content_delivery_ports_resp; tcp_content_delivery_ports_resp;
Val* result = ports->Lookup(dst_port_val); auto result = ports->Lookup(dst_port_val);
if ( (IsOrig() && tcp_content_deliver_all_orig) || if ( (IsOrig() && tcp_content_deliver_all_orig) ||
(! IsOrig() && tcp_content_deliver_all_resp) || (! IsOrig() && tcp_content_deliver_all_resp) ||

View file

@ -118,9 +118,9 @@ RecordVal* TeredoEncapsulation::BuildVal(const IP_Hdr* inner) const
uint8_t au_len = *((uint8_t*)(auth + 3)); uint8_t au_len = *((uint8_t*)(auth + 3));
uint64_t nonce = ntohll(*((uint64_t*)(auth + 4 + id_len + au_len))); uint64_t nonce = ntohll(*((uint64_t*)(auth + 4 + id_len + au_len)));
uint8_t conf = *((uint8_t*)(auth + 4 + id_len + au_len + 8)); uint8_t conf = *((uint8_t*)(auth + 4 + id_len + au_len + 8));
teredo_auth->Assign(0, new StringVal( teredo_auth->Assign(0, make_intrusive<StringVal>(
new BroString(auth + 4, id_len, 1))); new BroString(auth + 4, id_len, 1)));
teredo_auth->Assign(1, new StringVal( teredo_auth->Assign(1, make_intrusive<StringVal>(
new BroString(auth + 4 + id_len, au_len, 1))); new BroString(auth + 4 + id_len, au_len, 1)));
teredo_auth->Assign(2, val_mgr->GetCount(nonce)); teredo_auth->Assign(2, val_mgr->GetCount(nonce));
teredo_auth->Assign(3, val_mgr->GetCount(conf)); teredo_auth->Assign(3, val_mgr->GetCount(conf));
@ -133,7 +133,7 @@ RecordVal* TeredoEncapsulation::BuildVal(const IP_Hdr* inner) const
uint16_t port = ntohs(*((uint16_t*)(origin_indication + 2))) ^ 0xFFFF; uint16_t port = ntohs(*((uint16_t*)(origin_indication + 2))) ^ 0xFFFF;
uint32_t addr = ntohl(*((uint32_t*)(origin_indication + 4))) ^ 0xFFFFFFFF; uint32_t addr = ntohl(*((uint32_t*)(origin_indication + 4))) ^ 0xFFFFFFFF;
teredo_origin->Assign(0, val_mgr->GetPort(port, TRANSPORT_UDP)); teredo_origin->Assign(0, val_mgr->GetPort(port, TRANSPORT_UDP));
teredo_origin->Assign(1, new AddrVal(htonl(addr))); teredo_origin->Assign(1, make_intrusive<AddrVal>(htonl(addr)));
teredo_hdr->Assign(1, teredo_origin); teredo_hdr->Assign(1, teredo_origin);
} }

View file

@ -135,23 +135,20 @@ void UDP_Analyzer::DeliverPacket(int len, const u_char* data, bool is_orig,
if ( udp_contents ) if ( udp_contents )
{ {
auto port_val = val_mgr->GetPort(ntohs(up->uh_dport), TRANSPORT_UDP); auto port_val = val_mgr->GetPort(ntohs(up->uh_dport), TRANSPORT_UDP);
Val* result = 0;
bool do_udp_contents = false; bool do_udp_contents = false;
if ( is_orig ) if ( is_orig )
{ {
result = udp_content_delivery_ports_orig->Lookup( auto result = udp_content_delivery_ports_orig->Lookup(port_val);
port_val);
if ( udp_content_deliver_all_orig || if ( udp_content_deliver_all_orig || (result && result->AsBool()) )
(result && result->AsBool()) )
do_udp_contents = true; do_udp_contents = true;
} }
else else
{ {
result = udp_content_delivery_ports_resp->Lookup( auto result = udp_content_delivery_ports_resp->Lookup(port_val);
port_val);
if ( udp_content_deliver_all_resp || if ( udp_content_deliver_all_resp || (result && result->AsBool()) )
(result && result->AsBool()) )
do_udp_contents = true; do_udp_contents = true;
} }

View file

@ -196,7 +196,7 @@ struct val_converter {
if ( i == -1 ) if ( i == -1 )
return nullptr; return nullptr;
return etype->GetVal(i); return etype->GetVal(i).release();
} }
return nullptr; return nullptr;
@ -208,7 +208,7 @@ struct val_converter {
return nullptr; return nullptr;
auto tt = type->AsTableType(); auto tt = type->AsTableType();
auto rval = make_intrusive<TableVal>(tt); auto rval = make_intrusive<TableVal>(IntrusivePtr{NewRef{}, tt});
for ( auto& item : a ) for ( auto& item : a )
{ {
@ -268,7 +268,7 @@ struct val_converter {
return nullptr; return nullptr;
auto tt = type->AsTableType(); auto tt = type->AsTableType();
auto rval = make_intrusive<TableVal>(tt); auto rval = make_intrusive<TableVal>(IntrusivePtr{NewRef{}, tt});
for ( auto& item : a ) for ( auto& item : a )
{ {
@ -321,7 +321,7 @@ struct val_converter {
if ( ! value_val ) if ( ! value_val )
return nullptr; return nullptr;
rval->Assign(list_val.get(), value_val.release()); rval->Assign(list_val.get(), std::move(value_val));
} }
return rval.release(); return rval.release();
@ -341,7 +341,7 @@ struct val_converter {
if ( ! item_val ) if ( ! item_val )
return nullptr; return nullptr;
rval->Assign(rval->Size(), item_val.release()); rval->Assign(rval->Size(), std::move(item_val));
} }
return rval.release(); return rval.release();
@ -410,7 +410,7 @@ struct val_converter {
if ( ! item_val ) if ( ! item_val )
return nullptr; return nullptr;
rval->Assign(i, item_val.release()); rval->Assign(i, std::move(item_val));
++idx; ++idx;
} }
@ -997,8 +997,7 @@ broker::expected<broker::data> bro_broker::val_to_data(const Val* v)
continue; continue;
} }
auto item = val_to_data(item_val); auto item = val_to_data(item_val.get());
Unref(item_val);
if ( ! item ) if ( ! item )
return broker::ec::invalid_data; return broker::ec::invalid_data;
@ -1040,7 +1039,7 @@ RecordVal* bro_broker::make_data_val(Val* v)
auto data = val_to_data(v); auto data = val_to_data(v);
if ( data ) if ( data )
rval->Assign(0, new DataVal(move(*data))); rval->Assign(0, make_intrusive<DataVal>(move(*data)));
else else
reporter->Warning("did not get a value from val_to_data"); reporter->Warning("did not get a value from val_to_data");
@ -1050,7 +1049,7 @@ RecordVal* bro_broker::make_data_val(Val* v)
RecordVal* bro_broker::make_data_val(broker::data d) RecordVal* bro_broker::make_data_val(broker::data d)
{ {
auto rval = new RecordVal(BifType::Record::Broker::Data); auto rval = new RecordVal(BifType::Record::Broker::Data);
rval->Assign(0, new DataVal(move(d))); rval->Assign(0, make_intrusive<DataVal>(move(d)));
return rval; return rval;
} }
@ -1059,72 +1058,72 @@ struct data_type_getter {
result_type operator()(broker::none) result_type operator()(broker::none)
{ {
return BifType::Enum::Broker::DataType->GetVal(BifEnum::Broker::NONE); return BifType::Enum::Broker::DataType->GetVal(BifEnum::Broker::NONE).release();
} }
result_type operator()(bool) result_type operator()(bool)
{ {
return BifType::Enum::Broker::DataType->GetVal(BifEnum::Broker::BOOL); return BifType::Enum::Broker::DataType->GetVal(BifEnum::Broker::BOOL).release();
} }
result_type operator()(uint64_t) result_type operator()(uint64_t)
{ {
return BifType::Enum::Broker::DataType->GetVal(BifEnum::Broker::COUNT); return BifType::Enum::Broker::DataType->GetVal(BifEnum::Broker::COUNT).release();
} }
result_type operator()(int64_t) result_type operator()(int64_t)
{ {
return BifType::Enum::Broker::DataType->GetVal(BifEnum::Broker::INT); return BifType::Enum::Broker::DataType->GetVal(BifEnum::Broker::INT).release();
} }
result_type operator()(double) result_type operator()(double)
{ {
return BifType::Enum::Broker::DataType->GetVal(BifEnum::Broker::DOUBLE); return BifType::Enum::Broker::DataType->GetVal(BifEnum::Broker::DOUBLE).release();
} }
result_type operator()(const std::string&) result_type operator()(const std::string&)
{ {
return BifType::Enum::Broker::DataType->GetVal(BifEnum::Broker::STRING); return BifType::Enum::Broker::DataType->GetVal(BifEnum::Broker::STRING).release();
} }
result_type operator()(const broker::address&) result_type operator()(const broker::address&)
{ {
return BifType::Enum::Broker::DataType->GetVal(BifEnum::Broker::ADDR); return BifType::Enum::Broker::DataType->GetVal(BifEnum::Broker::ADDR).release();
} }
result_type operator()(const broker::subnet&) result_type operator()(const broker::subnet&)
{ {
return BifType::Enum::Broker::DataType->GetVal(BifEnum::Broker::SUBNET); return BifType::Enum::Broker::DataType->GetVal(BifEnum::Broker::SUBNET).release();
} }
result_type operator()(const broker::port&) result_type operator()(const broker::port&)
{ {
return BifType::Enum::Broker::DataType->GetVal(BifEnum::Broker::PORT); return BifType::Enum::Broker::DataType->GetVal(BifEnum::Broker::PORT).release();
} }
result_type operator()(const broker::timestamp&) result_type operator()(const broker::timestamp&)
{ {
return BifType::Enum::Broker::DataType->GetVal(BifEnum::Broker::TIME); return BifType::Enum::Broker::DataType->GetVal(BifEnum::Broker::TIME).release();
} }
result_type operator()(const broker::timespan&) result_type operator()(const broker::timespan&)
{ {
return BifType::Enum::Broker::DataType->GetVal(BifEnum::Broker::INTERVAL); return BifType::Enum::Broker::DataType->GetVal(BifEnum::Broker::INTERVAL).release();
} }
result_type operator()(const broker::enum_value&) result_type operator()(const broker::enum_value&)
{ {
return BifType::Enum::Broker::DataType->GetVal(BifEnum::Broker::ENUM); return BifType::Enum::Broker::DataType->GetVal(BifEnum::Broker::ENUM).release();
} }
result_type operator()(const broker::set&) result_type operator()(const broker::set&)
{ {
return BifType::Enum::Broker::DataType->GetVal(BifEnum::Broker::SET); return BifType::Enum::Broker::DataType->GetVal(BifEnum::Broker::SET).release();
} }
result_type operator()(const broker::table&) result_type operator()(const broker::table&)
{ {
return BifType::Enum::Broker::DataType->GetVal(BifEnum::Broker::TABLE); return BifType::Enum::Broker::DataType->GetVal(BifEnum::Broker::TABLE).release();
} }
result_type operator()(const broker::vector&) result_type operator()(const broker::vector&)
@ -1132,7 +1131,7 @@ struct data_type_getter {
// Note that Broker uses vectors to store record data, so there's // Note that Broker uses vectors to store record data, so there's
// no actual way to tell if this data was originally associated // no actual way to tell if this data was originally associated
// with a Bro record. // with a Bro record.
return BifType::Enum::Broker::DataType->GetVal(BifEnum::Broker::VECTOR); return BifType::Enum::Broker::DataType->GetVal(BifEnum::Broker::VECTOR).release();
} }
}; };

View file

@ -158,7 +158,7 @@ void Manager::InitPostScript()
opaque_of_vector_iterator = new OpaqueType("Broker::VectorIterator"); opaque_of_vector_iterator = new OpaqueType("Broker::VectorIterator");
opaque_of_record_iterator = new OpaqueType("Broker::RecordIterator"); opaque_of_record_iterator = new OpaqueType("Broker::RecordIterator");
opaque_of_store_handle = new OpaqueType("Broker::Store"); opaque_of_store_handle = new OpaqueType("Broker::Store");
vector_of_data_type = new VectorType(internal_type("Broker::Data")->Ref()); vector_of_data_type = new VectorType({NewRef{}, internal_type("Broker::Data")});
// Register as a "dont-count" source first, we may change that later. // Register as a "dont-count" source first, we may change that later.
iosource_mgr->Register(this, true); iosource_mgr->Register(this, true);
@ -550,7 +550,7 @@ bool Manager::PublishLogWrite(EnumVal* stream, EnumVal* writer, string path, int
new StringVal(path), new StringVal(path),
}; };
Val* v = log_topic_func->Call(&vl); auto v = log_topic_func->Call(&vl);
if ( ! v ) if ( ! v )
{ {
@ -561,7 +561,6 @@ bool Manager::PublishLogWrite(EnumVal* stream, EnumVal* writer, string path, int
} }
std::string topic = v->AsString()->CheckString(); std::string topic = v->AsString()->CheckString();
Unref(v);
auto bstream_id = broker::enum_value(move(stream_id)); auto bstream_id = broker::enum_value(move(stream_id));
auto bwriter_id = broker::enum_value(move(writer_id)); auto bwriter_id = broker::enum_value(move(writer_id));
@ -734,7 +733,7 @@ RecordVal* Manager::MakeEvent(val_list* args, Frame* frame)
return rval; return rval;
} }
rval->Assign(0, new StringVal(func->Name())); rval->Assign(0, make_intrusive<StringVal>(func->Name()));
continue; continue;
} }
@ -1252,24 +1251,24 @@ void Manager::ProcessStatus(broker::status stat)
if ( ctx ) if ( ctx )
{ {
endpoint_info->Assign(0, new StringVal(to_string(ctx->node))); endpoint_info->Assign(0, make_intrusive<StringVal>(to_string(ctx->node)));
auto ni = internal_type("Broker::NetworkInfo")->AsRecordType(); auto ni = internal_type("Broker::NetworkInfo")->AsRecordType();
auto network_info = new RecordVal(ni); auto network_info = make_intrusive<RecordVal>(ni);
if ( ctx->network ) if ( ctx->network )
{ {
network_info->Assign(0, new StringVal(ctx->network->address.data())); network_info->Assign(0, make_intrusive<StringVal>(ctx->network->address.data()));
network_info->Assign(1, val_mgr->GetPort(ctx->network->port, TRANSPORT_TCP)); network_info->Assign(1, val_mgr->GetPort(ctx->network->port, TRANSPORT_TCP));
} }
else else
{ {
// TODO: are there any status messages where the ctx->network // TODO: are there any status messages where the ctx->network
// is not set and actually could be? // is not set and actually could be?
network_info->Assign(0, new StringVal("<unknown>")); network_info->Assign(0, make_intrusive<StringVal>("<unknown>"));
network_info->Assign(1, val_mgr->GetPort(0, TRANSPORT_TCP)); network_info->Assign(1, val_mgr->GetPort(0, TRANSPORT_TCP));
} }
endpoint_info->Assign(1, network_info); endpoint_info->Assign(1, std::move(network_info));
} }
auto str = stat.message(); auto str = stat.message();
@ -1353,7 +1352,7 @@ void Manager::ProcessError(broker::error err)
} }
mgr.QueueEventFast(Broker::error, { mgr.QueueEventFast(Broker::error, {
BifType::Enum::Broker::ErrorCode->GetVal(ec), BifType::Enum::Broker::ErrorCode->GetVal(ec).release(),
new StringVal(msg), new StringVal(msg),
}); });
} }

View file

@ -20,7 +20,7 @@ EnumVal* query_status(bool success)
failure_val = store_query_status->Lookup("Broker", "FAILURE"); failure_val = store_query_status->Lookup("Broker", "FAILURE");
} }
return store_query_status->GetVal(success ? success_val : failure_val); return store_query_status->GetVal(success ? success_val : failure_val).release();
} }
void StoreHandleVal::ValDescribe(ODesc* d) const void StoreHandleVal::ValDescribe(ODesc* d) const

View file

@ -28,7 +28,7 @@ inline RecordVal* query_result()
{ {
auto rval = new RecordVal(BifType::Record::Broker::QueryResult); auto rval = new RecordVal(BifType::Record::Broker::QueryResult);
rval->Assign(0, query_status(false)); rval->Assign(0, query_status(false));
rval->Assign(1, new RecordVal(BifType::Record::Broker::Data)); rval->Assign(1, make_intrusive<RecordVal>(BifType::Record::Broker::Data));
return rval; return rval;
} }

View file

@ -109,16 +109,16 @@ function Broker::__peers%(%): PeerInfos
if ( n ) if ( n )
{ {
network_info->Assign(0, new AddrVal(IPAddr(n->address))); network_info->Assign(0, make_intrusive<AddrVal>(IPAddr(n->address)));
network_info->Assign(1, val_mgr->GetPort(n->port, TRANSPORT_TCP)); network_info->Assign(1, val_mgr->GetPort(n->port, TRANSPORT_TCP));
} }
else else
{ {
network_info->Assign(0, new AddrVal("0.0.0.0")); network_info->Assign(0, make_intrusive<AddrVal>("0.0.0.0"));
network_info->Assign(1, val_mgr->GetPort(0, TRANSPORT_TCP)); network_info->Assign(1, val_mgr->GetPort(0, TRANSPORT_TCP));
} }
endpoint_info->Assign(0, new StringVal(to_string(p.peer.node))); endpoint_info->Assign(0, make_intrusive<StringVal>(to_string(p.peer.node)));
endpoint_info->Assign(1, network_info); endpoint_info->Assign(1, network_info);
auto ps = (BifEnum::Broker::PeerStatus)p.status; auto ps = (BifEnum::Broker::PeerStatus)p.status;

View file

@ -154,7 +154,7 @@ function Broker::__set_iterator_value%(it: opaque of Broker::SetIterator%): Brok
return rval; return rval;
} }
rval->Assign(0, new bro_broker::DataVal(*set_it->it)); rval->Assign(0, make_intrusive<bro_broker::DataVal>(*set_it->it));
return rval; return rval;
%} %}
@ -312,8 +312,8 @@ function Broker::__table_iterator_value%(it: opaque of Broker::TableIterator%):
return rval; return rval;
} }
key_val->Assign(0, new bro_broker::DataVal(ti->it->first)); key_val->Assign(0, make_intrusive<bro_broker::DataVal>(ti->it->first));
val_val->Assign(0, new bro_broker::DataVal(ti->it->second)); val_val->Assign(0, make_intrusive<bro_broker::DataVal>(ti->it->second));
return rval; return rval;
%} %}
@ -431,7 +431,7 @@ function Broker::__vector_iterator_value%(it: opaque of Broker::VectorIterator%)
return rval; return rval;
} }
rval->Assign(0, new bro_broker::DataVal(*vi->it)); rval->Assign(0, make_intrusive<bro_broker::DataVal>(*vi->it));
return rval; return rval;
%} %}
@ -513,6 +513,6 @@ function Broker::__record_iterator_value%(it: opaque of Broker::RecordIterator%)
if ( caf::get_if<broker::none>(&(*ri->it)) ) if ( caf::get_if<broker::none>(&(*ri->it)) )
return rval; // field isn't set return rval; // field isn't set
rval->Assign(0, new bro_broker::DataVal(*ri->it)); rval->Assign(0, make_intrusive<bro_broker::DataVal>(*ri->it));
return rval; return rval;
%} %}

View file

@ -187,10 +187,7 @@ function Cluster::publish_rr%(pool: Pool, key: string, ...%): bool
auto topic = topic_func->Call(&vl); auto topic = topic_func->Call(&vl);
if ( ! topic->AsString()->Len() ) if ( ! topic->AsString()->Len() )
{
Unref(topic);
return val_mgr->GetFalse(); return val_mgr->GetFalse();
}
val_list* bif_args = @ARGS@; val_list* bif_args = @ARGS@;
val_list args(bif_args->length() - 2); val_list args(bif_args->length() - 2);
@ -199,7 +196,6 @@ function Cluster::publish_rr%(pool: Pool, key: string, ...%): bool
args.push_back((*bif_args)[i]); args.push_back((*bif_args)[i]);
auto rval = publish_event_args(args, topic->AsString(), frame); auto rval = publish_event_args(args, topic->AsString(), frame);
Unref(topic);
return val_mgr->GetBool(rval); return val_mgr->GetBool(rval);
%} %}
@ -228,10 +224,7 @@ function Cluster::publish_hrw%(pool: Pool, key: any, ...%): bool
auto topic = topic_func->Call(&vl); auto topic = topic_func->Call(&vl);
if ( ! topic->AsString()->Len() ) if ( ! topic->AsString()->Len() )
{
Unref(topic);
return val_mgr->GetFalse(); return val_mgr->GetFalse();
}
val_list* bif_args = @ARGS@; val_list* bif_args = @ARGS@;
val_list args(bif_args->length() - 2); val_list args(bif_args->length() - 2);
@ -240,6 +233,5 @@ function Cluster::publish_hrw%(pool: Pool, key: any, ...%): bool
args.push_back((*bif_args)[i]); args.push_back((*bif_args)[i]);
auto rval = publish_event_args(args, topic->AsString(), frame); auto rval = publish_event_args(args, topic->AsString(), frame);
Unref(topic);
return val_mgr->GetBool(rval); return val_mgr->GetBool(rval);
%} %}

View file

@ -21,8 +21,8 @@ static void analyzer_del_func(void* v)
AnalyzerSet::AnalyzerSet(File* arg_file) : file(arg_file) AnalyzerSet::AnalyzerSet(File* arg_file) : file(arg_file)
{ {
auto t = make_intrusive<TypeList>(); auto t = make_intrusive<TypeList>();
t->Append(file_mgr->GetTagEnumType()->Ref()); t->Append({NewRef{}, file_mgr->GetTagEnumType()});
t->Append(BifType::Record::Files::AnalyzerArgs->Ref()); t->Append({NewRef{}, BifType::Record::Files::AnalyzerArgs});
analyzer_hash = new CompositeHash(std::move(t)); analyzer_hash = new CompositeHash(std::move(t));
analyzer_map.SetDeleteFunc(analyzer_del_func); analyzer_map.SetDeleteFunc(analyzer_del_func);
} }

View file

@ -23,20 +23,19 @@ using namespace file_analysis;
static Val* empty_connection_table() static Val* empty_connection_table()
{ {
TypeList* tbl_index = new TypeList(conn_id); auto tbl_index = make_intrusive<TypeList>(IntrusivePtr{NewRef{}, conn_id});
tbl_index->Append(conn_id->Ref()); tbl_index->Append({NewRef{}, conn_id});
TableType* tbl_type = new TableType(tbl_index, connection_type->Ref()); auto tbl_type = make_intrusive<TableType>(std::move(tbl_index),
Val* rval = new TableVal(tbl_type); IntrusivePtr{NewRef{}, connection_type});
Unref(tbl_type); return new TableVal(std::move(tbl_type));
return rval;
} }
static RecordVal* get_conn_id_val(const Connection* conn) static RecordVal* get_conn_id_val(const Connection* conn)
{ {
RecordVal* v = new RecordVal(conn_id); RecordVal* v = new RecordVal(conn_id);
v->Assign(0, new AddrVal(conn->OrigAddr())); v->Assign(0, make_intrusive<AddrVal>(conn->OrigAddr()));
v->Assign(1, val_mgr->GetPort(ntohs(conn->OrigPort()), conn->ConnTransport())); v->Assign(1, val_mgr->GetPort(ntohs(conn->OrigPort()), conn->ConnTransport()));
v->Assign(2, new AddrVal(conn->RespAddr())); v->Assign(2, make_intrusive<AddrVal>(conn->RespAddr()));
v->Assign(3, val_mgr->GetPort(ntohs(conn->RespPort()), conn->ConnTransport())); v->Assign(3, val_mgr->GetPort(ntohs(conn->RespPort()), conn->ConnTransport()));
return v; return v;
} }
@ -93,7 +92,7 @@ File::File(const string& file_id, const string& source_name, Connection* conn,
DBG_LOG(DBG_FILE_ANALYSIS, "[%s] Creating new File object", file_id.c_str()); DBG_LOG(DBG_FILE_ANALYSIS, "[%s] Creating new File object", file_id.c_str());
val = new RecordVal(fa_file_type); val = new RecordVal(fa_file_type);
val->Assign(id_idx, new StringVal(file_id.c_str())); val->Assign(id_idx, make_intrusive<StringVal>(file_id.c_str()));
SetSource(source_name); SetSource(source_name);
if ( conn ) if ( conn )
@ -117,7 +116,7 @@ File::~File()
void File::UpdateLastActivityTime() void File::UpdateLastActivityTime()
{ {
val->Assign(last_active_idx, new Val(network_time, TYPE_TIME)); val->Assign(last_active_idx, make_intrusive<Val>(network_time, TYPE_TIME));
} }
double File::GetLastActivityTime() const double File::GetLastActivityTime() const
@ -165,18 +164,14 @@ void File::RaiseFileOverNewConnection(Connection* conn, bool is_orig)
uint64_t File::LookupFieldDefaultCount(int idx) const uint64_t File::LookupFieldDefaultCount(int idx) const
{ {
Val* v = val->LookupWithDefault(idx); auto v = val->LookupWithDefault(idx);
uint64_t rval = v->AsCount(); return v->AsCount();
Unref(v);
return rval;
} }
double File::LookupFieldDefaultInterval(int idx) const double File::LookupFieldDefaultInterval(int idx) const
{ {
Val* v = val->LookupWithDefault(idx); auto v = val->LookupWithDefault(idx);
double rval = v->AsInterval(); return v->AsInterval();
Unref(v);
return rval;
} }
int File::Idx(const string& field, const RecordType* type) int File::Idx(const string& field, const RecordType* type)
@ -199,7 +194,7 @@ string File::GetSource() const
void File::SetSource(const string& source) void File::SetSource(const string& source)
{ {
val->Assign(source_idx, new StringVal(source.c_str())); val->Assign(source_idx, make_intrusive<StringVal>(source.c_str()));
} }
double File::GetTimeoutInterval() const double File::GetTimeoutInterval() const
@ -209,7 +204,7 @@ double File::GetTimeoutInterval() const
void File::SetTimeoutInterval(double interval) void File::SetTimeoutInterval(double interval)
{ {
val->Assign(timeout_interval_idx, new Val(interval, TYPE_INTERVAL)); val->Assign(timeout_interval_idx, make_intrusive<Val>(interval, TYPE_INTERVAL));
} }
bool File::SetExtractionLimit(RecordVal* args, uint64_t bytes) bool File::SetExtractionLimit(RecordVal* args, uint64_t bytes)
@ -305,7 +300,7 @@ bool File::SetMime(const string& mime_type)
return false; return false;
RecordVal* meta = new RecordVal(fa_metadata_type); RecordVal* meta = new RecordVal(fa_metadata_type);
meta->Assign(meta_mime_type_idx, new StringVal(mime_type)); meta->Assign(meta_mime_type_idx, make_intrusive<StringVal>(mime_type));
meta->Assign(meta_inferred_idx, val_mgr->GetBool(0)); meta->Assign(meta_inferred_idx, val_mgr->GetBool(0));
FileEvent(file_sniff, {val->Ref(), meta}); FileEvent(file_sniff, {val->Ref(), meta});
@ -369,7 +364,7 @@ bool File::BufferBOF(const u_char* data, uint64_t len)
if ( bof_buffer.size > 0 ) if ( bof_buffer.size > 0 )
{ {
BroString* bs = concatenate(bof_buffer.chunks); BroString* bs = concatenate(bof_buffer.chunks);
val->Assign(bof_buffer_idx, new StringVal(bs)); val->Assign(bof_buffer_idx, make_intrusive<StringVal>(bs));
} }
return false; return false;

View file

@ -449,16 +449,13 @@ bool Manager::IsDisabled(const analyzer::Tag& tag)
disabled = internal_const_val("Files::disable")->AsTableVal(); disabled = internal_const_val("Files::disable")->AsTableVal();
Val* index = val_mgr->GetCount(bool(tag)); Val* index = val_mgr->GetCount(bool(tag));
Val* yield = disabled->Lookup(index); auto yield = disabled->Lookup(index);
Unref(index); Unref(index);
if ( ! yield ) if ( ! yield )
return false; return false;
bool rval = yield->AsBool(); return yield->AsBool();
Unref(yield);
return rval;
} }
Analyzer* Manager::InstantiateAnalyzer(const Tag& tag, RecordVal* args, File* f) const Analyzer* Manager::InstantiateAnalyzer(const Tag& tag, RecordVal* args, File* f) const
@ -528,7 +525,7 @@ VectorVal* file_analysis::GenMIMEMatchesVal(const RuleMatcher::MIME_Matches& m)
it2 != it->second.end(); ++it2 ) it2 != it->second.end(); ++it2 )
{ {
element->Assign(0, val_mgr->GetInt(it->first)); element->Assign(0, val_mgr->GetInt(it->first));
element->Assign(1, new StringVal(*it2)); element->Assign(1, make_intrusive<StringVal>(*it2));
} }
rval->Assign(rval->Size(), element); rval->Assign(rval->Size(), element);

View file

@ -21,8 +21,8 @@ DataEvent::DataEvent(RecordVal* args, File* file,
file_analysis::Analyzer* DataEvent::Instantiate(RecordVal* args, File* file) file_analysis::Analyzer* DataEvent::Instantiate(RecordVal* args, File* file)
{ {
Val* chunk_val = args->Lookup("chunk_event"); auto chunk_val = args->Lookup("chunk_event");
Val* stream_val = args->Lookup("stream_event"); auto stream_val = args->Lookup("stream_event");
if ( ! chunk_val && ! stream_val ) return 0; if ( ! chunk_val && ! stream_val ) return 0;

View file

@ -61,11 +61,11 @@ void Entropy::Finalize()
entropy->Get(&ent, &chisq, &mean, &montepi, &scc); entropy->Get(&ent, &chisq, &mean, &montepi, &scc);
RecordVal* ent_result = new RecordVal(entropy_test_result); RecordVal* ent_result = new RecordVal(entropy_test_result);
ent_result->Assign(0, new Val(ent, TYPE_DOUBLE)); ent_result->Assign(0, make_intrusive<Val>(ent, TYPE_DOUBLE));
ent_result->Assign(1, new Val(chisq, TYPE_DOUBLE)); ent_result->Assign(1, make_intrusive<Val>(chisq, TYPE_DOUBLE));
ent_result->Assign(2, new Val(mean, TYPE_DOUBLE)); ent_result->Assign(2, make_intrusive<Val>(mean, TYPE_DOUBLE));
ent_result->Assign(3, new Val(montepi, TYPE_DOUBLE)); ent_result->Assign(3, make_intrusive<Val>(montepi, TYPE_DOUBLE));
ent_result->Assign(4, new Val(scc, TYPE_DOUBLE)); ent_result->Assign(4, make_intrusive<Val>(scc, TYPE_DOUBLE));
mgr.QueueEventFast(file_entropy, { mgr.QueueEventFast(file_entropy, {
GetFile()->GetVal()->Ref(), GetFile()->GetVal()->Ref(),

View file

@ -32,9 +32,9 @@ Extract::~Extract()
safe_close(fd); safe_close(fd);
} }
static Val* get_extract_field_val(RecordVal* args, const char* name) static IntrusivePtr<Val> get_extract_field_val(RecordVal* args, const char* name)
{ {
Val* rval = args->Lookup(name); auto rval = args->Lookup(name);
if ( ! rval ) if ( ! rval )
reporter->Error("File extraction analyzer missing arg field: %s", name); reporter->Error("File extraction analyzer missing arg field: %s", name);
@ -44,8 +44,8 @@ static Val* get_extract_field_val(RecordVal* args, const char* name)
file_analysis::Analyzer* Extract::Instantiate(RecordVal* args, File* file) file_analysis::Analyzer* Extract::Instantiate(RecordVal* args, File* file)
{ {
Val* fname = get_extract_field_val(args, "extract_filename"); auto fname = get_extract_field_val(args, "extract_filename");
Val* limit = get_extract_field_val(args, "extract_limit"); auto limit = get_extract_field_val(args, "extract_limit");
if ( ! fname || ! limit ) if ( ! fname || ! limit )
return 0; return 0;

View file

@ -11,9 +11,8 @@ module FileExtract;
function FileExtract::__set_limit%(file_id: string, args: any, n: count%): bool function FileExtract::__set_limit%(file_id: string, args: any, n: count%): bool
%{ %{
using BifType::Record::Files::AnalyzerArgs; using BifType::Record::Files::AnalyzerArgs;
RecordVal* rv = args->AsRecordVal()->CoerceTo(AnalyzerArgs); auto rv = args->AsRecordVal()->CoerceTo(AnalyzerArgs);
bool result = file_mgr->SetExtractionLimit(file_id->CheckString(), rv, n); bool result = file_mgr->SetExtractionLimit(file_id->CheckString(), rv.get(), n);
Unref(rv);
return val_mgr->GetBool(result); return val_mgr->GetBool(result);
%} %}

View file

@ -25,7 +25,7 @@ refine flow File += {
function characteristics_to_bro(c: uint32, len: uint8): TableVal function characteristics_to_bro(c: uint32, len: uint8): TableVal
%{ %{
uint64 mask = (len==16) ? 0xFFFF : 0xFFFFFFFF; uint64 mask = (len==16) ? 0xFFFF : 0xFFFFFFFF;
TableVal* char_set = new TableVal(internal_type("count_set")->AsTableType()); TableVal* char_set = new TableVal({NewRef{}, internal_type("count_set")->AsTableType()});
for ( uint16 i=0; i < len; ++i ) for ( uint16 i=0; i < len; ++i )
{ {
if ( ((c >> i) & 0x1) == 1 ) if ( ((c >> i) & 0x1) == 1 )
@ -43,7 +43,7 @@ refine flow File += {
if ( pe_dos_header ) if ( pe_dos_header )
{ {
RecordVal* dh = new RecordVal(BifType::Record::PE::DOSHeader); RecordVal* dh = new RecordVal(BifType::Record::PE::DOSHeader);
dh->Assign(0, new StringVal(${h.signature}.length(), (const char*) ${h.signature}.data())); dh->Assign(0, make_intrusive<StringVal>(${h.signature}.length(), (const char*) ${h.signature}.data()));
dh->Assign(1, val_mgr->GetCount(${h.UsedBytesInTheLastPage})); dh->Assign(1, val_mgr->GetCount(${h.UsedBytesInTheLastPage}));
dh->Assign(2, val_mgr->GetCount(${h.FileSizeInPages})); dh->Assign(2, val_mgr->GetCount(${h.FileSizeInPages}));
dh->Assign(3, val_mgr->GetCount(${h.NumberOfRelocationItems})); dh->Assign(3, val_mgr->GetCount(${h.NumberOfRelocationItems}));
@ -97,7 +97,7 @@ refine flow File += {
{ {
RecordVal* fh = new RecordVal(BifType::Record::PE::FileHeader); RecordVal* fh = new RecordVal(BifType::Record::PE::FileHeader);
fh->Assign(0, val_mgr->GetCount(${h.Machine})); fh->Assign(0, val_mgr->GetCount(${h.Machine}));
fh->Assign(1, new Val(static_cast<double>(${h.TimeDateStamp}), TYPE_TIME)); fh->Assign(1, make_intrusive<Val>(static_cast<double>(${h.TimeDateStamp}), TYPE_TIME));
fh->Assign(2, val_mgr->GetCount(${h.PointerToSymbolTable})); fh->Assign(2, val_mgr->GetCount(${h.PointerToSymbolTable}));
fh->Assign(3, val_mgr->GetCount(${h.NumberOfSymbols})); fh->Assign(3, val_mgr->GetCount(${h.NumberOfSymbols}));
fh->Assign(4, val_mgr->GetCount(${h.SizeOfOptionalHeader})); fh->Assign(4, val_mgr->GetCount(${h.SizeOfOptionalHeader}));
@ -176,7 +176,7 @@ refine flow File += {
name_len = ${h.name}.length(); name_len = ${h.name}.length();
else else
name_len = first_null - ${h.name}.data(); name_len = first_null - ${h.name}.data();
section_header->Assign(0, new StringVal(name_len, (const char*) ${h.name}.data())); section_header->Assign(0, make_intrusive<StringVal>(name_len, (const char*) ${h.name}.data()));
section_header->Assign(1, val_mgr->GetCount(${h.virtual_size})); section_header->Assign(1, val_mgr->GetCount(${h.virtual_size}));
section_header->Assign(2, val_mgr->GetCount(${h.virtual_addr})); section_header->Assign(2, val_mgr->GetCount(${h.virtual_addr}));

View file

@ -69,7 +69,7 @@ refine flow Flow += {
RecordVal* ids_event = new RecordVal(BifType::Record::Unified2::IDSEvent); RecordVal* ids_event = new RecordVal(BifType::Record::Unified2::IDSEvent);
ids_event->Assign(0, val_mgr->GetCount(${ev.sensor_id})); ids_event->Assign(0, val_mgr->GetCount(${ev.sensor_id}));
ids_event->Assign(1, val_mgr->GetCount(${ev.event_id})); ids_event->Assign(1, val_mgr->GetCount(${ev.event_id}));
ids_event->Assign(2, new Val(ts_to_double(${ev.ts}), TYPE_TIME)); ids_event->Assign(2, make_intrusive<Val>(ts_to_double(${ev.ts}), TYPE_TIME));
ids_event->Assign(3, val_mgr->GetCount(${ev.signature_id})); ids_event->Assign(3, val_mgr->GetCount(${ev.signature_id}));
ids_event->Assign(4, val_mgr->GetCount(${ev.generator_id})); ids_event->Assign(4, val_mgr->GetCount(${ev.generator_id}));
ids_event->Assign(5, val_mgr->GetCount(${ev.signature_revision})); ids_event->Assign(5, val_mgr->GetCount(${ev.signature_revision}));
@ -97,7 +97,7 @@ refine flow Flow += {
RecordVal* ids_event = new RecordVal(BifType::Record::Unified2::IDSEvent); RecordVal* ids_event = new RecordVal(BifType::Record::Unified2::IDSEvent);
ids_event->Assign(0, val_mgr->GetCount(${ev.sensor_id})); ids_event->Assign(0, val_mgr->GetCount(${ev.sensor_id}));
ids_event->Assign(1, val_mgr->GetCount(${ev.event_id})); ids_event->Assign(1, val_mgr->GetCount(${ev.event_id}));
ids_event->Assign(2, new Val(ts_to_double(${ev.ts}), TYPE_TIME)); ids_event->Assign(2, make_intrusive<Val>(ts_to_double(${ev.ts}), TYPE_TIME));
ids_event->Assign(3, val_mgr->GetCount(${ev.signature_id})); ids_event->Assign(3, val_mgr->GetCount(${ev.signature_id}));
ids_event->Assign(4, val_mgr->GetCount(${ev.generator_id})); ids_event->Assign(4, val_mgr->GetCount(${ev.generator_id}));
ids_event->Assign(5, val_mgr->GetCount(${ev.signature_revision})); ids_event->Assign(5, val_mgr->GetCount(${ev.signature_revision}));
@ -131,7 +131,7 @@ refine flow Flow += {
packet->Assign(0, val_mgr->GetCount(${pkt.sensor_id})); packet->Assign(0, val_mgr->GetCount(${pkt.sensor_id}));
packet->Assign(1, val_mgr->GetCount(${pkt.event_id})); packet->Assign(1, val_mgr->GetCount(${pkt.event_id}));
packet->Assign(2, val_mgr->GetCount(${pkt.event_second})); packet->Assign(2, val_mgr->GetCount(${pkt.event_second}));
packet->Assign(3, new Val(ts_to_double(${pkt.packet_ts}), TYPE_TIME)); packet->Assign(3, make_intrusive<Val>(ts_to_double(${pkt.packet_ts}), TYPE_TIME));
packet->Assign(4, val_mgr->GetCount(${pkt.link_type})); packet->Assign(4, val_mgr->GetCount(${pkt.link_type}));
packet->Assign(5, bytestring_to_val(${pkt.packet_data})); packet->Assign(5, bytestring_to_val(${pkt.packet_data}));

View file

@ -32,9 +32,9 @@ using namespace file_analysis;
#define OCSP_STRING_BUF_SIZE 2048 #define OCSP_STRING_BUF_SIZE 2048
static Val* get_ocsp_type(RecordVal* args, const char* name) static IntrusivePtr<Val> get_ocsp_type(RecordVal* args, const char* name)
{ {
Val* rval = args->Lookup(name); auto rval = args->Lookup(name);
if ( ! rval ) if ( ! rval )
reporter->Error("File extraction analyzer missing arg field: %s", name); reporter->Error("File extraction analyzer missing arg field: %s", name);
@ -624,7 +624,7 @@ void file_analysis::OCSP::ParseResponse(OCSP_RESPONSE *resp)
//i2a_ASN1_OBJECT(bio, basic_resp->signature); //i2a_ASN1_OBJECT(bio, basic_resp->signature);
//len = BIO_read(bio, buf, sizeof(buf)); //len = BIO_read(bio, buf, sizeof(buf));
//ocsp_resp_record->Assign(7, new StringVal(len, buf)); //ocsp_resp_record->Assign(7, make_intrusive<StringVal>(len, buf));
//BIO_reset(bio); //BIO_reset(bio);
certs_vector = new VectorVal(internal_type("x509_opaque_vector")->AsVectorType()); certs_vector = new VectorVal(internal_type("x509_opaque_vector")->AsVectorType());
@ -644,7 +644,7 @@ void file_analysis::OCSP::ParseResponse(OCSP_RESPONSE *resp)
::X509 *this_cert = X509_dup(helper_sk_X509_value(certs, i)); ::X509 *this_cert = X509_dup(helper_sk_X509_value(certs, i));
//::X509 *this_cert = X509_dup(sk_X509_value(certs, i)); //::X509 *this_cert = X509_dup(sk_X509_value(certs, i));
if (this_cert) if (this_cert)
certs_vector->Assign(i, new file_analysis::X509Val(this_cert)); certs_vector->Assign(i, make_intrusive<file_analysis::X509Val>(this_cert));
else else
reporter->Weird("OpenSSL returned null certificate"); reporter->Weird("OpenSSL returned null certificate");
} }

View file

@ -51,7 +51,7 @@ bool file_analysis::X509::EndOfFile()
hash_final(ctx, buf); hash_final(ctx, buf);
std::string cert_sha256 = sha256_digest_print(buf); std::string cert_sha256 = sha256_digest_print(buf);
auto index = make_intrusive<StringVal>(cert_sha256); auto index = make_intrusive<StringVal>(cert_sha256);
auto* entry = certificate_cache->Lookup(index.get(), false); auto entry = certificate_cache->Lookup(index.get(), false);
if ( entry ) if ( entry )
// in this case, the certificate is in the cache and we do not // in this case, the certificate is in the cache and we do not
// do any further processing here. However, if there is a callback, we execute it. // do any further processing here. However, if there is a callback, we execute it.
@ -62,9 +62,9 @@ bool file_analysis::X509::EndOfFile()
val_list vl(3); val_list vl(3);
vl.push_back(GetFile()->GetVal()->Ref()); vl.push_back(GetFile()->GetVal()->Ref());
vl.push_back(entry->Ref()); vl.push_back(entry.release());
vl.push_back(new StringVal(cert_sha256)); vl.push_back(new StringVal(cert_sha256));
IntrusivePtr<Val> v{AdoptRef{}, cache_hit_callback->Call(&vl)}; cache_hit_callback->Call(&vl);
return false; return false;
} }
} }
@ -126,12 +126,12 @@ RecordVal* file_analysis::X509::ParseCertificate(X509Val* cert_val, File* f)
pX509Cert->Assign(0, val_mgr->GetCount((uint64_t) X509_get_version(ssl_cert) + 1)); pX509Cert->Assign(0, val_mgr->GetCount((uint64_t) X509_get_version(ssl_cert) + 1));
i2a_ASN1_INTEGER(bio, X509_get_serialNumber(ssl_cert)); i2a_ASN1_INTEGER(bio, X509_get_serialNumber(ssl_cert));
int len = BIO_read(bio, buf, sizeof(buf)); int len = BIO_read(bio, buf, sizeof(buf));
pX509Cert->Assign(1, new StringVal(len, buf)); pX509Cert->Assign(1, make_intrusive<StringVal>(len, buf));
BIO_reset(bio); BIO_reset(bio);
X509_NAME_print_ex(bio, X509_get_subject_name(ssl_cert), 0, XN_FLAG_RFC2253); X509_NAME_print_ex(bio, X509_get_subject_name(ssl_cert), 0, XN_FLAG_RFC2253);
len = BIO_gets(bio, buf, sizeof(buf)); len = BIO_gets(bio, buf, sizeof(buf));
pX509Cert->Assign(2, new StringVal(len, buf)); pX509Cert->Assign(2, make_intrusive<StringVal>(len, buf));
BIO_reset(bio); BIO_reset(bio);
X509_NAME *subject_name = X509_get_subject_name(ssl_cert); X509_NAME *subject_name = X509_get_subject_name(ssl_cert);
@ -151,17 +151,17 @@ RecordVal* file_analysis::X509::ParseCertificate(X509Val* cert_val, File* f)
// we found a common name // we found a common name
ASN1_STRING_print(bio, X509_NAME_ENTRY_get_data(X509_NAME_get_entry(subject_name, namepos))); ASN1_STRING_print(bio, X509_NAME_ENTRY_get_data(X509_NAME_get_entry(subject_name, namepos)));
len = BIO_gets(bio, buf, sizeof(buf)); len = BIO_gets(bio, buf, sizeof(buf));
pX509Cert->Assign(4, new StringVal(len, buf)); pX509Cert->Assign(4, make_intrusive<StringVal>(len, buf));
BIO_reset(bio); BIO_reset(bio);
} }
X509_NAME_print_ex(bio, X509_get_issuer_name(ssl_cert), 0, XN_FLAG_RFC2253); X509_NAME_print_ex(bio, X509_get_issuer_name(ssl_cert), 0, XN_FLAG_RFC2253);
len = BIO_gets(bio, buf, sizeof(buf)); len = BIO_gets(bio, buf, sizeof(buf));
pX509Cert->Assign(3, new StringVal(len, buf)); pX509Cert->Assign(3, make_intrusive<StringVal>(len, buf));
BIO_free(bio); BIO_free(bio);
pX509Cert->Assign(5, new Val(GetTimeFromAsn1(X509_get_notBefore(ssl_cert), f, reporter), TYPE_TIME)); pX509Cert->Assign(5, make_intrusive<Val>(GetTimeFromAsn1(X509_get_notBefore(ssl_cert), f, reporter), TYPE_TIME));
pX509Cert->Assign(6, new Val(GetTimeFromAsn1(X509_get_notAfter(ssl_cert), f, reporter), TYPE_TIME)); pX509Cert->Assign(6, make_intrusive<Val>(GetTimeFromAsn1(X509_get_notAfter(ssl_cert), f, reporter), TYPE_TIME));
// we only read 255 bytes because byte 256 is always 0. // we only read 255 bytes because byte 256 is always 0.
// if the string is longer than 255, that will be our null-termination, // if the string is longer than 255, that will be our null-termination,
@ -171,7 +171,7 @@ RecordVal* file_analysis::X509::ParseCertificate(X509Val* cert_val, File* f)
if ( ! i2t_ASN1_OBJECT(buf, 255, algorithm) ) if ( ! i2t_ASN1_OBJECT(buf, 255, algorithm) )
buf[0] = 0; buf[0] = 0;
pX509Cert->Assign(7, new StringVal(buf)); pX509Cert->Assign(7, make_intrusive<StringVal>(buf));
// Special case for RDP server certificates. For some reason some (all?) RDP server // Special case for RDP server certificates. For some reason some (all?) RDP server
// certificates like to specify their key algorithm as md5WithRSAEncryption, which // certificates like to specify their key algorithm as md5WithRSAEncryption, which
@ -193,25 +193,25 @@ RecordVal* file_analysis::X509::ParseCertificate(X509Val* cert_val, File* f)
if ( ! i2t_ASN1_OBJECT(buf, 255, OBJ_nid2obj(X509_get_signature_nid(ssl_cert))) ) if ( ! i2t_ASN1_OBJECT(buf, 255, OBJ_nid2obj(X509_get_signature_nid(ssl_cert))) )
buf[0] = 0; buf[0] = 0;
pX509Cert->Assign(8, new StringVal(buf)); pX509Cert->Assign(8, make_intrusive<StringVal>(buf));
// Things we can do when we have the key... // Things we can do when we have the key...
EVP_PKEY *pkey = X509_extract_key(ssl_cert); EVP_PKEY *pkey = X509_extract_key(ssl_cert);
if ( pkey != NULL ) if ( pkey != NULL )
{ {
if ( EVP_PKEY_base_id(pkey) == EVP_PKEY_DSA ) if ( EVP_PKEY_base_id(pkey) == EVP_PKEY_DSA )
pX509Cert->Assign(9, new StringVal("dsa")); pX509Cert->Assign(9, make_intrusive<StringVal>("dsa"));
else if ( EVP_PKEY_base_id(pkey) == EVP_PKEY_RSA ) else if ( EVP_PKEY_base_id(pkey) == EVP_PKEY_RSA )
{ {
pX509Cert->Assign(9, new StringVal("rsa")); pX509Cert->Assign(9, make_intrusive<StringVal>("rsa"));
const BIGNUM *e; const BIGNUM *e;
RSA_get0_key(EVP_PKEY_get0_RSA(pkey), NULL, &e, NULL); RSA_get0_key(EVP_PKEY_get0_RSA(pkey), NULL, &e, NULL);
char *exponent = BN_bn2dec(e); char *exponent = BN_bn2dec(e);
if ( exponent != NULL ) if ( exponent != NULL )
{ {
pX509Cert->Assign(11, new StringVal(exponent)); pX509Cert->Assign(11, make_intrusive<StringVal>(exponent));
OPENSSL_free(exponent); OPENSSL_free(exponent);
exponent = NULL; exponent = NULL;
} }
@ -219,7 +219,7 @@ RecordVal* file_analysis::X509::ParseCertificate(X509Val* cert_val, File* f)
#ifndef OPENSSL_NO_EC #ifndef OPENSSL_NO_EC
else if ( EVP_PKEY_base_id(pkey) == EVP_PKEY_EC ) else if ( EVP_PKEY_base_id(pkey) == EVP_PKEY_EC )
{ {
pX509Cert->Assign(9, new StringVal("ecdsa")); pX509Cert->Assign(9, make_intrusive<StringVal>("ecdsa"));
pX509Cert->Assign(12, KeyCurve(pkey)); pX509Cert->Assign(12, KeyCurve(pkey));
} }
#endif #endif
@ -401,10 +401,10 @@ void file_analysis::X509::ParseSAN(X509_EXTENSION* ext)
uint32_t* addr = (uint32_t*) gen->d.ip->data; uint32_t* addr = (uint32_t*) gen->d.ip->data;
if( gen->d.ip->length == 4 ) if( gen->d.ip->length == 4 )
ips->Assign(ips->Size(), new AddrVal(*addr)); ips->Assign(ips->Size(), make_intrusive<AddrVal>(*addr));
else if ( gen->d.ip->length == 16 ) else if ( gen->d.ip->length == 16 )
ips->Assign(ips->Size(), new AddrVal(addr)); ips->Assign(ips->Size(), make_intrusive<AddrVal>(addr));
else else
{ {
@ -545,9 +545,9 @@ X509Val::~X509Val()
X509_free(certificate); X509_free(certificate);
} }
Val* X509Val::DoClone(CloneState* state) IntrusivePtr<Val> X509Val::DoClone(CloneState* state)
{ {
auto copy = new X509Val(); auto copy = make_intrusive<X509Val>();
if ( certificate ) if ( certificate )
copy->certificate = X509_dup(certificate); copy->certificate = X509_dup(certificate);

View file

@ -169,7 +169,7 @@ public:
* *
* @return A cloned X509Val. * @return A cloned X509Val.
*/ */
Val* DoClone(CloneState* state) override; IntrusivePtr<Val> DoClone(CloneState* state) override;
/** /**
* Destructor. * Destructor.

View file

@ -263,12 +263,12 @@ void file_analysis::X509Common::ParseExtension(X509_EXTENSION* ex, const EventHa
ext_val = new StringVal(0, ""); ext_val = new StringVal(0, "");
RecordVal* pX509Ext = new RecordVal(BifType::Record::X509::Extension); RecordVal* pX509Ext = new RecordVal(BifType::Record::X509::Extension);
pX509Ext->Assign(0, new StringVal(name)); pX509Ext->Assign(0, make_intrusive<StringVal>(name));
if ( short_name and strlen(short_name) > 0 ) if ( short_name and strlen(short_name) > 0 )
pX509Ext->Assign(1, new StringVal(short_name)); pX509Ext->Assign(1, make_intrusive<StringVal>(short_name));
pX509Ext->Assign(2, new StringVal(oid)); pX509Ext->Assign(2, make_intrusive<StringVal>(oid));
pX509Ext->Assign(3, val_mgr->GetBool(critical)); pX509Ext->Assign(3, val_mgr->GetBool(critical));
pX509Ext->Assign(4, ext_val); pX509Ext->Assign(4, ext_val);

View file

@ -16,7 +16,7 @@ RecordVal* x509_result_record(uint64_t num, const char* reason, Val* chainVector
RecordVal* rrecord = new RecordVal(BifType::Record::X509::Result); RecordVal* rrecord = new RecordVal(BifType::Record::X509::Result);
rrecord->Assign(0, val_mgr->GetInt(num)); rrecord->Assign(0, val_mgr->GetInt(num));
rrecord->Assign(1, new StringVal(reason)); rrecord->Assign(1, make_intrusive<StringVal>(reason));
if ( chainVector ) if ( chainVector )
rrecord->Assign(2, chainVector); rrecord->Assign(2, chainVector);
@ -564,7 +564,7 @@ function x509_verify%(certs: x509_opaque_vector, root_certs: table_string_of_str
if ( currcert ) if ( currcert )
// X509Val takes ownership of currcert. // X509Val takes ownership of currcert.
chainVector->Assign(i, new file_analysis::X509Val(currcert)); chainVector->Assign(i, make_intrusive<file_analysis::X509Val>(currcert));
else else
{ {
reporter->InternalWarning("OpenSSL returned null certificate"); reporter->InternalWarning("OpenSSL returned null certificate");

View file

@ -42,10 +42,9 @@ function Files::__set_reassembly_buffer%(file_id: string, max: count%): bool
function Files::__add_analyzer%(file_id: string, tag: Files::Tag, args: any%): bool function Files::__add_analyzer%(file_id: string, tag: Files::Tag, args: any%): bool
%{ %{
using BifType::Record::Files::AnalyzerArgs; using BifType::Record::Files::AnalyzerArgs;
RecordVal* rv = args->AsRecordVal()->CoerceTo(AnalyzerArgs); auto rv = args->AsRecordVal()->CoerceTo(AnalyzerArgs);
bool result = file_mgr->AddAnalyzer(file_id->CheckString(), bool result = file_mgr->AddAnalyzer(file_id->CheckString(),
file_mgr->GetComponentTag(tag), rv); file_mgr->GetComponentTag(tag), rv.get());
Unref(rv);
return val_mgr->GetBool(result); return val_mgr->GetBool(result);
%} %}
@ -53,10 +52,9 @@ function Files::__add_analyzer%(file_id: string, tag: Files::Tag, args: any%): b
function Files::__remove_analyzer%(file_id: string, tag: Files::Tag, args: any%): bool function Files::__remove_analyzer%(file_id: string, tag: Files::Tag, args: any%): bool
%{ %{
using BifType::Record::Files::AnalyzerArgs; using BifType::Record::Files::AnalyzerArgs;
RecordVal* rv = args->AsRecordVal()->CoerceTo(AnalyzerArgs); auto rv = args->AsRecordVal()->CoerceTo(AnalyzerArgs);
bool result = file_mgr->RemoveAnalyzer(file_id->CheckString(), bool result = file_mgr->RemoveAnalyzer(file_id->CheckString(),
file_mgr->GetComponentTag(tag) , rv); file_mgr->GetComponentTag(tag) , rv.get());
Unref(rv);
return val_mgr->GetBool(result); return val_mgr->GetBool(result);
%} %}

View file

@ -88,17 +88,10 @@ Manager::Stream::Stream(StreamType t)
Manager::Stream::~Stream() Manager::Stream::~Stream()
{ {
if ( type )
Unref(type); Unref(type);
if ( description )
Unref(description); Unref(description);
if ( config )
Unref(config); Unref(config);
delete reader;
if ( reader )
delete(reader);
} }
class Manager::TableStream: public Manager::Stream { class Manager::TableStream: public Manager::Stream {
@ -239,9 +232,7 @@ bool Manager::CreateStream(Stream* info, RecordVal* description)
return false; return false;
} }
Val* name_val = description->Lookup("name", true); string name = description->Lookup("name", true)->AsString()->CheckString();
string name = name_val->AsString()->CheckString();
Unref(name_val);
Stream *i = FindStream(name); Stream *i = FindStream(name);
if ( i != 0 ) if ( i != 0 )
@ -251,20 +242,17 @@ bool Manager::CreateStream(Stream* info, RecordVal* description)
return false; return false;
} }
EnumVal* reader = description->Lookup("reader", true)->AsEnumVal(); auto reader = description->Lookup("reader", true);
// get the source ... // get the source ...
Val* sourceval = description->Lookup("source", true); const BroString* bsource = description->Lookup("source", true)->AsString();
assert ( sourceval != 0 );
const BroString* bsource = sourceval->AsString();
string source((const char*) bsource->Bytes(), bsource->Len()); string source((const char*) bsource->Bytes(), bsource->Len());
Unref(sourceval);
ReaderBackend::ReaderInfo rinfo; ReaderBackend::ReaderInfo rinfo;
rinfo.source = copy_string(source.c_str()); rinfo.source = copy_string(source.c_str());
rinfo.name = copy_string(name.c_str()); rinfo.name = copy_string(name.c_str());
EnumVal* mode = description->Lookup("mode", true)->AsEnumVal(); auto mode = description->Lookup("mode", true)->AsEnumVal();
switch ( mode->InternalInt() ) switch ( mode->InternalInt() )
{ {
case 0: case 0:
@ -281,14 +269,11 @@ bool Manager::CreateStream(Stream* info, RecordVal* description)
default: default:
reporter->InternalWarning("unknown input reader mode"); reporter->InternalWarning("unknown input reader mode");
Unref(mode);
return false; return false;
} }
Unref(mode); auto config = description->Lookup("config", true);
info->config = config.release()->AsTableVal();
Val* config = description->Lookup("config", true);
info->config = config->AsTableVal(); // ref'd by LookupWithDefault
{ {
// create config mapping in ReaderInfo. Has to be done before the construction of reader_obj. // create config mapping in ReaderInfo. Has to be done before the construction of reader_obj.
@ -305,15 +290,13 @@ bool Manager::CreateStream(Stream* info, RecordVal* description)
Unref(index); Unref(index);
delete k; delete k;
} }
} }
ReaderFrontend* reader_obj = new ReaderFrontend(rinfo, reader->AsEnumVal());
ReaderFrontend* reader_obj = new ReaderFrontend(rinfo, reader);
assert(reader_obj); assert(reader_obj);
info->reader = reader_obj; info->reader = reader_obj;
info->type = reader->AsEnumVal(); // ref'd by lookupwithdefault info->type = reader.release()->AsEnumVal();
info->name = name; info->name = name;
Ref(description); Ref(description);
@ -335,19 +318,14 @@ bool Manager::CreateEventStream(RecordVal* fval)
return false; return false;
} }
Val* name_val = fval->Lookup("name", true); string stream_name = fval->Lookup("name", true)->AsString()->CheckString();
string stream_name = name_val->AsString()->CheckString();
Unref(name_val);
Val* fields_val = fval->Lookup("fields", true); auto fields_val = fval->Lookup("fields", true);
RecordType* fields = fields_val->AsType()->AsTypeType()->Type()->AsRecordType(); RecordType* fields = fields_val->AsType()->AsTypeType()->Type()->AsRecordType();
Unref(fields_val);
Val *want_record = fval->Lookup("want_record", true); auto want_record = fval->Lookup("want_record", true);
Val* event_val = fval->Lookup("ev", true); Func* event = fval->Lookup("ev", true)->AsFunc();
Func* event = event_val->AsFunc();
Unref(event_val);
FuncType* etype = event->FType()->AsFuncType(); FuncType* etype = event->FType()->AsFuncType();
@ -435,9 +413,8 @@ bool Manager::CreateEventStream(RecordVal* fval)
else else
assert(false); assert(false);
Val* error_event_val = fval->Lookup("error_ev", true); auto error_event_val = fval->Lookup("error_ev", true);
Func* error_event = error_event_val ? error_event_val->AsFunc() : nullptr; Func* error_event = error_event_val ? error_event_val->AsFunc() : nullptr;
Unref(error_event_val);
if ( ! CheckErrorEventTypes(stream_name, error_event, false) ) if ( ! CheckErrorEventTypes(stream_name, error_event, false) )
return false; return false;
@ -467,13 +444,11 @@ bool Manager::CreateEventStream(RecordVal* fval)
for ( unsigned int i = 0; i < fieldsV.size(); i++ ) for ( unsigned int i = 0; i < fieldsV.size(); i++ )
logf[i] = fieldsV[i]; logf[i] = fieldsV[i];
Unref(fields); // ref'd by lookupwithdefault
stream->num_fields = fieldsV.size(); stream->num_fields = fieldsV.size();
stream->fields = fields->Ref()->AsRecordType(); stream->fields = fields->Ref()->AsRecordType();
stream->event = event_registry->Lookup(event->Name()); stream->event = event_registry->Lookup(event->Name());
stream->error_event = error_event ? event_registry->Lookup(error_event->Name()) : nullptr; stream->error_event = error_event ? event_registry->Lookup(error_event->Name()) : nullptr;
stream->want_record = ( want_record->InternalInt() == 1 ); stream->want_record = ( want_record->InternalInt() == 1 );
Unref(want_record); // ref'd by lookupwithdefault
assert(stream->reader); assert(stream->reader);
@ -496,26 +471,19 @@ bool Manager::CreateTableStream(RecordVal* fval)
return false; return false;
} }
Val* name_val = fval->Lookup("name", true); string stream_name = fval->Lookup("name", true)->AsString()->CheckString();
string stream_name = name_val->AsString()->CheckString();
Unref(name_val);
Val* pred = fval->Lookup("pred", true); auto pred = fval->Lookup("pred", true);
auto idx_val = fval->Lookup("idx", true);
Val* idx_val = fval->Lookup("idx", true);
RecordType* idx = idx_val->AsType()->AsTypeType()->Type()->AsRecordType(); RecordType* idx = idx_val->AsType()->AsTypeType()->Type()->AsRecordType();
Unref(idx_val);
RecordType *val = 0; IntrusivePtr<RecordType> val;
auto val_val = fval->Lookup("val", true);
Val* val_val = fval->Lookup("val", true);
if ( val_val ) if ( val_val )
{ val = {NewRef{}, val_val->AsType()->AsTypeType()->Type()->AsRecordType()};
val = val_val->AsType()->AsTypeType()->Type()->AsRecordType();
Unref(val_val);
}
TableVal *dst = fval->Lookup("destination", true)->AsTableVal(); auto dst = fval->Lookup("destination", true);
// check if index fields match table description // check if index fields match table description
int num = idx->NumFields(); int num = idx->NumFields();
@ -550,12 +518,12 @@ bool Manager::CreateTableStream(RecordVal* fval)
return false; return false;
} }
Val *want_record = fval->Lookup("want_record", true); auto want_record = fval->Lookup("want_record", true);
if ( val ) if ( val )
{ {
const BroType* table_yield = dst->Type()->AsTableType()->YieldType(); const BroType* table_yield = dst->Type()->AsTableType()->YieldType();
const BroType* compare_type = val; const BroType* compare_type = val.get();
if ( want_record->InternalInt() == 0 ) if ( want_record->InternalInt() == 0 )
compare_type = val->FieldType(0); compare_type = val->FieldType(0);
@ -583,9 +551,8 @@ bool Manager::CreateTableStream(RecordVal* fval)
} }
} }
Val* event_val = fval->Lookup("ev", true); auto event_val = fval->Lookup("ev", true);
Func* event = event_val ? event_val->AsFunc() : 0; Func* event = event_val ? event_val->AsFunc() : 0;
Unref(event_val);
if ( event ) if ( event )
{ {
@ -628,7 +595,7 @@ bool Manager::CreateTableStream(RecordVal* fval)
return false; return false;
} }
if ( want_record->InternalInt() == 1 && val && ! same_type((*args)[3], val) ) if ( want_record->InternalInt() == 1 && val && ! same_type((*args)[3], val.get()) )
{ {
ODesc desc1; ODesc desc1;
ODesc desc2; ODesc desc2;
@ -657,9 +624,8 @@ bool Manager::CreateTableStream(RecordVal* fval)
assert(want_record->InternalInt() == 1 || want_record->InternalInt() == 0); assert(want_record->InternalInt() == 1 || want_record->InternalInt() == 0);
} }
Val* error_event_val = fval->Lookup("error_ev", true); auto error_event_val = fval->Lookup("error_ev", true);
Func* error_event = error_event_val ? error_event_val->AsFunc() : nullptr; Func* error_event = error_event_val ? error_event_val->AsFunc() : nullptr;
Unref(error_event_val);
if ( ! CheckErrorEventTypes(stream_name, error_event, true) ) if ( ! CheckErrorEventTypes(stream_name, error_event, true) )
return false; return false;
@ -671,7 +637,7 @@ bool Manager::CreateTableStream(RecordVal* fval)
int idxfields = fieldsV.size(); int idxfields = fieldsV.size();
if ( val ) // if we are not a set if ( val ) // if we are not a set
status = status || ! UnrollRecordType(&fieldsV, val, "", BifConst::Input::accept_unsupported_types); status = status || ! UnrollRecordType(&fieldsV, val.get(), "", BifConst::Input::accept_unsupported_types);
int valfields = fieldsV.size() - idxfields; int valfields = fieldsV.size() - idxfields;
@ -710,9 +676,9 @@ bool Manager::CreateTableStream(RecordVal* fval)
stream->pred = pred ? pred->AsFunc() : 0; stream->pred = pred ? pred->AsFunc() : 0;
stream->num_idx_fields = idxfields; stream->num_idx_fields = idxfields;
stream->num_val_fields = valfields; stream->num_val_fields = valfields;
stream->tab = dst->AsTableVal(); // ref'd by lookupwithdefault stream->tab = dst.release()->AsTableVal();
stream->rtype = val ? val->AsRecordType() : 0; stream->rtype = val.release();
stream->itype = idx->AsRecordType(); stream->itype = idx->Ref()->AsRecordType();
stream->event = event ? event_registry->Lookup(event->Name()) : 0; stream->event = event ? event_registry->Lookup(event->Name()) : 0;
stream->error_event = error_event ? event_registry->Lookup(error_event->Name()) : nullptr; stream->error_event = error_event ? event_registry->Lookup(error_event->Name()) : nullptr;
stream->currDict = new PDict<InputHash>; stream->currDict = new PDict<InputHash>;
@ -721,9 +687,6 @@ bool Manager::CreateTableStream(RecordVal* fval)
stream->lastDict->SetDeleteFunc(input_hash_delete_func); stream->lastDict->SetDeleteFunc(input_hash_delete_func);
stream->want_record = ( want_record->InternalInt() == 1 ); stream->want_record = ( want_record->InternalInt() == 1 );
Unref(want_record); // ref'd by lookupwithdefault
Unref(pred);
assert(stream->reader); assert(stream->reader);
stream->reader->Init(fieldsV.size(), fields ); stream->reader->Init(fieldsV.size(), fields );
@ -1035,7 +998,7 @@ bool Manager::ForceUpdate(const string &name)
Val* Manager::RecordValToIndexVal(RecordVal *r) const Val* Manager::RecordValToIndexVal(RecordVal *r) const
{ {
Val* idxval; IntrusivePtr<Val> idxval;
RecordType *type = r->Type()->AsRecordType(); RecordType *type = r->Type()->AsRecordType();
@ -1046,15 +1009,15 @@ Val* Manager::RecordValToIndexVal(RecordVal *r) const
else else
{ {
ListVal *l = new ListVal(TYPE_ANY); auto l = make_intrusive<ListVal>(TYPE_ANY);
for ( int j = 0 ; j < num_fields; j++ ) for ( int j = 0 ; j < num_fields; j++ )
l->Append(r->LookupWithDefault(j)); l->Append(r->LookupWithDefault(j).release());
idxval = l; idxval = std::move(l);
} }
return idxval; return idxval.release();
} }
@ -1109,7 +1072,7 @@ void Manager::SendEntry(ReaderFrontend* reader, Value* *vals)
else if ( i->stream_type == EVENT_STREAM ) else if ( i->stream_type == EVENT_STREAM )
{ {
EnumVal *type = BifType::Enum::Input::Event->GetVal(BifEnum::Input::EVENT_NEW); EnumVal* type = BifType::Enum::Input::Event->GetVal(BifEnum::Input::EVENT_NEW).release();
readFields = SendEventStreamEvent(i, type, vals); readFields = SendEventStreamEvent(i, type, vals);
} }
@ -1215,9 +1178,9 @@ int Manager::SendEntryTable(Stream* i, const Value* const *vals)
if ( ! pred_convert_error ) if ( ! pred_convert_error )
{ {
if ( updated ) if ( updated )
ev = BifType::Enum::Input::Event->GetVal(BifEnum::Input::EVENT_CHANGED); ev = BifType::Enum::Input::Event->GetVal(BifEnum::Input::EVENT_CHANGED).release();
else else
ev = BifType::Enum::Input::Event->GetVal(BifEnum::Input::EVENT_NEW); ev = BifType::Enum::Input::Event->GetVal(BifEnum::Input::EVENT_NEW).release();
bool result; bool result;
if ( stream->num_val_fields > 0 ) // we have values if ( stream->num_val_fields > 0 ) // we have values
@ -1275,7 +1238,7 @@ int Manager::SendEntryTable(Stream* i, const Value* const *vals)
assert(idxval); assert(idxval);
Val* oldval = 0; IntrusivePtr<Val> oldval;
if ( updated == true ) if ( updated == true )
{ {
assert(stream->num_val_fields > 0); assert(stream->num_val_fields > 0);
@ -1291,9 +1254,6 @@ int Manager::SendEntryTable(Stream* i, const Value* const *vals)
ih->idxkey = new HashKey(k->Key(), k->Size(), k->Hash()); ih->idxkey = new HashKey(k->Key(), k->Size(), k->Hash());
ih->valhash = valhash; ih->valhash = valhash;
if ( oldval && stream->event && updated )
Ref(oldval); // otherwise it is no longer accessible after the assignment
stream->tab->Assign(idxval, k, valval); stream->tab->Assign(idxval, k, valval);
Unref(idxval); // asssign does not consume idxval. Unref(idxval); // asssign does not consume idxval.
@ -1319,13 +1279,13 @@ int Manager::SendEntryTable(Stream* i, const Value* const *vals)
else if ( updated ) else if ( updated )
{ // in case of update send back the old value. { // in case of update send back the old value.
assert ( stream->num_val_fields > 0 ); assert ( stream->num_val_fields > 0 );
ev = BifType::Enum::Input::Event->GetVal(BifEnum::Input::EVENT_CHANGED); ev = BifType::Enum::Input::Event->GetVal(BifEnum::Input::EVENT_CHANGED).release();
assert ( oldval != 0 ); assert ( oldval != 0 );
SendEvent(stream->event, 4, stream->description->Ref(), ev, predidx, oldval); SendEvent(stream->event, 4, stream->description->Ref(), ev, predidx, oldval.release());
} }
else else
{ {
ev = BifType::Enum::Input::Event->GetVal(BifEnum::Input::EVENT_NEW); ev = BifType::Enum::Input::Event->GetVal(BifEnum::Input::EVENT_NEW).release();
if ( stream->num_val_fields == 0 ) if ( stream->num_val_fields == 0 )
{ {
Ref(stream->description); Ref(stream->description);
@ -1376,7 +1336,7 @@ void Manager::EndCurrentSend(ReaderFrontend* reader)
while ( ( ih = stream->lastDict->NextEntry(lastDictIdxKey, c) ) ) while ( ( ih = stream->lastDict->NextEntry(lastDictIdxKey, c) ) )
{ {
ListVal * idx = 0; ListVal * idx = 0;
Val *val = 0; IntrusivePtr<Val> val;
Val* predidx = 0; Val* predidx = 0;
EnumVal* ev = 0; EnumVal* ev = 0;
@ -1390,7 +1350,7 @@ void Manager::EndCurrentSend(ReaderFrontend* reader)
assert(val != 0); assert(val != 0);
predidx = ListValToRecordVal(idx, stream->itype, &startpos); predidx = ListValToRecordVal(idx, stream->itype, &startpos);
Unref(idx); Unref(idx);
ev = BifType::Enum::Input::Event->GetVal(BifEnum::Input::EVENT_REMOVED); ev = BifType::Enum::Input::Event->GetVal(BifEnum::Input::EVENT_REMOVED).release();
} }
if ( stream->pred ) if ( stream->pred )
@ -1399,9 +1359,8 @@ void Manager::EndCurrentSend(ReaderFrontend* reader)
Ref(ev); Ref(ev);
Ref(predidx); Ref(predidx);
Ref(val);
bool result = CallPred(stream->pred, 3, ev, predidx, val); bool result = CallPred(stream->pred, 3, ev, predidx, IntrusivePtr{val}.release());
if ( result == false ) if ( result == false )
{ {
@ -1418,9 +1377,8 @@ void Manager::EndCurrentSend(ReaderFrontend* reader)
if ( stream->event ) if ( stream->event )
{ {
Ref(predidx); Ref(predidx);
Ref(val);
Ref(ev); Ref(ev);
SendEvent(stream->event, 4, stream->description->Ref(), ev, predidx, val); SendEvent(stream->event, 4, stream->description->Ref(), ev, predidx, IntrusivePtr{val}.release());
} }
if ( predidx ) // if we have a stream or an event... if ( predidx ) // if we have a stream or an event...
@ -1429,7 +1387,7 @@ void Manager::EndCurrentSend(ReaderFrontend* reader)
if ( ev ) if ( ev )
Unref(ev); Unref(ev);
Unref(stream->tab->Delete(ih->idxkey)); stream->tab->Delete(ih->idxkey);
stream->lastDict->Remove(lastDictIdxKey); // delete in next line stream->lastDict->Remove(lastDictIdxKey); // delete in next line
delete lastDictIdxKey; delete lastDictIdxKey;
delete(ih); delete(ih);
@ -1499,7 +1457,7 @@ void Manager::Put(ReaderFrontend* reader, Value* *vals)
else if ( i->stream_type == EVENT_STREAM ) else if ( i->stream_type == EVENT_STREAM )
{ {
EnumVal *type = BifType::Enum::Input::Event->GetVal(BifEnum::Input::EVENT_NEW); EnumVal* type = BifType::Enum::Input::Event->GetVal(BifEnum::Input::EVENT_NEW).release();
readFields = SendEventStreamEvent(i, type, vals); readFields = SendEventStreamEvent(i, type, vals);
} }
@ -1608,7 +1566,7 @@ int Manager::PutTable(Stream* i, const Value* const *vals)
if ( stream->pred || stream->event ) if ( stream->pred || stream->event )
{ {
bool updated = false; bool updated = false;
Val* oldval = 0; IntrusivePtr<Val> oldval;
if ( stream->num_val_fields > 0 ) if ( stream->num_val_fields > 0 )
{ {
@ -1620,7 +1578,6 @@ int Manager::PutTable(Stream* i, const Value* const *vals)
{ {
// it is an update // it is an update
updated = true; updated = true;
Ref(oldval); // have to do that, otherwise it may disappear in assign
} }
@ -1637,9 +1594,9 @@ int Manager::PutTable(Stream* i, const Value* const *vals)
else else
{ {
if ( updated ) if ( updated )
ev = BifType::Enum::Input::Event->GetVal(BifEnum::Input::EVENT_CHANGED); ev = BifType::Enum::Input::Event->GetVal(BifEnum::Input::EVENT_CHANGED).release();
else else
ev = BifType::Enum::Input::Event->GetVal(BifEnum::Input::EVENT_NEW); ev = BifType::Enum::Input::Event->GetVal(BifEnum::Input::EVENT_NEW).release();
bool result; bool result;
if ( stream->num_val_fields > 0 ) // we have values if ( stream->num_val_fields > 0 ) // we have values
@ -1655,7 +1612,6 @@ int Manager::PutTable(Stream* i, const Value* const *vals)
// do nothing // do nothing
Unref(idxval); Unref(idxval);
Unref(valval); Unref(valval);
Unref(oldval);
return stream->num_val_fields + stream->num_idx_fields; return stream->num_val_fields + stream->num_idx_fields;
} }
} }
@ -1679,14 +1635,14 @@ int Manager::PutTable(Stream* i, const Value* const *vals)
{ {
// in case of update send back the old value. // in case of update send back the old value.
assert ( stream->num_val_fields > 0 ); assert ( stream->num_val_fields > 0 );
ev = BifType::Enum::Input::Event->GetVal(BifEnum::Input::EVENT_CHANGED); ev = BifType::Enum::Input::Event->GetVal(BifEnum::Input::EVENT_CHANGED).release();
assert ( oldval != 0 ); assert ( oldval != 0 );
SendEvent(stream->event, 4, stream->description->Ref(), SendEvent(stream->event, 4, stream->description->Ref(),
ev, predidx, oldval); ev, predidx, oldval.release());
} }
else else
{ {
ev = BifType::Enum::Input::Event->GetVal(BifEnum::Input::EVENT_NEW); ev = BifType::Enum::Input::Event->GetVal(BifEnum::Input::EVENT_NEW).release();
if ( stream->num_val_fields == 0 ) if ( stream->num_val_fields == 0 )
SendEvent(stream->event, 4, stream->description->Ref(), SendEvent(stream->event, 4, stream->description->Ref(),
ev, predidx); ev, predidx);
@ -1760,7 +1716,7 @@ bool Manager::Delete(ReaderFrontend* reader, Value* *vals)
if ( stream->pred || stream->event ) if ( stream->pred || stream->event )
{ {
Val *val = stream->tab->Lookup(idxval); auto val = stream->tab->Lookup(idxval);
if ( stream->pred ) if ( stream->pred )
{ {
@ -1771,10 +1727,9 @@ bool Manager::Delete(ReaderFrontend* reader, Value* *vals)
Unref(predidx); Unref(predidx);
else else
{ {
Ref(val); EnumVal* ev = BifType::Enum::Input::Event->GetVal(BifEnum::Input::EVENT_REMOVED).release();
EnumVal *ev = BifType::Enum::Input::Event->GetVal(BifEnum::Input::EVENT_REMOVED);
streamresult = CallPred(stream->pred, 3, ev, predidx, val); streamresult = CallPred(stream->pred, 3, ev, predidx, IntrusivePtr{val}.release());
if ( streamresult == false ) if ( streamresult == false )
{ {
@ -1791,28 +1746,22 @@ bool Manager::Delete(ReaderFrontend* reader, Value* *vals)
{ {
Ref(idxval); Ref(idxval);
assert(val != 0); assert(val != 0);
Ref(val); EnumVal* ev = BifType::Enum::Input::Event->GetVal(BifEnum::Input::EVENT_REMOVED).release();
EnumVal *ev = BifType::Enum::Input::Event->GetVal(BifEnum::Input::EVENT_REMOVED); SendEvent(stream->event, 4, stream->description->Ref(), ev, idxval, IntrusivePtr{val}.release());
SendEvent(stream->event, 4, stream->description->Ref(), ev, idxval, val);
} }
} }
// only if stream = true -> no streaming // only if stream = true -> no streaming
if ( streamresult ) if ( streamresult )
{ {
Val* retptr = stream->tab->Delete(idxval); if ( ! stream->tab->Delete(idxval) )
success = ( retptr != 0 );
if ( ! success )
Warning(i, "Internal error while deleting values from input table"); Warning(i, "Internal error while deleting values from input table");
else
Unref(retptr);
} }
} }
else if ( i->stream_type == EVENT_STREAM ) else if ( i->stream_type == EVENT_STREAM )
{ {
EnumVal *type = BifType::Enum::Input::Event->GetVal(BifEnum::Input::EVENT_REMOVED); EnumVal* type = BifType::Enum::Input::Event->GetVal(BifEnum::Input::EVENT_REMOVED).release();
readVals = SendEventStreamEvent(i, type, vals); readVals = SendEventStreamEvent(i, type, vals);
success = true; success = true;
} }
@ -1845,12 +1794,9 @@ bool Manager::CallPred(Func* pred_func, const int numvals, ...) const
va_end(lP); va_end(lP);
Val* v = pred_func->Call(&vl); auto v = pred_func->Call(&vl);
if ( v ) if ( v )
{
result = v->AsBool(); result = v->AsBool();
Unref(v);
}
return result; return result;
} }
@ -2390,10 +2336,10 @@ Val* Manager::ValueToVal(const Stream* i, const Value* val, BroType* request_typ
{ {
// all entries have to have the same type... // all entries have to have the same type...
BroType* type = request_type->AsTableType()->Indices()->PureType(); BroType* type = request_type->AsTableType()->Indices()->PureType();
TypeList* set_index = new TypeList(type->Ref()); auto set_index = make_intrusive<TypeList>(IntrusivePtr{NewRef{}, type});
set_index->Append(type->Ref()); set_index->Append({NewRef{}, type});
SetType* s = new SetType(set_index, 0); auto s = make_intrusive<SetType>(std::move(set_index), nullptr);
TableVal* t = new TableVal(s); TableVal* t = new TableVal(std::move(s));
for ( int j = 0; j < val->val.set_val.size; j++ ) for ( int j = 0; j < val->val.set_val.size; j++ )
{ {
Val* assignval = ValueToVal(i, val->val.set_val.vals[j], type, have_error); Val* assignval = ValueToVal(i, val->val.set_val.vals[j], type, have_error);
@ -2402,7 +2348,6 @@ Val* Manager::ValueToVal(const Stream* i, const Value* val, BroType* request_typ
Unref(assignval); // index is not consumed by assign. Unref(assignval); // index is not consumed by assign.
} }
Unref(s);
return t; return t;
} }
@ -2410,7 +2355,7 @@ Val* Manager::ValueToVal(const Stream* i, const Value* val, BroType* request_typ
{ {
// all entries have to have the same type... // all entries have to have the same type...
BroType* type = request_type->AsVectorType()->YieldType(); BroType* type = request_type->AsVectorType()->YieldType();
VectorType* vt = new VectorType(type->Ref()); VectorType* vt = new VectorType({NewRef{}, type});
VectorVal* v = new VectorVal(vt); VectorVal* v = new VectorVal(vt);
for ( int j = 0; j < val->val.vector_val.size; j++ ) for ( int j = 0; j < val->val.vector_val.size; j++ )
{ {
@ -2442,7 +2387,7 @@ Val* Manager::ValueToVal(const Stream* i, const Value* val, BroType* request_typ
return nullptr; return nullptr;
} }
return request_type->Ref()->AsEnumType()->GetVal(index); return request_type->AsEnumType()->GetVal(index).release();
} }
default: default:
@ -2537,10 +2482,10 @@ Val* Manager::ValueToVal(const Stream* i, const Value* val, bool& have_error) co
case TYPE_TABLE: case TYPE_TABLE:
{ {
TypeList* set_index; IntrusivePtr<TypeList> set_index;
if ( val->val.set_val.size == 0 && val->subtype == TYPE_VOID ) if ( val->val.set_val.size == 0 && val->subtype == TYPE_VOID )
// don't know type - unspecified table. // don't know type - unspecified table.
set_index = new TypeList(); set_index = make_intrusive<TypeList>();
else else
{ {
// all entries have to have the same type... // all entries have to have the same type...
@ -2548,7 +2493,7 @@ Val* Manager::ValueToVal(const Stream* i, const Value* val, bool& have_error) co
if ( stag == TYPE_VOID ) if ( stag == TYPE_VOID )
TypeTag stag = val->val.set_val.vals[0]->type; TypeTag stag = val->val.set_val.vals[0]->type;
BroType* index_type; IntrusivePtr<BroType> index_type;
if ( stag == TYPE_ENUM ) if ( stag == TYPE_ENUM )
{ {
@ -2566,17 +2511,17 @@ Val* Manager::ValueToVal(const Stream* i, const Value* val, bool& have_error) co
return nullptr; return nullptr;
} }
index_type = enum_id->Type()->AsEnumType(); index_type = {NewRef{}, enum_id->Type()->AsEnumType()};
} }
else else
index_type = base_type_no_ref(stag); index_type = base_type(stag);
set_index = new TypeList(index_type); set_index = make_intrusive<TypeList>(index_type);
set_index->Append(index_type->Ref()); set_index->Append(std::move(index_type));
} }
SetType* s = new SetType(set_index, 0); auto s = make_intrusive<SetType>(std::move(set_index), nullptr);
TableVal* t = new TableVal(s); TableVal* t = new TableVal(std::move(s));
for ( int j = 0; j < val->val.set_val.size; j++ ) for ( int j = 0; j < val->val.set_val.size; j++ )
{ {
Val* assignval = ValueToVal(i, val->val.set_val.vals[j], have_error); Val* assignval = ValueToVal(i, val->val.set_val.vals[j], have_error);
@ -2585,13 +2530,13 @@ Val* Manager::ValueToVal(const Stream* i, const Value* val, bool& have_error) co
Unref(assignval); // index is not consumed by assign. Unref(assignval); // index is not consumed by assign.
} }
Unref(s);
return t; return t;
} }
case TYPE_VECTOR: case TYPE_VECTOR:
{ {
BroType* type; IntrusivePtr<BroType> type;
if ( val->val.vector_val.size == 0 && val->subtype == TYPE_VOID ) if ( val->val.vector_val.size == 0 && val->subtype == TYPE_VOID )
// don't know type - unspecified table. // don't know type - unspecified table.
type = base_type(TYPE_ANY); type = base_type(TYPE_ANY);
@ -2604,14 +2549,12 @@ Val* Manager::ValueToVal(const Stream* i, const Value* val, bool& have_error) co
type = base_type(val->subtype); type = base_type(val->subtype);
} }
VectorType* vt = new VectorType(type->Ref()); auto vt = make_intrusive<VectorType>(std::move(type));
VectorVal* v = new VectorVal(vt); VectorVal* v = new VectorVal(vt.get());
for ( int j = 0; j < val->val.vector_val.size; j++ )
{ for ( int j = 0; j < val->val.vector_val.size; j++ )
v->Assign(j, ValueToVal(i, val->val.vector_val.vals[j], have_error)); v->Assign(j, ValueToVal(i, val->val.vector_val.vals[j], have_error));
}
Unref(vt);
return v; return v;
} }
@ -2642,7 +2585,7 @@ Val* Manager::ValueToVal(const Stream* i, const Value* val, bool& have_error) co
return nullptr; return nullptr;
} }
return t->GetVal(intval); return t->GetVal(intval).release();
} }
default: default:
@ -2774,15 +2717,15 @@ void Manager::ErrorHandler(const Stream* i, ErrorType et, bool reporter_send, co
switch (et) switch (et)
{ {
case ErrorType::INFO: case ErrorType::INFO:
ev = BifType::Enum::Reporter::Level->GetVal(BifEnum::Reporter::INFO); ev = BifType::Enum::Reporter::Level->GetVal(BifEnum::Reporter::INFO).release();
break; break;
case ErrorType::WARNING: case ErrorType::WARNING:
ev = BifType::Enum::Reporter::Level->GetVal(BifEnum::Reporter::WARNING); ev = BifType::Enum::Reporter::Level->GetVal(BifEnum::Reporter::WARNING).release();
break; break;
case ErrorType::ERROR: case ErrorType::ERROR:
ev = BifType::Enum::Reporter::Level->GetVal(BifEnum::Reporter::ERROR); ev = BifType::Enum::Reporter::Level->GetVal(BifEnum::Reporter::ERROR).release();
break; break;
default: default:

View file

@ -31,7 +31,7 @@ Config::Config(ReaderFrontend *frontend) : ReaderBackend(frontend)
for ( const auto& entry : globals ) for ( const auto& entry : globals )
{ {
ID* id = entry.second; ID* id = entry.second.get();
if ( ! id->IsOption() ) if ( ! id->IsOption() )
continue; continue;

View file

@ -11,6 +11,7 @@
#include "Type.h" #include "Type.h"
#include "File.h" #include "File.h"
#include "input.h" #include "input.h"
#include "IntrusivePtr.h"
#include "broker/Manager.h" #include "broker/Manager.h"
#include "threading/Manager.h" #include "threading/Manager.h"
@ -262,7 +263,7 @@ bool Manager::CreateStream(EnumVal* id, RecordVal* sval)
return false; return false;
} }
Val* event_val = sval->Lookup("ev"); auto event_val = sval->Lookup("ev");
Func* event = event_val ? event_val->AsFunc() : 0; Func* event = event_val ? event_val->AsFunc() : 0;
if ( event ) if ( event )
@ -476,7 +477,7 @@ bool Manager::TraverseRecord(Stream* stream, Filter* filter, RecordType* rt,
if ( include ) if ( include )
{ {
StringVal* new_path_val = new StringVal(new_path.c_str()); StringVal* new_path_val = new StringVal(new_path.c_str());
bool result = include->Lookup(new_path_val); bool result = (bool)include->Lookup(new_path_val);
Unref(new_path_val); Unref(new_path_val);
@ -488,7 +489,7 @@ bool Manager::TraverseRecord(Stream* stream, Filter* filter, RecordType* rt,
if ( exclude ) if ( exclude )
{ {
StringVal* new_path_val = new StringVal(new_path.c_str()); StringVal* new_path_val = new StringVal(new_path.c_str());
bool result = exclude->Lookup(new_path_val); bool result = (bool)exclude->Lookup(new_path_val);
Unref(new_path_val); Unref(new_path_val);
@ -547,18 +548,18 @@ bool Manager::AddFilter(EnumVal* id, RecordVal* fval)
// Create a new Filter instance. // Create a new Filter instance.
Val* name = fval->Lookup("name", true); auto name = fval->Lookup("name", true);
Val* pred = fval->Lookup("pred", true); auto pred = fval->Lookup("pred", true);
Val* path_func = fval->Lookup("path_func", true); auto path_func = fval->Lookup("path_func", true);
Val* log_local = fval->Lookup("log_local", true); auto log_local = fval->Lookup("log_local", true);
Val* log_remote = fval->Lookup("log_remote", true); auto log_remote = fval->Lookup("log_remote", true);
Val* interv = fval->Lookup("interv", true); auto interv = fval->Lookup("interv", true);
Val* postprocessor = fval->Lookup("postprocessor", true); auto postprocessor = fval->Lookup("postprocessor", true);
Val* config = fval->Lookup("config", true); auto config = fval->Lookup("config", true);
Val* field_name_map = fval->Lookup("field_name_map", true); auto field_name_map = fval->Lookup("field_name_map", true);
Val* scope_sep = fval->Lookup("scope_sep", true); auto scope_sep = fval->Lookup("scope_sep", true);
Val* ext_prefix = fval->Lookup("ext_prefix", true); auto ext_prefix = fval->Lookup("ext_prefix", true);
Val* ext_func = fval->Lookup("ext_func", true); auto ext_func = fval->Lookup("ext_func", true);
Filter* filter = new Filter; Filter* filter = new Filter;
filter->fval = fval->Ref(); filter->fval = fval->Ref();
@ -577,23 +578,10 @@ bool Manager::AddFilter(EnumVal* id, RecordVal* fval)
filter->ext_prefix = ext_prefix->AsString()->CheckString(); filter->ext_prefix = ext_prefix->AsString()->CheckString();
filter->ext_func = ext_func ? ext_func->AsFunc() : 0; filter->ext_func = ext_func ? ext_func->AsFunc() : 0;
Unref(name);
Unref(pred);
Unref(path_func);
Unref(log_local);
Unref(log_remote);
Unref(interv);
Unref(postprocessor);
Unref(config);
Unref(field_name_map);
Unref(scope_sep);
Unref(ext_prefix);
Unref(ext_func);
// Build the list of fields that the filter wants included, including // Build the list of fields that the filter wants included, including
// potentially rolling out fields. // potentially rolling out fields.
Val* include = fval->Lookup("include"); auto include = fval->Lookup("include");
Val* exclude = fval->Lookup("exclude"); auto exclude = fval->Lookup("exclude");
filter->num_ext_fields = 0; filter->num_ext_fields = 0;
if ( filter->ext_func ) if ( filter->ext_func )
@ -618,8 +606,8 @@ bool Manager::AddFilter(EnumVal* id, RecordVal* fval)
filter->num_fields = 0; filter->num_fields = 0;
filter->fields = 0; filter->fields = 0;
if ( ! TraverseRecord(stream, filter, stream->columns, if ( ! TraverseRecord(stream, filter, stream->columns,
include ? include->AsTableVal() : 0, include ? include->AsTableVal() : nullptr,
exclude ? exclude->AsTableVal() : 0, exclude ? exclude->AsTableVal() : nullptr,
"", list<int>()) ) "", list<int>()) )
{ {
delete filter; delete filter;
@ -627,12 +615,12 @@ bool Manager::AddFilter(EnumVal* id, RecordVal* fval)
} }
// Get the path for the filter. // Get the path for the filter.
Val* path_val = fval->Lookup("path"); auto path_val = fval->Lookup("path");
if ( path_val ) if ( path_val )
{ {
filter->path = path_val->AsString()->CheckString(); filter->path = path_val->AsString()->CheckString();
filter->path_val = path_val->Ref(); filter->path_val = path_val.release();
} }
else else
@ -703,7 +691,7 @@ bool Manager::RemoveFilter(EnumVal* id, const string& name)
return true; return true;
} }
bool Manager::Write(EnumVal* id, RecordVal* columns) bool Manager::Write(EnumVal* id, RecordVal* columns_arg)
{ {
Stream* stream = FindStream(id); Stream* stream = FindStream(id);
if ( ! stream ) if ( ! stream )
@ -712,7 +700,7 @@ bool Manager::Write(EnumVal* id, RecordVal* columns)
if ( ! stream->enabled ) if ( ! stream->enabled )
return true; return true;
columns = columns->CoerceTo(stream->columns); auto columns = columns_arg->CoerceTo(stream->columns);
if ( ! columns ) if ( ! columns )
{ {
@ -739,12 +727,9 @@ bool Manager::Write(EnumVal* id, RecordVal* columns)
int result = 1; int result = 1;
Val* v = filter->pred->Call(&vl); auto v = filter->pred->Call(&vl);
if ( v ) if ( v )
{
result = v->AsBool(); result = v->AsBool();
Unref(v);
}
if ( ! result ) if ( ! result )
continue; continue;
@ -762,20 +747,13 @@ bool Manager::Write(EnumVal* id, RecordVal* columns)
BroType* rt = filter->path_func->FType()->Args()->FieldType("rec"); BroType* rt = filter->path_func->FType()->Args()->FieldType("rec");
if ( rt->Tag() == TYPE_RECORD ) if ( rt->Tag() == TYPE_RECORD )
rec_arg = columns->CoerceTo(rt->AsRecordType(), true); rec_arg = columns->CoerceTo(rt->AsRecordType(), true).release();
else else
// Can be TYPE_ANY here. // Can be TYPE_ANY here.
rec_arg = columns->Ref(); rec_arg = columns->Ref();
val_list vl{ val_list vl{id->Ref(), path_arg, rec_arg};
id->Ref(), auto v = filter->path_func->Call(&vl);
path_arg,
rec_arg,
};
Val* v = 0;
v = filter->path_func->Call(&vl);
if ( ! v ) if ( ! v )
return false; return false;
@ -783,7 +761,6 @@ bool Manager::Write(EnumVal* id, RecordVal* columns)
if ( v->Type()->Tag() != TYPE_STRING ) if ( v->Type()->Tag() != TYPE_STRING )
{ {
reporter->Error("path_func did not return string"); reporter->Error("path_func did not return string");
Unref(v);
return false; return false;
} }
@ -794,7 +771,6 @@ bool Manager::Write(EnumVal* id, RecordVal* columns)
} }
path = v->AsString()->CheckString(); path = v->AsString()->CheckString();
Unref(v);
#ifdef DEBUG #ifdef DEBUG
DBG_LOG(DBG_LOGGING, "Path function for filter '%s' on stream '%s' return '%s'", DBG_LOG(DBG_LOGGING, "Path function for filter '%s' on stream '%s' return '%s'",
@ -872,8 +848,7 @@ bool Manager::Write(EnumVal* id, RecordVal* columns)
{ {
const char* name = filter->fields[j]->name; const char* name = filter->fields[j]->name;
StringVal *fn = new StringVal(name); StringVal *fn = new StringVal(name);
Val *val = 0; if ( auto val = filter->field_name_map->Lookup(fn, false) )
if ( (val = filter->field_name_map->Lookup(fn, false)) != 0 )
{ {
delete [] filter->fields[j]->name; delete [] filter->fields[j]->name;
filter->fields[j]->name = copy_string(val->AsStringVal()->CheckString()); filter->fields[j]->name = copy_string(val->AsStringVal()->CheckString());
@ -908,15 +883,12 @@ bool Manager::Write(EnumVal* id, RecordVal* columns)
filter->remote, false, filter->name); filter->remote, false, filter->name);
if ( ! writer ) if ( ! writer )
{
Unref(columns);
return false; return false;
} }
}
// Alright, can do the write now. // Alright, can do the write now.
threading::Value** vals = RecordToFilterVals(stream, filter, columns); threading::Value** vals = RecordToFilterVals(stream, filter, columns.get());
if ( ! PLUGIN_HOOK_WITH_RESULT(HOOK_LOG_WRITE, if ( ! PLUGIN_HOOK_WITH_RESULT(HOOK_LOG_WRITE,
HookLogWrite(filter->writer->Type()->AsEnumType()->Lookup(filter->writer->InternalInt()), HookLogWrite(filter->writer->Type()->AsEnumType()->Lookup(filter->writer->InternalInt()),
@ -925,7 +897,6 @@ bool Manager::Write(EnumVal* id, RecordVal* columns)
filter->fields, vals), filter->fields, vals),
true) ) true) )
{ {
Unref(columns);
DeleteVals(filter->num_fields, vals); DeleteVals(filter->num_fields, vals);
#ifdef DEBUG #ifdef DEBUG
@ -945,8 +916,6 @@ bool Manager::Write(EnumVal* id, RecordVal* columns)
#endif #endif
} }
Unref(columns);
return true; return true;
} }
@ -1086,13 +1055,15 @@ threading::Value* Manager::ValToLogVal(Val* val, BroType* ty)
threading::Value** Manager::RecordToFilterVals(Stream* stream, Filter* filter, threading::Value** Manager::RecordToFilterVals(Stream* stream, Filter* filter,
RecordVal* columns) RecordVal* columns)
{ {
RecordVal* ext_rec = nullptr; IntrusivePtr<RecordVal> ext_rec;
if ( filter->num_ext_fields > 0 ) if ( filter->num_ext_fields > 0 )
{ {
val_list vl{filter->path_val->Ref()}; val_list vl{filter->path_val->Ref()};
Val* res = filter->ext_func->Call(&vl); auto res = filter->ext_func->Call(&vl);
if ( res ) if ( res )
ext_rec = res->AsRecordVal(); ext_rec = {AdoptRef{}, res.release()->AsRecordVal()};
} }
threading::Value** vals = new threading::Value*[filter->num_fields]; threading::Value** vals = new threading::Value*[filter->num_fields];
@ -1109,7 +1080,7 @@ threading::Value** Manager::RecordToFilterVals(Stream* stream, Filter* filter,
continue; continue;
} }
val = ext_rec; val = ext_rec.get();
} }
else else
val = columns; val = columns;
@ -1134,9 +1105,6 @@ threading::Value** Manager::RecordToFilterVals(Stream* stream, Filter* filter,
vals[i] = ValToLogVal(val); vals[i] = ValToLogVal(val);
} }
if ( ext_rec )
Unref(ext_rec);
return vals; return vals;
} }
@ -1326,12 +1294,11 @@ void Manager::SendAllWritersTo(const broker::endpoint_info& ei)
WriterFrontend* writer = i->second->writer; WriterFrontend* writer = i->second->writer;
auto writer_val = et->GetVal(i->first.first); auto writer_val = et->GetVal(i->first.first);
broker_mgr->PublishLogCreate((*s)->id, broker_mgr->PublishLogCreate((*s)->id,
writer_val, writer_val.get(),
*i->second->info, *i->second->info,
writer->NumFields(), writer->NumFields(),
writer->Fields(), writer->Fields(),
ei); ei);
Unref(writer_val);
} }
} }
} }
@ -1551,10 +1518,10 @@ bool Manager::FinishedRotation(WriterFrontend* writer, const char* new_name, con
// Create the RotationInfo record. // Create the RotationInfo record.
RecordVal* info = new RecordVal(BifType::Record::Log::RotationInfo); RecordVal* info = new RecordVal(BifType::Record::Log::RotationInfo);
info->Assign(0, winfo->type->Ref()); info->Assign(0, winfo->type->Ref());
info->Assign(1, new StringVal(new_name)); info->Assign(1, make_intrusive<StringVal>(new_name));
info->Assign(2, new StringVal(winfo->writer->Info().path)); info->Assign(2, make_intrusive<StringVal>(winfo->writer->Info().path));
info->Assign(3, new Val(open, TYPE_TIME)); info->Assign(3, make_intrusive<Val>(open, TYPE_TIME));
info->Assign(4, new Val(close, TYPE_TIME)); info->Assign(4, make_intrusive<Val>(close, TYPE_TIME));
info->Assign(5, val_mgr->GetBool(terminating)); info->Assign(5, val_mgr->GetBool(terminating));
Func* func = winfo->postprocessor; Func* func = winfo->postprocessor;
@ -1572,12 +1539,9 @@ bool Manager::FinishedRotation(WriterFrontend* writer, const char* new_name, con
int result = 0; int result = 0;
Val* v = func->Call(&vl); auto v = func->Call(&vl);
if ( v ) if ( v )
{
result = v->AsBool(); result = v->AsBool();
Unref(v);
}
return result; return result;
} }

View file

@ -7,10 +7,10 @@ module Option;
#include "NetVar.h" #include "NetVar.h"
#include "broker/Data.h" #include "broker/Data.h"
static bool call_option_handlers_and_set_value(StringVal* name, ID* i, Val* val, static bool call_option_handlers_and_set_value(StringVal* name, ID* i,
IntrusivePtr<Val> val,
StringVal* location) StringVal* location)
{ {
val->Ref();
if ( i->HasOptionHandlers() ) if ( i->HasOptionHandlers() )
{ {
for ( auto handler_function : i->GetOptionHandlers() ) for ( auto handler_function : i->GetOptionHandlers() )
@ -18,12 +18,13 @@ static bool call_option_handlers_and_set_value(StringVal* name, ID* i, Val* val,
bool add_loc = handler_function->FType()->AsFuncType()->ArgTypes()->Types()->length() == 3; bool add_loc = handler_function->FType()->AsFuncType()->ArgTypes()->Types()->length() == 3;
val_list vl(2 + add_loc); val_list vl(2 + add_loc);
vl.push_back(name->Ref()); vl.push_back(name->Ref());
vl.push_back(val); vl.push_back(val->Ref());
if ( add_loc ) if ( add_loc )
vl.push_back(location->Ref()); vl.push_back(location->Ref());
val = handler_function->Call(&vl); // consumed by next call. val = handler_function->Call(&vl); // consumed by next call.
if ( ! val ) if ( ! val )
{ {
// Someone messed up, don't change value and just return // Someone messed up, don't change value and just return
@ -33,8 +34,7 @@ static bool call_option_handlers_and_set_value(StringVal* name, ID* i, Val* val,
} }
// clone to prevent changes // clone to prevent changes
i->SetVal({AdoptRef{}, val->Clone()}); i->SetVal(val->Clone());
Unref(val); // Either ref'd once or function call result.
return true; return true;
} }
%%} %%}
@ -90,7 +90,7 @@ function Option::set%(ID: string, val: any, location: string &default=""%): bool
return val_mgr->GetBool(0); return val_mgr->GetBool(0);
} }
auto rval = call_option_handlers_and_set_value(ID, i, val_from_data.get(), location); auto rval = call_option_handlers_and_set_value(ID, i, std::move(val_from_data), location);
return val_mgr->GetBool(rval); return val_mgr->GetBool(rval);
} }
@ -101,10 +101,10 @@ function Option::set%(ID: string, val: any, location: string &default=""%): bool
val->Type()->AsTableType()->IsUnspecifiedTable() ) val->Type()->AsTableType()->IsUnspecifiedTable() )
{ {
// Just coerce an empty/unspecified table to the right type. // Just coerce an empty/unspecified table to the right type.
auto tv = new TableVal(i->Type()->AsTableType(), auto tv = make_intrusive<TableVal>(
i->ID_Val()->AsTableVal()->Attrs()); IntrusivePtr{NewRef{}, i->Type()->AsTableType()},
auto rval = call_option_handlers_and_set_value(ID, i, tv, location); IntrusivePtr{NewRef{}, i->ID_Val()->AsTableVal()->Attrs()});
Unref(tv); auto rval = call_option_handlers_and_set_value(ID, i, std::move(tv), location);
return val_mgr->GetBool(rval); return val_mgr->GetBool(rval);
} }
@ -113,7 +113,7 @@ function Option::set%(ID: string, val: any, location: string &default=""%): bool
return val_mgr->GetBool(0); return val_mgr->GetBool(0);
} }
auto rval = call_option_handlers_and_set_value(ID, i, val, location); auto rval = call_option_handlers_and_set_value(ID, i, {NewRef{}, val}, location);
return val_mgr->GetBool(rval); return val_mgr->GetBool(rval);
%} %}

View file

@ -702,7 +702,7 @@ expr:
if ( ! id->Type() ) if ( ! id->Type() )
{ {
id->Error("undeclared variable"); id->Error("undeclared variable");
id->SetType({AdoptRef{}, error_type()}); id->SetType(error_type());
$$ = new NameExpr(std::move(id)); $$ = new NameExpr(std::move(id));
} }
@ -713,7 +713,7 @@ expr:
id->Name()); id->Name());
if ( intval < 0 ) if ( intval < 0 )
reporter->InternalError("enum value not found for %s", id->Name()); reporter->InternalError("enum value not found for %s", id->Name());
$$ = new ConstExpr({AdoptRef{}, t->GetVal(intval)}); $$ = new ConstExpr(t->GetVal(intval));
} }
else else
{ {
@ -844,84 +844,84 @@ enum_body_elem:
type: type:
TOK_BOOL { TOK_BOOL {
set_location(@1); set_location(@1);
$$ = base_type(TYPE_BOOL); $$ = base_type(TYPE_BOOL).release();
} }
| TOK_INT { | TOK_INT {
set_location(@1); set_location(@1);
$$ = base_type(TYPE_INT); $$ = base_type(TYPE_INT).release();
} }
| TOK_COUNT { | TOK_COUNT {
set_location(@1); set_location(@1);
$$ = base_type(TYPE_COUNT); $$ = base_type(TYPE_COUNT).release();
} }
| TOK_COUNTER { | TOK_COUNTER {
set_location(@1); set_location(@1);
$$ = base_type(TYPE_COUNTER); $$ = base_type(TYPE_COUNTER).release();
} }
| TOK_DOUBLE { | TOK_DOUBLE {
set_location(@1); set_location(@1);
$$ = base_type(TYPE_DOUBLE); $$ = base_type(TYPE_DOUBLE).release();
} }
| TOK_TIME { | TOK_TIME {
set_location(@1); set_location(@1);
$$ = base_type(TYPE_TIME); $$ = base_type(TYPE_TIME).release();
} }
| TOK_INTERVAL { | TOK_INTERVAL {
set_location(@1); set_location(@1);
$$ = base_type(TYPE_INTERVAL); $$ = base_type(TYPE_INTERVAL).release();
} }
| TOK_STRING { | TOK_STRING {
set_location(@1); set_location(@1);
$$ = base_type(TYPE_STRING); $$ = base_type(TYPE_STRING).release();
} }
| TOK_PATTERN { | TOK_PATTERN {
set_location(@1); set_location(@1);
$$ = base_type(TYPE_PATTERN); $$ = base_type(TYPE_PATTERN).release();
} }
| TOK_TIMER { | TOK_TIMER {
set_location(@1); set_location(@1);
$$ = base_type(TYPE_TIMER); $$ = base_type(TYPE_TIMER).release();
} }
| TOK_PORT { | TOK_PORT {
set_location(@1); set_location(@1);
$$ = base_type(TYPE_PORT); $$ = base_type(TYPE_PORT).release();
} }
| TOK_ADDR { | TOK_ADDR {
set_location(@1); set_location(@1);
$$ = base_type(TYPE_ADDR); $$ = base_type(TYPE_ADDR).release();
} }
| TOK_SUBNET { | TOK_SUBNET {
set_location(@1); set_location(@1);
$$ = base_type(TYPE_SUBNET); $$ = base_type(TYPE_SUBNET).release();
} }
| TOK_ANY { | TOK_ANY {
set_location(@1); set_location(@1);
$$ = base_type(TYPE_ANY); $$ = base_type(TYPE_ANY).release();
} }
| TOK_TABLE '[' type_list ']' TOK_OF type | TOK_TABLE '[' type_list ']' TOK_OF type
{ {
set_location(@1, @6); set_location(@1, @6);
$$ = new TableType($3, $6); $$ = new TableType({AdoptRef{}, $3}, {AdoptRef{}, $6});
} }
| TOK_SET '[' type_list ']' | TOK_SET '[' type_list ']'
{ {
set_location(@1, @4); set_location(@1, @4);
$$ = new SetType($3, 0); $$ = new SetType({AdoptRef{}, $3}, nullptr);
} }
| TOK_RECORD '{' | TOK_RECORD '{'
@ -967,7 +967,7 @@ type:
| TOK_VECTOR TOK_OF type | TOK_VECTOR TOK_OF type
{ {
set_location(@1, @3); set_location(@1, @3);
$$ = new VectorType($3); $$ = new VectorType({AdoptRef{}, $3});
} }
| TOK_FUNCTION func_params | TOK_FUNCTION func_params
@ -979,19 +979,19 @@ type:
| TOK_EVENT '(' formal_args ')' | TOK_EVENT '(' formal_args ')'
{ {
set_location(@1, @3); set_location(@1, @3);
$$ = new FuncType($3, 0, FUNC_FLAVOR_EVENT); $$ = new FuncType({AdoptRef{}, $3}, nullptr, FUNC_FLAVOR_EVENT);
} }
| TOK_HOOK '(' formal_args ')' | TOK_HOOK '(' formal_args ')'
{ {
set_location(@1, @3); set_location(@1, @3);
$$ = new FuncType($3, base_type(TYPE_BOOL), FUNC_FLAVOR_HOOK); $$ = new FuncType({AdoptRef{}, $3}, base_type(TYPE_BOOL), FUNC_FLAVOR_HOOK);
} }
| TOK_FILE TOK_OF type | TOK_FILE TOK_OF type
{ {
set_location(@1, @3); set_location(@1, @3);
$$ = new FileType($3); $$ = new FileType({AdoptRef{}, $3});
} }
| TOK_FILE | TOK_FILE
@ -1013,7 +1013,7 @@ type:
NullStmt here; NullStmt here;
if ( $1 ) if ( $1 )
$1->Error("not a Zeek type", &here); $1->Error("not a Zeek type", &here);
$$ = error_type(); $$ = error_type().release();
} }
else else
{ {
@ -1027,11 +1027,11 @@ type:
type_list: type_list:
type_list ',' type type_list ',' type
{ $1->AppendEvenIfNotPure($3); } { $1->AppendEvenIfNotPure({AdoptRef{}, $3}); }
| type | type
{ {
$$ = new TypeList($1); $$ = new TypeList({NewRef{}, $1});
$$->Append($1); $$->Append({AdoptRef{}, $1});
} }
; ;
@ -1050,7 +1050,7 @@ type_decl:
TOK_ID ':' type opt_attr ';' TOK_ID ':' type opt_attr ';'
{ {
set_location(@1, @4); set_location(@1, @4);
$$ = new TypeDecl($3, $1, $4, (in_record > 0)); $$ = new TypeDecl({AdoptRef{}, $3}, $1, $4, (in_record > 0));
if ( in_record > 0 && cur_decl_type_id ) if ( in_record > 0 && cur_decl_type_id )
zeekygen_mgr->RecordField(cur_decl_type_id, $$, ::filename); zeekygen_mgr->RecordField(cur_decl_type_id, $$, ::filename);
@ -1079,7 +1079,7 @@ formal_args_decl:
TOK_ID ':' type opt_attr TOK_ID ':' type opt_attr
{ {
set_location(@1, @4); set_location(@1, @4);
$$ = new TypeDecl($3, $1, $4, true); $$ = new TypeDecl({AdoptRef{}, $3}, $1, $4, true);
} }
; ;
@ -1119,7 +1119,7 @@ decl:
IntrusivePtr id{AdoptRef{}, $2}; IntrusivePtr id{AdoptRef{}, $2};
IntrusivePtr<Expr> init{AdoptRef{}, $5}; IntrusivePtr<Expr> init{AdoptRef{}, $5};
add_global(id.get(), {AdoptRef{}, $3}, $4, init, $6, VAR_REDEF); add_global(id.get(), {AdoptRef{}, $3}, $4, init, $6, VAR_REDEF);
zeekygen_mgr->Redef(id.get(), ::filename, $4, init.release()); zeekygen_mgr->Redef(id.get(), ::filename, $4, std::move(init));
} }
| TOK_REDEF TOK_ENUM global_id TOK_ADD_TO '{' | TOK_REDEF TOK_ENUM global_id TOK_ADD_TO '{'
@ -1261,8 +1261,8 @@ anonymous_function:
// a lambda expression. // a lambda expression.
// Gather the ingredients for a BroFunc from the current scope // Gather the ingredients for a BroFunc from the current scope
auto ingredients = std::make_unique<function_ingredients>(current_scope(), $5); auto ingredients = std::make_unique<function_ingredients>(IntrusivePtr{NewRef{}, current_scope()}, IntrusivePtr{AdoptRef{}, $5});
id_list outer_ids = gather_outer_ids(pop_scope().get(), $5); id_list outer_ids = gather_outer_ids(pop_scope().get(), ingredients->body.get());
$$ = new LambdaExpr(std::move(ingredients), std::move(outer_ids)); $$ = new LambdaExpr(std::move(ingredients), std::move(outer_ids));
} }
@ -1278,9 +1278,9 @@ begin_func:
func_params: func_params:
'(' formal_args ')' ':' type '(' formal_args ')' ':' type
{ $$ = new FuncType($2, $5, FUNC_FLAVOR_FUNCTION); } { $$ = new FuncType({AdoptRef{}, $2}, {AdoptRef{}, $5}, FUNC_FLAVOR_FUNCTION); }
| '(' formal_args ')' | '(' formal_args ')'
{ $$ = new FuncType($2, base_type(TYPE_VOID), FUNC_FLAVOR_FUNCTION); } { $$ = new FuncType({AdoptRef{}, $2}, base_type(TYPE_VOID), FUNC_FLAVOR_FUNCTION); }
; ;
opt_type: opt_type:
@ -1351,31 +1351,31 @@ attr_list:
attr: attr:
TOK_ATTR_DEFAULT '=' expr TOK_ATTR_DEFAULT '=' expr
{ $$ = new Attr(ATTR_DEFAULT, $3); } { $$ = new Attr(ATTR_DEFAULT, {AdoptRef{}, $3}); }
| TOK_ATTR_OPTIONAL | TOK_ATTR_OPTIONAL
{ $$ = new Attr(ATTR_OPTIONAL); } { $$ = new Attr(ATTR_OPTIONAL); }
| TOK_ATTR_REDEF | TOK_ATTR_REDEF
{ $$ = new Attr(ATTR_REDEF); } { $$ = new Attr(ATTR_REDEF); }
| TOK_ATTR_ADD_FUNC '=' expr | TOK_ATTR_ADD_FUNC '=' expr
{ $$ = new Attr(ATTR_ADD_FUNC, $3); } { $$ = new Attr(ATTR_ADD_FUNC, {AdoptRef{}, $3}); }
| TOK_ATTR_DEL_FUNC '=' expr | TOK_ATTR_DEL_FUNC '=' expr
{ $$ = new Attr(ATTR_DEL_FUNC, $3); } { $$ = new Attr(ATTR_DEL_FUNC, {AdoptRef{}, $3}); }
| TOK_ATTR_ON_CHANGE '=' expr | TOK_ATTR_ON_CHANGE '=' expr
{ $$ = new Attr(ATTR_ON_CHANGE, $3); } { $$ = new Attr(ATTR_ON_CHANGE, {AdoptRef{}, $3}); }
| TOK_ATTR_EXPIRE_FUNC '=' expr | TOK_ATTR_EXPIRE_FUNC '=' expr
{ $$ = new Attr(ATTR_EXPIRE_FUNC, $3); } { $$ = new Attr(ATTR_EXPIRE_FUNC, {AdoptRef{}, $3}); }
| TOK_ATTR_EXPIRE_CREATE '=' expr | TOK_ATTR_EXPIRE_CREATE '=' expr
{ $$ = new Attr(ATTR_EXPIRE_CREATE, $3); } { $$ = new Attr(ATTR_EXPIRE_CREATE, {AdoptRef{}, $3}); }
| TOK_ATTR_EXPIRE_READ '=' expr | TOK_ATTR_EXPIRE_READ '=' expr
{ $$ = new Attr(ATTR_EXPIRE_READ, $3); } { $$ = new Attr(ATTR_EXPIRE_READ, {AdoptRef{}, $3}); }
| TOK_ATTR_EXPIRE_WRITE '=' expr | TOK_ATTR_EXPIRE_WRITE '=' expr
{ $$ = new Attr(ATTR_EXPIRE_WRITE, $3); } { $$ = new Attr(ATTR_EXPIRE_WRITE, {AdoptRef{}, $3}); }
| TOK_ATTR_RAW_OUTPUT | TOK_ATTR_RAW_OUTPUT
{ $$ = new Attr(ATTR_RAW_OUTPUT); } { $$ = new Attr(ATTR_RAW_OUTPUT); }
| TOK_ATTR_PRIORITY '=' expr | TOK_ATTR_PRIORITY '=' expr
{ $$ = new Attr(ATTR_PRIORITY, $3); } { $$ = new Attr(ATTR_PRIORITY, {AdoptRef{}, $3}); }
| TOK_ATTR_TYPE_COLUMN '=' expr | TOK_ATTR_TYPE_COLUMN '=' expr
{ $$ = new Attr(ATTR_TYPE_COLUMN, $3); } { $$ = new Attr(ATTR_TYPE_COLUMN, {AdoptRef{}, $3}); }
| TOK_ATTR_LOG | TOK_ATTR_LOG
{ $$ = new Attr(ATTR_LOG); } { $$ = new Attr(ATTR_LOG); }
| TOK_ATTR_ERROR_HANDLER | TOK_ATTR_ERROR_HANDLER
@ -1385,7 +1385,7 @@ attr:
| TOK_ATTR_DEPRECATED '=' TOK_CONSTANT | TOK_ATTR_DEPRECATED '=' TOK_CONSTANT
{ {
if ( IsString($3->Type()->Tag()) ) if ( IsString($3->Type()->Tag()) )
$$ = new Attr(ATTR_DEPRECATED, new ConstExpr({AdoptRef{}, $3})); $$ = new Attr(ATTR_DEPRECATED, make_intrusive<ConstExpr>(IntrusivePtr{AdoptRef{}, $3}));
else else
{ {
ODesc d; ODesc d;

View file

@ -27,8 +27,8 @@ void TopkVal::Typify(BroType* t)
{ {
assert(!hash && !type); assert(!hash && !type);
type = t->Ref(); type = t->Ref();
auto tl = make_intrusive<TypeList>(t); auto tl = make_intrusive<TypeList>(IntrusivePtr{NewRef{}, t});
tl->Append(t->Ref()); tl->Append({NewRef{}, t});
hash = new CompositeHash(std::move(tl)); hash = new CompositeHash(std::move(tl));
} }
@ -184,11 +184,11 @@ void TopkVal::Merge(const TopkVal* value, bool doPrune)
} }
} }
Val* TopkVal::DoClone(CloneState* state) IntrusivePtr<Val> TopkVal::DoClone(CloneState* state)
{ {
auto clone = new TopkVal(size); auto clone = make_intrusive<TopkVal>(size);
clone->Merge(this); clone->Merge(this);
return state->NewClone(this, clone); return state->NewClone(this, std::move(clone));
} }
VectorVal* TopkVal::GetTopK(int k) const // returns vector VectorVal* TopkVal::GetTopK(int k) const // returns vector
@ -199,9 +199,9 @@ VectorVal* TopkVal::GetTopK(int k) const // returns vector
return 0; return 0;
} }
TypeList* vector_index = new TypeList(type); auto vector_index = make_intrusive<TypeList>(IntrusivePtr{NewRef{}, type});
vector_index->Append(type->Ref()); vector_index->Append({NewRef{}, type});
VectorType* v = new VectorType(vector_index); VectorType* v = new VectorType(std::move(vector_index));
VectorVal* t = new VectorVal(v); VectorVal* t = new VectorVal(v);
// this does no estimation if the results is correct! // this does no estimation if the results is correct!

View file

@ -127,7 +127,7 @@ public:
* *
* @returns cloned TopkVal * @returns cloned TopkVal
*/ */
Val* DoClone(CloneState* state) override; IntrusivePtr<Val> DoClone(CloneState* state) override;
DECLARE_OPAQUE_VALUE(TopkVal) DECLARE_OPAQUE_VALUE(TopkVal)

View file

@ -153,7 +153,7 @@ function Reporter::file_weird%(name: string, f: fa_file, addl: string &default="
## Returns: Current weird sampling whitelist ## Returns: Current weird sampling whitelist
function Reporter::get_weird_sampling_whitelist%(%): string_set function Reporter::get_weird_sampling_whitelist%(%): string_set
%{ %{
TableVal* set = new TableVal(string_set); TableVal* set = new TableVal({NewRef{}, string_set});
for ( auto el : reporter->GetWeirdSamplingWhitelist() ) for ( auto el : reporter->GetWeirdSamplingWhitelist() )
{ {
auto idx = make_intrusive<StringVal>(el); auto idx = make_intrusive<StringVal>(el);

View file

@ -526,7 +526,7 @@ F RET_CONST(val_mgr->GetFalse())
"0x"{HEX}+ RET_CONST(val_mgr->GetCount(static_cast<bro_uint_t>(strtoull(yytext, 0, 16)))) "0x"{HEX}+ RET_CONST(val_mgr->GetCount(static_cast<bro_uint_t>(strtoull(yytext, 0, 16))))
{H}("."{H})+ RET_CONST(dns_mgr->LookupHost(yytext)) {H}("."{H})+ RET_CONST(dns_mgr->LookupHost(yytext).release())
\"([^\\\n\"]|{ESCSEQ})*\" { \"([^\\\n\"]|{ESCSEQ})*\" {
const char* text = yytext; const char* text = yytext;

View file

@ -152,11 +152,11 @@ function get_proc_stats%(%): ProcStats
r->Assign(n++, val_mgr->GetCount(0)); r->Assign(n++, val_mgr->GetCount(0));
#endif #endif
r->Assign(n++, new Val(bro_start_time, TYPE_TIME)); r->Assign(n++, make_intrusive<Val>(bro_start_time, TYPE_TIME));
r->Assign(n++, new IntervalVal(elapsed_time, Seconds)); r->Assign(n++, make_intrusive<IntervalVal>(elapsed_time, Seconds));
r->Assign(n++, new IntervalVal(user_time, Seconds)); r->Assign(n++, make_intrusive<IntervalVal>(user_time, Seconds));
r->Assign(n++, new IntervalVal(system_time, Seconds)); r->Assign(n++, make_intrusive<IntervalVal>(system_time, Seconds));
uint64_t total_mem; uint64_t total_mem;
get_memory_usage(&total_mem, NULL); get_memory_usage(&total_mem, NULL);
@ -470,7 +470,7 @@ function get_reporter_stats%(%): ReporterStats
RecordVal* r = new RecordVal(ReporterStats); RecordVal* r = new RecordVal(ReporterStats);
int n = 0; int n = 0;
TableVal* weirds_by_type = new TableVal(internal_type("table_string_of_count")->AsTableType()); TableVal* weirds_by_type = new TableVal({NewRef{}, internal_type("table_string_of_count")->AsTableType()});
for ( auto& kv : reporter->GetWeirdsByType() ) for ( auto& kv : reporter->GetWeirdsByType() )
{ {

Some files were not shown because too many files have changed in this diff Show more