Merge remote-tracking branch 'origin/topic/jsiwek/gh-1155-recursive-table-index-type-check'

* origin/topic/jsiwek/gh-1155-recursive-table-index-type-check:
  GH-1155: Recursively check table index for unsupported types
This commit is contained in:
Tim Wojtulewicz 2020-09-17 11:42:38 -07:00
commit 26808ea7d4
7 changed files with 114 additions and 8 deletions

14
CHANGES
View file

@ -1,3 +1,17 @@
3.3.0-dev.269 | 2020-09-17 11:42:38 -0700
* GH-1155: Recursively check table index for unsupported types
Previously, container types used within a table/set index were not
deeply checked to ensure all constituents could be part of an index. (Jon Siwek, Corelight)
* GH-1159: Fix vector-of-interval multiplication/division arithmetic
Those operations done between a vector-of-interval and a
vector-of-arithmetic-type previously threw a runtime expression error
due to an incorrect coercion being used internally. (Jon Siwek, Corelight)
3.3.0-dev.265 | 2020-09-17 11:24:42 -0700
* Avoid passing address of member in packed struct #1074

View file

@ -1 +1 @@
3.3.0-dev.265
3.3.0-dev.269

View file

@ -441,6 +441,65 @@ bool IndexType::IsSubNetIndex() const
return false;
}
static bool is_supported_index_type(const TypePtr& t, const char** tname)
{
if ( t->InternalType() != TYPE_INTERNAL_OTHER )
return true;
auto tag = t->Tag();
switch ( tag ) {
// Allow functions, since they can be compared for Func* pointer equality.
case TYPE_FUNC:
return true;
case TYPE_PATTERN:
return true;
case TYPE_RECORD:
{
auto rt = t->AsRecordType();
for ( auto i = 0; i < rt->NumFields(); ++i )
if ( ! is_supported_index_type(rt->GetFieldType(i), tname) )
return false;
return true;
}
case TYPE_LIST:
{
for ( const auto& type : t->AsTypeList()->GetTypes() )
if ( ! is_supported_index_type(type, tname) )
return false;
return true;
}
case TYPE_TABLE:
{
auto tt = t->AsTableType();
if ( ! is_supported_index_type(tt->GetIndices(), tname) )
return false;
const auto& yt = tt->Yield();
if ( ! yt )
return true;
return is_supported_index_type(yt, tname);
}
case TYPE_VECTOR:
return is_supported_index_type(t->AsVectorType()->Yield(), tname);
default:
*tname = type_name(tag);
return false;
}
}
TableType::TableType(TypeListPtr ind, TypePtr yield)
: IndexType(TYPE_TABLE, std::move(ind), std::move(yield))
{
@ -448,6 +507,7 @@ TableType::TableType(TypeListPtr ind, TypePtr yield)
return;
const auto& tl = indices->GetTypes();
const char* unsupported_type_name = nullptr;
for ( const auto& tli : tl )
{
@ -456,12 +516,11 @@ TableType::TableType(TypeListPtr ind, TypePtr yield)
if ( t == TYPE_INTERNAL_ERROR )
break;
// Allow functions, since they can be compared
// for Func* pointer equality.
if ( t == TYPE_INTERNAL_OTHER && tli->Tag() != TYPE_FUNC &&
tli->Tag() != TYPE_RECORD && tli->Tag() != TYPE_PATTERN )
if ( ! is_supported_index_type(tli, &unsupported_type_name) )
{
tli->Error("bad index type");
auto msg = util::fmt("index type containing '%s' is not supported",
unsupported_type_name);
Error(msg, tli.get());
SetError();
break;
}

View file

@ -52,6 +52,6 @@ F
[a] = [type_name=set[double], log=F, value=<uninitialized>, default_val=<uninitialized>],
[d] = [type_name=table[double,string] of table[string] of vector of string, log=F, value=<uninitialized>, default_val=<uninitialized>],
[b] = [type_name=set[double,string], log=F, value=<uninitialized>, default_val=<uninitialized>],
[c] = [type_name=set[double,record r], log=F, value=<uninitialized>, default_val=<uninitialized>],
[c] = [type_name=set[double,record tt], log=F, value=<uninitialized>, default_val=<uninitialized>],
[e] = [type_name=vector of vector of string, log=F, value=<uninitialized>, default_val=<uninitialized>]
}

View file

@ -0,0 +1,7 @@
error in /home/jon/pro/zeek/zeek/testing/btest/.tmp/language.table-index-unsupported-types/table-index-unsupported-types.zeek, line 20 and any: index type containing 'any' is not supported (set[any] and any)
error in /home/jon/pro/zeek/zeek/testing/btest/.tmp/language.table-index-unsupported-types/table-index-unsupported-types.zeek, line 21 and any: index type containing 'any' is not supported (table[any] of count and any)
error in /home/jon/pro/zeek/zeek/testing/btest/.tmp/language.table-index-unsupported-types/table-index-unsupported-types.zeek, line 22 and /home/jon/pro/zeek/zeek/testing/btest/.tmp/language.table-index-unsupported-types/table-index-unsupported-types.zeek, lines 4-5: index type containing 'any' is not supported (set[r] and r)
error in /home/jon/pro/zeek/zeek/testing/btest/.tmp/language.table-index-unsupported-types/table-index-unsupported-types.zeek, line 23 and /home/jon/pro/zeek/zeek/testing/btest/.tmp/language.table-index-unsupported-types/table-index-unsupported-types.zeek, lines 4-5: index type containing 'any' is not supported (table[r] of count and r)
error in /home/jon/pro/zeek/zeek/testing/btest/.tmp/language.table-index-unsupported-types/table-index-unsupported-types.zeek, line 24 and /home/jon/pro/zeek/zeek/testing/btest/.tmp/language.table-index-unsupported-types/table-index-unsupported-types.zeek, lines 8-9: index type containing 'any' is not supported (set[rr] and rr)
error in /home/jon/pro/zeek/zeek/testing/btest/.tmp/language.table-index-unsupported-types/table-index-unsupported-types.zeek, line 25 and /home/jon/pro/zeek/zeek/testing/btest/.tmp/language.table-index-unsupported-types/table-index-unsupported-types.zeek, lines 12-13: index type containing 'any' is not supported (set[rv] and rv)
error in /home/jon/pro/zeek/zeek/testing/btest/.tmp/language.table-index-unsupported-types/table-index-unsupported-types.zeek, line 26 and /home/jon/pro/zeek/zeek/testing/btest/.tmp/language.table-index-unsupported-types/table-index-unsupported-types.zeek, lines 16-17: index type containing 'any' is not supported (set[rt] and rt)

View file

@ -27,7 +27,7 @@ type mystring: string;
type cr: record {
a: set[double];
b: set[double, string];
c: set[double, r];
c: set[double, tt];
d: table[double, string] of table[string] of vector of string;
e: vector of vector of string;
};

View file

@ -0,0 +1,26 @@
# @TEST-EXEC-FAIL: zeek -b %INPUT >out 2>&1
# @TEST-EXEC: TEST_DIFF_CANONIFIER=$SCRIPTS/diff-remove-abspath btest-diff out
type r: record {
f: any;
};
type rr: record {
f: r;
};
type rv: record {
f: vector of any;
};
type rt: record {
f: table[count] of any;
};
global a: set[any];
global b: table[any] of count;
global c: set[r];
global d: table[r] of count;
global e: set[rr];
global f: set[rv];
global g: set[rt];