diff --git a/src/Val.cc b/src/Val.cc index 43f69c6c47..ca3bf27191 100644 --- a/src/Val.cc +++ b/src/Val.cc @@ -3390,7 +3390,10 @@ bool VectorVal::Insert(unsigned int index, ValPtr element) types_it = std::next(yield_types->begin(), index); } else if ( managed_yield ) - ZVal::DeleteManagedType(**it); + { + if ( *it ) + ZVal::DeleteManagedType(**it); + } } else { @@ -3446,7 +3449,10 @@ bool VectorVal::Remove(unsigned int index) } else if ( managed_yield ) - ZVal::DeleteManagedType(**it); + { + if ( *it ) + ZVal::DeleteManagedType(**it); + } vector_val->erase(it); diff --git a/testing/btest/Baseline/language.vector/out b/testing/btest/Baseline/language.vector/out index 8e6c4572b6..b75cf8048e 100644 --- a/testing/btest/Baseline/language.vector/out +++ b/testing/btest/Baseline/language.vector/out @@ -76,3 +76,5 @@ slicing assignment shrink (PASS) ? operator (PASS) copy of a vector with holes (PASS) copy of a vector with trailing holes, [0, 2, 3, 77, , ], [0, 2, 3, 77, , ] +hole in vector of managed types, 5, [[a=T], [a=T], , , [a=T]] +hole in vector of managed types after replacing slice, 3, [[a=T], [a=T], ] diff --git a/testing/btest/language/vector.zeek b/testing/btest/language/vector.zeek index 0fdd02fd66..a0ef9a9f1e 100644 --- a/testing/btest/language/vector.zeek +++ b/testing/btest/language/vector.zeek @@ -10,6 +10,11 @@ function test_case(msg: string, expect: bool) # Note: only global vectors can be initialized with curly braces global vg1: vector of string = { "curly", "braces" }; +type R: record { + a: bool &default=T; +}; + + event zeek_init() { local v1: vector of string = vector( "test", "example" ); @@ -205,4 +210,11 @@ event zeek_init() v5[6:] = vector(); local v20 = copy(v5); print "copy of a vector with trailing holes", v5, v20; + + local v21 = vector(R(), R()); + v21[4] = R(); + print "hole in vector of managed types", |v21|, v21; + v21[3:] = vector(); + print "hole in vector of managed types after replacing slice", |v21|, v21; + }