GH-598: handle multi-key sets correctly when outputting json

This commit is contained in:
Tim Wojtulewicz 2019-09-26 11:31:01 -07:00
parent 95489d52d8
commit 756f363185
3 changed files with 14 additions and 17 deletions

View file

@ -543,28 +543,21 @@ static ZeekJson BuildJSON(Val* val, bool only_loggable=false, RE_Matcher* re=new
auto lv = tval->RecoverIndex(k); auto lv = tval->RecoverIndex(k);
delete k; delete k;
Val* entry_key;
if ( lv->Length() == 1 )
entry_key = lv->Index(0)->Ref();
else
entry_key = lv->Ref();
ZeekJson key_json = BuildJSON(entry_key, only_loggable, re);
if ( tval->Type()->IsSet() ) if ( tval->Type()->IsSet() )
{ {
auto* value = lv->Index(0)->Ref(); j.push_back(key_json);
j.push_back(BuildJSON(value, only_loggable, re));
Unref(value);
} }
else else
{ {
ZeekJson key_json; Val* entry_value = tval->Lookup(entry_key, true);
Val* entry_value;
if ( lv->Length() == 1 )
{
Val* entry_key = lv->Index(0)->Ref();
entry_value = tval->Lookup(entry_key, true);
key_json = BuildJSON(entry_key, only_loggable, re);
Unref(entry_key);
}
else
{
entry_value = tval->Lookup(lv, true);
key_json = BuildJSON(lv, only_loggable, re);
}
string key_string; string key_string;
if ( key_json.is_string() ) if ( key_json.is_string() )
@ -575,6 +568,7 @@ static ZeekJson BuildJSON(Val* val, bool only_loggable=false, RE_Matcher* re=new
j[key_string] = BuildJSON(entry_value, only_loggable, re); j[key_string] = BuildJSON(entry_value, only_loggable, re);
} }
Unref(entry_key);
Unref(lv); Unref(lv);
} }

View file

@ -33,6 +33,7 @@ true
["1.2.3.4"] ["1.2.3.4"]
[{"s":"test"}] [{"s":"test"}]
[{"s":"test"}] [{"s":"test"}]
[["three",3],["one",1],["two",2]]
{} {}
{"2":"10.2.2.2","1":"10.1.1.1"} {"2":"10.2.2.2","1":"10.1.1.1"}
{"10.1.1.1":{"a":1},"10.2.2.2":{"b":2}} {"10.1.1.1":{"a":1},"10.2.2.2":{"b":2}}

View file

@ -105,11 +105,13 @@ event zeek_init()
local st3: set[addr] = set(1.2.3.4); local st3: set[addr] = set(1.2.3.4);
local st4: set[myrec1] = set(myrec1($s="test")); local st4: set[myrec1] = set(myrec1($s="test"));
local st5: set[myrec1] = set(myrec1($s="test", $c=2)); local st5: set[myrec1] = set(myrec1($s="test", $c=2));
local st6: set[string, count] = { ["one", 1], ["two", 2], ["three", 3] };
print to_json(st1); print to_json(st1);
print to_json(st2); print to_json(st2);
print to_json(st3); print to_json(st3);
print to_json(st4); print to_json(st4);
print to_json(st5, T); print to_json(st5, T);
print to_json(st6);
# Tables # Tables
local ta1: table[count] of addr = table(); local ta1: table[count] of addr = table();