[Bro-Dev] [BinPac] ParserBuffer with case not producing correct code

Martina Balintova balint.martina at gmail.com
Thu Jun 5 03:54:56 PDT 2014


Hi,
binpac parser for flow (flowunit) has probably small bug. In my
foo-protocol.pac, I have record like this:
// foo.pac
flow FOO_Flow(is_orig: bool)
{
    flowunit = FOO_PDU(is_orig) withcontext(connection, this);
};

// foo-protocol.pac
type FOO_PDU(is_orig: bool) = record {
    header:        FOO_Header(is_orig);
    xbody:        case header.flag of {
        1 ->    plain_body: FOO_Body(header);
        0 ->    encrypt_body: Encrypted_Body;
    } &length = header.length &requires (header.flag);
} &byteorder = bigendian;

Code that I am getting after binpac parsing is something like this:
FOO_PDU::FOO_PDU(bool is_orig)
        {
        header_ = 0;
        xbody_case_index_ = -1;
        plain_body_ = 0;
        encrypt_body_ = 0;
        buffering_state_ = 0;
        buffering_state_ = 0;
        is_orig_ = is_orig;
        byteorder_ = bigendian;
        proc_foo_header_ = 0;
        parsing_state_ = 0;
        parsing_state_ = 0;
        }

bool FOO_PDU::ParseBuffer(flow_buffer_t t_flow_buffer, ContextFOO *
t_context)
        {
// SOME CODE ...
// switch ( parsing_state_ ) {
// ... case 0: ...
    case 1:
                {
                bool t_header_parsing_complete;
                t_header_parsing_complete = false;
                while ( ! t_header_parsing_complete &&
t_flow_buffer->ready() )
                        {
// SOME MORE CODE
                        }
                if ( ! (t_header_parsing_complete) )
                        goto need_more_data;
                }

                // Parse "xbody"
                if ( ! xbody_ )
                        {
                        }
// SOME MORE CODE here

As you can see, compiler is complaining that error: ‘xbody_’ was not
declared in this scope. It is missing in constructor of FOO_PDU. When I
checked snmp analyzer, It is doing this process correctly in
int v3Header::Parse(const_byteptr const t_begin_of_data, const_byteptr
const t_end_of_data, ContextSNMP * t_context)
 - it does not check for  scoped_pdu_data_.
Could you help me to find out what am I doing incorrectly?
Thank you
Martina
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mailman.icsi.berkeley.edu/pipermail/bro-dev/attachments/20140605/20c94b3d/attachment.html 


More information about the bro-dev mailing list