Ethereal-dev: Re: [Ethereal-dev] is there skeleton code for creating two-level subtree in diss

Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.

From: Guy Harris <gharris@xxxxxxxxx>
Date: Thu, 27 Dec 2001 13:16:01 -0800
On Thu, Dec 27, 2001 at 10:09:37AM -0600, bgp4news@xxxxxxxxx wrote:
>     I am writing a new dissector, it works fine when only one level 
> tree was created. But, after adding two more levels of subtree, it 
> always  core dump, although it shows summary correctly, I knew 
> something was wrong with setting constants or registering, however 
> reading README.developer didn't help me solve this one. Is there a 
> skeleton code for multi-level creation ? 
> 
>     Here is the core.
> #0  0x88610030 in kill () from /usr/lib/libc.so.4
> #1  0x88648f7e in abort () from /usr/lib/libc.so.4
> #2  0x884eb17a in g_logv () from /usr/local/lib/libglib12.so.3
> #3  0x884eb231 in g_log () from /usr/local/lib/libglib12.so.3
> #4  0x81b1a00 in get_uint_value (tvb=0x83c5cb4, offset=40, length=
> 32, 
>     little_endian=0) at proto.c:472
> #5  0x81b1bba in proto_tree_add_item (tree=0x83c7450, hfindex=4582, 
>     tvb=0x83c5cb4, start=40, length=32, little_endian=0) at 
> proto.c:566

The problem you're having has nothing to do with adding two levels of
subtree.

It has to do with the fact that Ethereal supports 1-byte, 2-byte,
3-byte, and 4-byte integer values, but doesn't support 32-byte integer
values...

...and the "length" argument to "proto_tree_add_item()" is the length of
the integer item *in bytes*.

"get_uint_value()" is aborting because it's detected that your code is
incorrect; it would have been incorrect even if you'd put it at the top
level of the tree.

If the item in question is truly a 32-byte item, you have to make it an
item of type FT_BYTES, for example, rather than FT_UINT8 or FT_UINT16 or
FT_UINT24 or FT_UINT32.  (Yes, you could argue that it's confusing that
the number after FT_UINT8 is the size in bits rather than the size in
bytes, given that the length in "proto_tree_add_item()" is in bytes, but
so it goes....)

If it's a 32-*bit* item, pass an "length" argument of 4, rather than 32,
to "proto_tree_add_item()".