diff --git a/src/CompHash.cc b/src/CompHash.cc index 057858b719..749dda19ab 100644 --- a/src/CompHash.cc +++ b/src/CompHash.cc @@ -535,17 +535,14 @@ int CompositeHash::SingleTypeKeySize(BroType* bt, const Val* v, sz = SizeAlign(sz, sizeof(int)); TableVal* tv = const_cast(v->AsTableVal()); - ListVal* lv = tv->ConvertToList(); + auto lv = tv->ToListVal(); for ( int i = 0; i < tv->Size(); ++i ) { Val* key = lv->Idx(i).get(); sz = SingleTypeKeySize(key->Type(), key, type_check, sz, false, calc_static_size); if ( ! sz ) - { - Unref(lv); return 0; - } if ( ! bt->IsSet() ) { @@ -553,15 +550,10 @@ int CompositeHash::SingleTypeKeySize(BroType* bt, const Val* v, sz = SingleTypeKeySize(val->Type(), val.get(), type_check, sz, false, calc_static_size); if ( ! sz ) - { - Unref(lv); return 0; - } } } - Unref(lv); - break; } diff --git a/src/RuleMatcher.cc b/src/RuleMatcher.cc index 2cfc56b750..b624008271 100644 --- a/src/RuleMatcher.cc +++ b/src/RuleMatcher.cc @@ -1361,16 +1361,11 @@ void id_to_maskedvallist(const char* id, maskedvalue_list* append_to, if ( v->Type()->Tag() == TYPE_TABLE ) { - ListVal* lv = v->AsTableVal()->ConvertToPureList(); + auto lv = v->AsTableVal()->ToPureListVal(); for ( const auto& val : lv->Vals() ) if ( ! val_to_maskedval(val.get(), append_to, prefix_vector) ) - { - Unref(lv); return; - } - - Unref(lv); } else diff --git a/src/Sessions.cc b/src/Sessions.cc index fd40f5cc40..8843300f02 100644 --- a/src/Sessions.cc +++ b/src/Sessions.cc @@ -1218,11 +1218,10 @@ bool NetSessions::IsLikelyServerPort(uint32_t port, TransportProto proto) const if ( ! have_cache ) { - ListVal* lv = likely_server_ports->ConvertToPureList(); + auto lv = likely_server_ports->ToPureListVal(); for ( int i = 0; i < lv->Length(); i++ ) port_cache.insert(lv->Idx(i)->InternalUnsigned()); have_cache = true; - Unref(lv); } // We exploit our knowledge of PortVal's internal storage mechanism diff --git a/src/Val.cc b/src/Val.cc index 5e75aee7f3..925a1c4c76 100644 --- a/src/Val.cc +++ b/src/Val.cc @@ -1755,7 +1755,7 @@ bool TableVal::ExpandAndInit(IntrusivePtr index, IntrusivePtr new_val) if ( index_type->IsSet() ) { - index = {AdoptRef{}, index->AsTableVal()->ConvertToList()}; + index = index->AsTableVal()->ToListVal(); return ExpandAndInit(std::move(index), std::move(new_val)); } @@ -2110,9 +2110,9 @@ IntrusivePtr TableVal::Delete(const HashKey* k) return va; } -ListVal* TableVal::ConvertToList(TypeTag t) const +IntrusivePtr TableVal::ToListVal(TypeTag t) const { - ListVal* l = new ListVal(t); + auto l = make_intrusive(t); const PDict* tbl = AsTable(); IterCookie* c = tbl->InitForIteration(); @@ -2128,7 +2128,7 @@ ListVal* TableVal::ConvertToList(TypeTag t) const { // We're expecting a pure list, flatten the ListVal. if ( index->Length() != 1 ) - InternalWarning("bad index in TableVal::ConvertToList"); + InternalWarning("bad index in TableVal::ToListVal"); l->Append(index->Idx(0)); } @@ -2139,16 +2139,26 @@ ListVal* TableVal::ConvertToList(TypeTag t) const return l; } -ListVal* TableVal::ConvertToPureList() const +ListVal* TableVal::ConvertToList(TypeTag t) const + { + return ToListVal().release(); + } + +IntrusivePtr TableVal::ToPureListVal() const { type_list* tl = table_type->Indices()->Types(); if ( tl->length() != 1 ) { - InternalWarning("bad index type in TableVal::ConvertToPureList"); + InternalWarning("bad index type in TableVal::ToPureListVal"); return nullptr; } - return ConvertToList((*tl)[0]->Tag()); + return ToListVal((*tl)[0]->Tag()); + } + +ListVal* TableVal::ConvertToPureList() const + { + return ToPureListVal().release(); } Attr* TableVal::FindAttr(attr_tag t) const @@ -2246,7 +2256,7 @@ bool TableVal::ExpandCompoundAndInit(ListVal* lv, int k, IntrusivePtr new_v { Val* ind_k_v = lv->Idx(k).get(); auto ind_k = ind_k_v->Type()->IsSet() ? - IntrusivePtr{AdoptRef{}, ind_k_v->AsTableVal()->ConvertToList()} : + ind_k_v->AsTableVal()->ToListVal() : IntrusivePtr{NewRef{}, ind_k_v->AsListVal()}; for ( int i = 0; i < ind_k->Length(); ++i ) diff --git a/src/Val.h b/src/Val.h index 7b35629d38..3aa128c5f6 100644 --- a/src/Val.h +++ b/src/Val.h @@ -808,7 +808,15 @@ public: IntrusivePtr Delete(const HashKey* k); // Returns a ListVal representation of the table (which must be a set). + IntrusivePtr ToListVal(TypeTag t = TYPE_ANY) const; + + // Returns a ListVal representation of the table (which must be a set + // with non-composite index type). + IntrusivePtr ToPureListVal() const; + + [[deprecated("Remove in v4.1. Use ToListVal() instead.")]] ListVal* ConvertToList(TypeTag t=TYPE_ANY) const; + [[deprecated("Remove in v4.1. Use ToPureListVal() instead.")]] ListVal* ConvertToPureList() const; // must be single index type void SetAttrs(IntrusivePtr attrs); diff --git a/src/Var.cc b/src/Var.cc index b170c20ddc..54837ae8c3 100644 --- a/src/Var.cc +++ b/src/Var.cc @@ -749,8 +749,8 @@ ListVal* internal_list_val(const char* name) else if ( v->Type()->IsSet() ) { TableVal* tv = v->AsTableVal(); - ListVal* lv = tv->ConvertToPureList(); - return lv; + auto lv = tv->ToPureListVal(); + return lv.release(); } else diff --git a/src/analyzer/Manager.cc b/src/analyzer/Manager.cc index b7c9b1af3d..acea5cc813 100644 --- a/src/analyzer/Manager.cc +++ b/src/analyzer/Manager.cc @@ -96,12 +96,10 @@ void Manager::InitPostScript() reporter->FatalError("Tunnel::vxlan_ports not defined"); auto table_val = id->ID_Val()->AsTableVal(); - auto port_list = table_val->ConvertToPureList(); + auto port_list = table_val->ToPureListVal(); for ( auto i = 0; i < port_list->Length(); ++i ) vxlan_ports.emplace_back(port_list->Idx(i)->AsPortVal()->Port()); - - Unref(port_list); } void Manager::DumpDebug() diff --git a/src/file_analysis/analyzer/x509/X509.cc b/src/file_analysis/analyzer/x509/X509.cc index 6e58a8f183..d32c8434e8 100644 --- a/src/file_analysis/analyzer/x509/X509.cc +++ b/src/file_analysis/analyzer/x509/X509.cc @@ -244,7 +244,7 @@ X509_STORE* file_analysis::X509::GetRootStore(TableVal* root_certs) return x509_stores[root_certs]; X509_STORE* ctx = X509_STORE_new(); - ListVal* idxs = root_certs->ConvertToPureList(); + auto idxs = root_certs->ToPureListVal(); // Build the validation store for ( int i = 0; i < idxs->Length(); ++i ) @@ -264,8 +264,6 @@ X509_STORE* file_analysis::X509::GetRootStore(TableVal* root_certs) X509_free(x); } - delete idxs; - // Save the newly constructed certificate store into the cacheing map. x509_stores[root_certs] = ctx; diff --git a/src/logging/Manager.cc b/src/logging/Manager.cc index f68f5be4d9..a09c0fa0d4 100644 --- a/src/logging/Manager.cc +++ b/src/logging/Manager.cc @@ -1012,11 +1012,11 @@ threading::Value* Manager::ValToLogVal(Val* val, BroType* ty) case TYPE_TABLE: { - ListVal* set = val->AsTableVal()->ConvertToPureList(); + auto set = val->AsTableVal()->ToPureListVal(); if ( ! set ) - // ConvertToPureList has reported an internal warning + // ToPureListVal has reported an internal warning // already. Just keep going by making something up. - set = new ListVal(TYPE_INT); + set = make_intrusive(TYPE_INT); lval->val.set_val.size = set->Length(); lval->val.set_val.vals = new threading::Value* [lval->val.set_val.size]; @@ -1024,7 +1024,6 @@ threading::Value* Manager::ValToLogVal(Val* val, BroType* ty) for ( int i = 0; i < lval->val.set_val.size; i++ ) lval->val.set_val.vals[i] = ValToLogVal(set->Idx(i).get()); - Unref(set); break; } diff --git a/src/zeek.bif b/src/zeek.bif index de067d7b40..bea7c94761 100644 --- a/src/zeek.bif +++ b/src/zeek.bif @@ -401,7 +401,7 @@ function terminate%(%): bool // is false). static bool prepare_environment(TableVal* tbl, bool set) { - IntrusivePtr idxs{AdoptRef{}, tbl->ConvertToPureList()}; + auto idxs = tbl->ToPureListVal(); for ( int i = 0; i < idxs->Length(); ++i ) {