From 7e3991d8793f104f4ea30382c98da7858e6d1644 Mon Sep 17 00:00:00 2001 From: Daniel Thayer Date: Tue, 10 May 2016 15:37:50 -0500 Subject: [PATCH] Fix a bug in receiving remote logs via broker When receiving a remote log via broker, there was a bug that would prevent a log from being written if the log record contained a field without the &log attribute that was followed by a field with the &log attribute. Updated a test case to catch this error. --- src/broker/Data.cc | 9 ++++++--- .../btest/Baseline/broker.remote_log/recv.recv.out | 12 ++++++------ testing/btest/broker/remote_log.test | 2 +- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/broker/Data.cc b/src/broker/Data.cc index fe3f271c49..bc4197a974 100644 --- a/src/broker/Data.cc +++ b/src/broker/Data.cc @@ -318,25 +318,27 @@ struct val_converter { auto rt = type->AsRecordType(); auto rval = new RecordVal(rt); + auto idx = 0u; for ( auto i = 0u; i < static_cast(rt->NumFields()); ++i ) { if ( require_log_attr && ! rt->FieldDecl(i)->FindAttr(ATTR_LOG) ) continue; - if ( i >= a.fields.size() ) + if ( idx >= a.fields.size() ) { Unref(rval); return nullptr; } - if ( ! a.fields[i] ) + if ( ! a.fields[idx] ) { rval->Assign(i, nullptr); + ++idx; continue; } - auto item_val = bro_broker::data_to_val(move(*a.fields[i]), + auto item_val = bro_broker::data_to_val(move(*a.fields[idx]), rt->FieldType(i)); if ( ! item_val ) @@ -346,6 +348,7 @@ struct val_converter { } rval->Assign(i, item_val); + ++idx; } return rval; diff --git a/testing/btest/Baseline/broker.remote_log/recv.recv.out b/testing/btest/Baseline/broker.remote_log/recv.recv.out index ef9cb8402d..2f4a31df51 100644 --- a/testing/btest/Baseline/broker.remote_log/recv.recv.out +++ b/testing/btest/Baseline/broker.remote_log/recv.recv.out @@ -1,6 +1,6 @@ -wrote log, [msg=ping, num=0, nolog=no] -wrote log, [msg=ping, num=1, nolog=no] -wrote log, [msg=ping, num=2, nolog=no] -wrote log, [msg=ping, num=3, nolog=no] -wrote log, [msg=ping, num=4, nolog=no] -wrote log, [msg=ping, num=5, nolog=no] +wrote log, [msg=ping, nolog=no, num=0] +wrote log, [msg=ping, nolog=no, num=1] +wrote log, [msg=ping, nolog=no, num=2] +wrote log, [msg=ping, nolog=no, num=3] +wrote log, [msg=ping, nolog=no, num=4] +wrote log, [msg=ping, nolog=no, num=5] diff --git a/testing/btest/broker/remote_log.test b/testing/btest/broker/remote_log.test index 52a534c8f9..f43e7b398b 100644 --- a/testing/btest/broker/remote_log.test +++ b/testing/btest/broker/remote_log.test @@ -19,8 +19,8 @@ export { type Info: record { msg: string &log; - num: count &log; nolog: string &default="no"; + num: count &log; }; global log_test: event(rec: Test::Info);