[Bro-Dev] #378: Test for problem with optional record fields.

Bro Tracker bro at tracker.bro-ids.org
Fri Aug 5 15:10:34 PDT 2011


#378: Test for problem with optional record fields.
--------------------------------+--------------------
  Reporter:  robin              |      Owner:
      Type:  Test Case Missing  |     Status:  new
  Priority:  Normal             |  Milestone:  Bro1.6
 Component:  Bro                |    Version:
Resolution:                     |   Keywords:
--------------------------------+--------------------

Comment (by jsiwek):

 This test case was still failing so I looked into it a bit.  This is the
 essential part of the bro script that triggers it:

 {{{
 type FOO: record {
     a: count;
     b: count &optional;
 };

 local set_of_foo: set[FOO] = set();

 add set_of_foo[[$a=4, $b=5]];

 print set_of_foo;
 }}}

 What happens is when the value is assigned to the set in
 `TableVal::Assign`, part of the `HashKey` computed from that `add`ed
 `RecordVal` index value takes into consideration whether the fields in the
 value's associated `RecordType` have the `&optional` attribute.  In this
 case, the hash is computed thinking there's no optional fields (due to the
 implicit/coerced typing?).  Now when using that `HashKey` to try to
 recover an item during the `print` statement, it thinks the size of the
 key is wacky because it's suddenly taking into account the `&optional`
 attribute of the `FOO` `RecordType` used as the set's index type.

 I can get everything to work if the computation and recovery both agree to
 use the set's index type like this:

 {{{
 diff --git a/src/CompHash.cc b/src/CompHash.cc
 index 605949b..9c06656 100644
 --- a/src/CompHash.cc
 +++ b/src/CompHash.cc
 @@ -169,7 +169,7 @@ char* CompositeHash::SingleValHash(int type_check,
 char* kp0,
             {
             char* kp = kp0;
             RecordVal* rv = v->AsRecordVal();
 -           RecordType* rt = v->Type()->AsRecordType();
 +           RecordType* rt = bt->AsRecordType();
             int num_fields = rt->NumFields();

             for ( int i = 0; i < num_fields; ++i )
 }}}

 But I'm wondering if before the `ComputeHash` part happens, the `add`ed
 index value's type should have already been coerced into the actual record
 type that's being used for the set, including the attributes of all the
 fields?  Because right now it looks like the type of the added value
 includes all the right fields, just not the attributes.

-- 
Ticket URL: <http://tracker.bro-ids.org/bro/ticket/378#comment:2>
Bro Tracker <http://tracker.bro-ids.org/bro>
Bro Issue Tracker



More information about the bro-dev mailing list