diff --git a/CHANGES b/CHANGES index 0ac07e1f51..2303cc84b8 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,7 @@ +7.1.0-dev.473 | 2024-11-08 15:31:39 +0100 + + * fixed ZAM memory leak when looping over vectors of records (Vern Paxson, Corelight) + 7.1.0-dev.471 | 2024-11-08 15:22:48 +0100 * fixed access to uninitialized memory in ZAM's "cat" built-in (Vern Paxson, Corelight) diff --git a/VERSION b/VERSION index 3f6fe77416..a4206b5ffa 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -7.1.0-dev.471 +7.1.0-dev.473 diff --git a/src/script_opt/ZAM/OPs/iterations.op b/src/script_opt/ZAM/OPs/iterations.op index 92c4895b62..0ac8672388 100644 --- a/src/script_opt/ZAM/OPs/iterations.op +++ b/src/script_opt/ZAM/OPs/iterations.op @@ -77,7 +77,10 @@ op-types U X I I eval NextVectorIterCore($2, $3) $$ = $2.iter; if ( Z_IS_MANAGED ) + { + ZVal::DeleteManagedType($1); $1 = BuildVal(vv[$2.iter]->ToVal(Z_TYPE), Z_TYPE); + } else $1 = *vv[$2.iter]; $2.IterFinished(); @@ -87,7 +90,10 @@ internal-op Next-Vector-Blank-Iter-Val-Var class Vsb eval NextVectorIterCore($1, $2) if ( Z_IS_MANAGED ) + { + ZVal::DeleteManagedType($$); $$ = BuildVal(vv[$1.iter]->ToVal(Z_TYPE), Z_TYPE); + } else $$ = *vv[$1.iter]; $1.IterFinished(); diff --git a/testing/btest/Baseline.zam/opt.vector-loop-managed/output b/testing/btest/Baseline.zam/opt.vector-loop-managed/output new file mode 100644 index 0000000000..b3d8c17e3c --- /dev/null +++ b/testing/btest/Baseline.zam/opt.vector-loop-managed/output @@ -0,0 +1,9 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +0, [a=123] +1, [a=456] +[a=123] +[a=456] +0, [1] +1, [2] +[1] +[2] diff --git a/testing/btest/Baseline/opt.vector-loop-managed/output b/testing/btest/Baseline/opt.vector-loop-managed/output new file mode 100644 index 0000000000..b3d8c17e3c --- /dev/null +++ b/testing/btest/Baseline/opt.vector-loop-managed/output @@ -0,0 +1,9 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +0, [a=123] +1, [a=456] +[a=123] +[a=456] +0, [1] +1, [2] +[1] +[2] diff --git a/testing/btest/opt/vector-loop-managed.zeek b/testing/btest/opt/vector-loop-managed.zeek new file mode 100644 index 0000000000..ed30ca65e7 --- /dev/null +++ b/testing/btest/opt/vector-loop-managed.zeek @@ -0,0 +1,27 @@ +# @TEST-DOC: Regression test for memory leak when iterating over records of managed types. +# @TEST-REQUIRES: test "${ZEEK_USE_CPP}" != "1" +# +# @TEST-EXEC: zeek -b -O ZAM %INPUT >output +# @TEST-EXEC: btest-diff output + +type X: record { + a: string; +}; + +event zeek_init() + { + local vec1 = vector(X($a="123"), X($a="456")); + local vec2 = vector(vector(1), vector(2)); + + for ( i, r in vec1 ) + print i, r; + + for ( _, r in vec1 ) + print r; + + for ( j, v in vec2 ) + print j, v; + + for ( _, v in vec2 ) + print v; + }