From cb71b15eab8184949ea54bbf3edf65474a9ddb68 Mon Sep 17 00:00:00 2001 From: AmazingPP <1620535041@qq.com> Date: Sat, 9 Jul 2022 00:19:06 +0800 Subject: [PATCH 1/3] Add table_values function --- src/zeek.bif | 23 ++++++++++++++++++++ testing/btest/Baseline/bifs.table_values/out | 3 +++ testing/btest/bifs/table_values.zeek | 18 +++++++++++++++ 3 files changed, 44 insertions(+) create mode 100644 testing/btest/Baseline/bifs.table_values/out create mode 100644 testing/btest/bifs/table_values.zeek diff --git a/src/zeek.bif b/src/zeek.bif index fb0c74ddd4..07abb30e55 100644 --- a/src/zeek.bif +++ b/src/zeek.bif @@ -1185,6 +1185,29 @@ function clear_table%(v: any%): any return nullptr; %} +## Gets all values from a table. +## +## t: The :zeek:type:`table` +## +## Returns: A ``vector of T`` of all the values in t. +function table_values%(t: any%): any + %{ + if ( ! t->GetType()->IsTable() ) + { + zeek::emit_builtin_error("table_values() requires a table argument"); + return nullptr; + } + + auto vt = zeek::make_intrusive(t->GetType()->AsTableType()->Yield()); + auto vv = zeek::make_intrusive(std::move(vt)); + for ( const auto& iter : *t->AsTable() ) + { + vv->Append(iter.value->GetVal()); + } + + return vv; + %} + ## Gets all subnets that contain a given subnet from a set/table[subnet]. ## ## search: the subnet to search for. diff --git a/testing/btest/Baseline/bifs.table_values/out b/testing/btest/Baseline/bifs.table_values/out new file mode 100644 index 0000000000..d15ed02104 --- /dev/null +++ b/testing/btest/Baseline/bifs.table_values/out @@ -0,0 +1,3 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +80/tcp, http, 443/tcp, https +21/tcp, ftp, 23/tcp, telnet diff --git a/testing/btest/bifs/table_values.zeek b/testing/btest/bifs/table_values.zeek new file mode 100644 index 0000000000..6860c84e94 --- /dev/null +++ b/testing/btest/bifs/table_values.zeek @@ -0,0 +1,18 @@ +# +# @TEST-EXEC: zeek -b %INPUT > out +# @TEST-EXEC: btest-diff out + +event zeek_init() + { + local t = table( + ["web"] = { [80/tcp, "http"], [443/tcp, "https"] }, + ["login"] = { [21/tcp, "ftp"], [23/tcp, "telnet"] } + ); + + local v: vector of set[port, string] = table_values(t); + + for ( i in v ) + { + print v[i]; + } + } \ No newline at end of file From ba552ceeafbae3191640f0a414086bd3dbba1479 Mon Sep 17 00:00:00 2001 From: AmazingPP <1620535041@qq.com> Date: Sat, 9 Jul 2022 01:11:31 +0800 Subject: [PATCH 2/3] Add table_keys function --- src/Val.h | 2 + src/zeek.bif | 58 ++++++++++++++++------ testing/btest/Baseline/bifs.table_keys/out | 5 ++ testing/btest/bifs/table_keys.zeek | 15 ++++++ testing/btest/bifs/table_values.zeek | 14 +++--- 5 files changed, 73 insertions(+), 21 deletions(-) create mode 100644 testing/btest/Baseline/bifs.table_keys/out create mode 100644 testing/btest/bifs/table_keys.zeek diff --git a/src/Val.h b/src/Val.h index 8a01be9924..2831719fa7 100644 --- a/src/Val.h +++ b/src/Val.h @@ -932,6 +932,8 @@ public: const PDict* Get() const { return table_val; } + const detail::CompositeHash* GetTableHash() const { return table_hash; } + // Returns the size of the table. int Size() const; int RecursiveSize() const; diff --git a/src/zeek.bif b/src/zeek.bif index 07abb30e55..e71f16b1ce 100644 --- a/src/zeek.bif +++ b/src/zeek.bif @@ -28,6 +28,7 @@ #include "zeek/IntrusivePtr.h" #include "zeek/input.h" #include "zeek/Hash.h" +#include "zeek/CompHash.h" #include "zeek/packet_analysis/Manager.h" using namespace std; @@ -1190,23 +1191,52 @@ function clear_table%(v: any%): any ## t: The :zeek:type:`table` ## ## Returns: A ``vector of T`` of all the values in t. +## +## .. zeek:see:: table_keys function table_values%(t: any%): any - %{ - if ( ! t->GetType()->IsTable() ) - { - zeek::emit_builtin_error("table_values() requires a table argument"); - return nullptr; - } + %{ + if ( ! t->GetType()->IsTable() ) + { + zeek::emit_builtin_error("table_values() requires a table argument"); + return nullptr; + } - auto vt = zeek::make_intrusive(t->GetType()->AsTableType()->Yield()); - auto vv = zeek::make_intrusive(std::move(vt)); - for ( const auto& iter : *t->AsTable() ) - { - vv->Append(iter.value->GetVal()); - } + auto vt = zeek::make_intrusive(t->GetType()->AsTableType()->Yield()); + auto vv = zeek::make_intrusive(std::move(vt)); + for ( const auto& iter : *t->AsTable() ) + { + vv->Append(iter.value->GetVal()); + } - return vv; - %} + return vv; + %} + +## Gets all keys from a table. +## +## t: The :zeek:type:`table` +## +## Returns: A ``set of T`` of all the keys in t. +## +## .. zeek:see:: table_values +function table_keys%(t: any%): any + %{ + if ( ! t->GetType()->IsTable() ) + { + zeek::emit_builtin_error("table_keys() requires a table argument"); + return nullptr; + } + + auto tl = t->GetType()->AsTableType()->GetIndices(); + auto st = make_intrusive(std::move(tl), nullptr); + auto sv = zeek::make_intrusive(std::move(st)); + auto th = t->AsTableVal()->GetTableHash(); + for ( const auto& iter : *t->AsTable() ) + { + sv->Assign(th->RecoverVals(*iter.GetHashKey()), nullptr); + } + + return sv; + %} ## Gets all subnets that contain a given subnet from a set/table[subnet]. ## diff --git a/testing/btest/Baseline/bifs.table_keys/out b/testing/btest/Baseline/bifs.table_keys/out new file mode 100644 index 0000000000..822d895868 --- /dev/null +++ b/testing/btest/Baseline/bifs.table_keys/out @@ -0,0 +1,5 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +{ +http, +https +} diff --git a/testing/btest/bifs/table_keys.zeek b/testing/btest/bifs/table_keys.zeek new file mode 100644 index 0000000000..8664894c09 --- /dev/null +++ b/testing/btest/bifs/table_keys.zeek @@ -0,0 +1,15 @@ +# +# @TEST-EXEC: zeek -b %INPUT > out +# @TEST-EXEC: btest-diff out + +event zeek_init() + { + local t = table( + ["http"] = "http://www.google.com/", + ["https"] = "https://www.google.com/" + ); + + local v: set[string] = table_keys(t); + + print v; + } \ No newline at end of file diff --git a/testing/btest/bifs/table_values.zeek b/testing/btest/bifs/table_values.zeek index 6860c84e94..942772eb2a 100644 --- a/testing/btest/bifs/table_values.zeek +++ b/testing/btest/bifs/table_values.zeek @@ -5,14 +5,14 @@ event zeek_init() { local t = table( - ["web"] = { [80/tcp, "http"], [443/tcp, "https"] }, - ["login"] = { [21/tcp, "ftp"], [23/tcp, "telnet"] } + ["web"] = { [80/tcp, "http"], [443/tcp, "https"] }, + ["login"] = { [21/tcp, "ftp"], [23/tcp, "telnet"] } ); - - local v: vector of set[port, string] = table_values(t); + + local v: vector of set[port, string] = table_values(t); for ( i in v ) - { - print v[i]; - } + { + print v[i]; + } } \ No newline at end of file From 206e6d28a4f431879134ae126cfe7dd58730d9a5 Mon Sep 17 00:00:00 2001 From: AmazingPP <1620535041@qq.com> Date: Wed, 13 Jul 2022 22:08:21 +0800 Subject: [PATCH 3/3] Add more test cases --- src/zeek.bif | 4 +-- testing/btest/Baseline/bifs.table_keys/out | 8 ++++++ testing/btest/Baseline/bifs.table_values/out | 4 +-- testing/btest/bifs/table_keys.zeek | 28 +++++++++++++++----- testing/btest/bifs/table_values.zeek | 17 ++++++------ 5 files changed, 41 insertions(+), 20 deletions(-) diff --git a/src/zeek.bif b/src/zeek.bif index e71f16b1ce..700c97c33a 100644 --- a/src/zeek.bif +++ b/src/zeek.bif @@ -1193,7 +1193,7 @@ function clear_table%(v: any%): any ## Returns: A ``vector of T`` of all the values in t. ## ## .. zeek:see:: table_keys -function table_values%(t: any%): any +function table_values%(t: any%): any_vec %{ if ( ! t->GetType()->IsTable() ) { @@ -1227,7 +1227,7 @@ function table_keys%(t: any%): any } auto tl = t->GetType()->AsTableType()->GetIndices(); - auto st = make_intrusive(std::move(tl), nullptr); + auto st = zeek::make_intrusive(std::move(tl), nullptr); auto sv = zeek::make_intrusive(std::move(st)); auto th = t->AsTableVal()->GetTableHash(); for ( const auto& iter : *t->AsTable() ) diff --git a/testing/btest/Baseline/bifs.table_keys/out b/testing/btest/Baseline/bifs.table_keys/out index 822d895868..b54a0fa697 100644 --- a/testing/btest/Baseline/bifs.table_keys/out +++ b/testing/btest/Baseline/bifs.table_keys/out @@ -3,3 +3,11 @@ http, https } +{ +[a=, b=7], +[a=10, b=5] +} +{ +[1/tcp, test, T] , +[2/tcp, example, F] +} diff --git a/testing/btest/Baseline/bifs.table_values/out b/testing/btest/Baseline/bifs.table_values/out index d15ed02104..d89f8a0be4 100644 --- a/testing/btest/Baseline/bifs.table_values/out +++ b/testing/btest/Baseline/bifs.table_values/out @@ -1,3 +1,3 @@ ### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. -80/tcp, http, 443/tcp, https -21/tcp, ftp, 23/tcp, telnet +[example, test] +[80/tcp, http, 443/tcp, https, 21/tcp, ftp, 23/tcp, telnet] diff --git a/testing/btest/bifs/table_keys.zeek b/testing/btest/bifs/table_keys.zeek index 8664894c09..d22f2d5d14 100644 --- a/testing/btest/bifs/table_keys.zeek +++ b/testing/btest/bifs/table_keys.zeek @@ -2,14 +2,28 @@ # @TEST-EXEC: zeek -b %INPUT > out # @TEST-EXEC: btest-diff out +type MyRec: record { + a: count &optional; + b: count; +}; + +type MyTable: table[MyRec] of string; + event zeek_init() { - local t = table( + local t1 = table( ["http"] = "http://www.google.com/", - ["https"] = "https://www.google.com/" - ); - - local v: set[string] = table_keys(t); + ["https"] = "https://www.google.com/"); + local t2 = MyTable([[$a=10, $b=5]] = "b5", [[$b=7]] = "b7"); + local t3: table[port, string, bool] of string = table( + [1/tcp, "test", T] = "test1", + [2/tcp, "example", F] = "test2"); - print v; - } \ No newline at end of file + local v1: set[string] = table_keys(t1); + local v2: set[MyRec] = table_keys(t2); + local v3: set[port, string, bool] = table_keys(t3); + + print v1; + print v2; + print v3; + } diff --git a/testing/btest/bifs/table_values.zeek b/testing/btest/bifs/table_values.zeek index 942772eb2a..39dc1c1371 100644 --- a/testing/btest/bifs/table_values.zeek +++ b/testing/btest/bifs/table_values.zeek @@ -4,15 +4,14 @@ event zeek_init() { - local t = table( + local t1: table[count] of string = table([5] = "test", [0] = "example"); + local t2 = table( ["web"] = { [80/tcp, "http"], [443/tcp, "https"] }, - ["login"] = { [21/tcp, "ftp"], [23/tcp, "telnet"] } - ); + ["login"] = { [21/tcp, "ftp"], [23/tcp, "telnet"] }); - local v: vector of set[port, string] = table_values(t); + local v1: vector of set[string] = table_values(t1); + local v2: vector of set[port, string] = table_values(t2); - for ( i in v ) - { - print v[i]; - } - } \ No newline at end of file + print v1; + print v2; + }