Ethereal-dev: Re: [Ethereal-dev] Re: [Ethereal-cvs] rev 13924: /trunk/epan/dissectors/: packet
On Mar 27, 2005, at 0:23 Uhr, Guy Harris wrote:
Michael Tuexen wrote:
Have the main loop for dissecting chunks check that the chunk size
is
large enough for the chunk header, and have it pass the chunk size,
minus the size of the chunk header, to dissectors for particular
chunk
types. Make those dissectors check that value to make sure it's
large
enough for any fixed-length portion before subtracting the length of
that portion and using the result as a remaining data length.
Why?
So that the individual chunk dissectors don't each have to check
whether the chunk length is less than the chunk header size.
They weren't doing so - they were just (re-)fetching the chunk size
and subtracting the chunk header length from it, which, for corrupt
packets (such as the ones generated by the randpkt tests done by the
buildbot), means that the length might be *negative*.
The check to make sure the length is correct *HAS* to be done if
you're going to subtract something from the chunk length. There's not
much point in requiring each chunk dissector to make sure the chunk
length is >= CHUNK_HEADER_LENGTH - they'd *ALL* have to make that
check, and, if they have to make that check, we run the risk of
somebody adding a new chunk type dissector, if a new chunk type is
defined, and forgetting to make the check.
Hmm. I have no problems with the checks here, I already played some
time ago with
the idea to insert some macros to check the length in each dissector
but what I want
is to raise an exception, because I think people are used to the
'Malformed frame'
in case they are sending wrong packets. (I also want to check for too
long packets).
Or is this the wrong way? I did not figure out a good way to raise the
exception...
The SCTP dissector has seen a lot of bogus packets but always handled
them using the
exception. It did not crash... or made ethereal exiting...
The principle I used was
- if the chunk is too short I'll try sooner or later to access a
non-existing field
and an exception will be raised.
- if the chunk is too long, I'll ignore it ...
Why did it work? Or was it only luck?
The principle I based the dissector on was that if the tvb is too
short
I will call proto_tree_add_item() with an index out of bound. This
raised
the 'malformed frame' exception and that is fine.
Unfortunately, that wasn't helping here. Instead, negative lengths
were being handed to various proto_tree_ routines, which:
before Ulf's changes to use the DISSECTOR_ASSERT macros, caused
g_assert()s to fail, causing core dumps, which is not fine;
after Ulf's changes to use the DISSECTOR_ASSERT macros, caused
"Dissector bug" messages to be produced, which is not fine, especially
when those messages started to be caught by the randpkt tests and
mailed to ethereal-dev as buildbot crash messages.
I have never seen ethereal core dumping on bogus SCTP packets, it
displayed always
'Malformed frame'.
The old style was used with some thinking to handle the different
cases
of chunk length values and the length of the tvbs (which is not
always equal) correctly.
Unfortunately, it wasn't handling too-short chunk lengths correctly,
as per the above.
The common chunk dissector is *ONLY* checking against
CHUNK_HEADER_LENGTH. The individual chunk dissectors are checking
against the appropriate length for the type of chunk in question.
_______________________________________________
Ethereal-dev mailing list
Ethereal-dev@xxxxxxxxxxxx
http://www.ethereal.com/mailman/listinfo/ethereal-dev