Merge remote-tracking branch 'origin/topic/vern/zam-vector-loop-leak'

* origin/topic/vern/zam-vector-loop-leak:
  fixed ZAM memory leak when looping over vectors of records
This commit is contained in:
Arne Welzel 2024-11-08 15:30:12 +01:00
commit bc75b1811d
6 changed files with 56 additions and 1 deletions

View file

@ -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 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) * fixed access to uninitialized memory in ZAM's "cat" built-in (Vern Paxson, Corelight)

View file

@ -1 +1 @@
7.1.0-dev.471 7.1.0-dev.473

View file

@ -77,7 +77,10 @@ op-types U X I I
eval NextVectorIterCore($2, $3) eval NextVectorIterCore($2, $3)
$$ = $2.iter; $$ = $2.iter;
if ( Z_IS_MANAGED ) if ( Z_IS_MANAGED )
{
ZVal::DeleteManagedType($1);
$1 = BuildVal(vv[$2.iter]->ToVal(Z_TYPE), Z_TYPE); $1 = BuildVal(vv[$2.iter]->ToVal(Z_TYPE), Z_TYPE);
}
else else
$1 = *vv[$2.iter]; $1 = *vv[$2.iter];
$2.IterFinished(); $2.IterFinished();
@ -87,7 +90,10 @@ internal-op Next-Vector-Blank-Iter-Val-Var
class Vsb class Vsb
eval NextVectorIterCore($1, $2) eval NextVectorIterCore($1, $2)
if ( Z_IS_MANAGED ) if ( Z_IS_MANAGED )
{
ZVal::DeleteManagedType($$);
$$ = BuildVal(vv[$1.iter]->ToVal(Z_TYPE), Z_TYPE); $$ = BuildVal(vv[$1.iter]->ToVal(Z_TYPE), Z_TYPE);
}
else else
$$ = *vv[$1.iter]; $$ = *vv[$1.iter];
$1.IterFinished(); $1.IterFinished();

View file

@ -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]

View file

@ -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]

View file

@ -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;
}