mirror of
https://github.com/zeek/zeek.git
synced 2025-10-06 16:48:19 +00:00
Table lookups return copy of non-const &default vals (addresses #981).
This prevents unintentional modifications to the &default value itself.
This commit is contained in:
parent
8992dc6cff
commit
6a7a242db9
3 changed files with 32 additions and 1 deletions
|
@ -1749,7 +1749,7 @@ Val* TableVal::Default(Val* index)
|
|||
|
||||
if ( def_val->Type()->Tag() != TYPE_FUNC ||
|
||||
same_type(def_val->Type(), Type()->YieldType()) )
|
||||
return def_val->Ref();
|
||||
return def_attr->AttrExpr()->IsConst() ? def_val->Ref() : def_val->Clone();
|
||||
|
||||
const Func* f = def_val->AsFunc();
|
||||
val_list* vl = new val_list();
|
||||
|
|
7
testing/btest/Baseline/language.table-default-record/out
Normal file
7
testing/btest/Baseline/language.table-default-record/out
Normal file
|
@ -0,0 +1,7 @@
|
|||
0
|
||||
0
|
||||
0
|
||||
0
|
||||
{
|
||||
|
||||
}
|
24
testing/btest/language/table-default-record.bro
Normal file
24
testing/btest/language/table-default-record.bro
Normal file
|
@ -0,0 +1,24 @@
|
|||
# @TEST-EXEC: bro -b %INPUT >out
|
||||
# @TEST-EXEC: btest-diff out
|
||||
|
||||
type Foo: record {
|
||||
x: count &default=0;
|
||||
};
|
||||
|
||||
global foo: table[count] of Foo = {} &default=[];
|
||||
|
||||
# returns the &default value as usual
|
||||
print(foo[0]$x);
|
||||
print(foo[1]$x);
|
||||
|
||||
# these are essentially no-ops since a copy of the &default value is returned
|
||||
# by the lookup
|
||||
foo[0]$x = 0;
|
||||
foo[1]$x = 1;
|
||||
|
||||
# the &default value isn't modified
|
||||
print(foo[0]$x);
|
||||
print(foo[1]$x);
|
||||
|
||||
# table membership isn't modified
|
||||
print(foo);
|
Loading…
Add table
Add a link
Reference in a new issue