Ethereal-dev: Re: [Ethereal-dev] need help with tvb exceptions

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: Sun, 14 Nov 2004 13:29:04 -0800
Andy Howell wrote:
My dissector gets part way through a packet and then shows [ Malformed Packet: mypacket ]

I tried doing a printf of the tvb_get_remaining()

Which failed, because there's no such routine as "tvb_get_remaining()".

You presumably either meant "tvb_length_remaining()" or "tvb_reported_length_remaining()"; which of the two did you use?

just after the last item that was added. It reports I have 48 bytes left. The next thing I do is tvb_get_ntohs, but since it never reaches the following statement, I assume its generating an exception.

If "tvb_length_remaining(tvb, offset)" returns 48, then "tvb_get_ntohs(tvb, offset)" should not generate an exception, and neither should "tvb_get_ntohs(tvb, offset+46)" or any "tvb_get_ntohs()" call with an offset in the range "offset" through "offset+46". A "tvb_get_ntohs()" call with an offset larger than "offset+46" will, and *should*, throw an exception.

If "tvb_reported_length_remaining(tvb, offset)" returns 48, then "tvb_get_ntohs(tvb, offset)" can throw an exception - and, if it does, it's because it *should* throw an exception. However, the exception it throws should get the packet reported as a "Short frame", not a "Malformed packet", because the problem it's reporting is that the packet was captured with a snapshot length that didn't allow all of the packet's data to be captured. (The fact that it causes an exception to be thrown does *NOT* mean the dissector should use "tvb_length_remaining()", so that no exception is thrown; the exception here is a feature, not a bug, as it makes it clear to the user that they do *NOT* have all of the data in the packet, and that if they need all of the data in the packet they need a capture with a larger snapshot length, so it means that the dissector should be using "tvb_reported_length_remaining()".)