Ethereal-dev: Re: [Ethereal-dev] Regarding Memory allocation

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 Jan 2005 23:23:09 -0800
harshas wrote:

Using ethereal I could read a captureed file with 'n' number of packets (header and rawbytes). 1. My question is Ethereal dissection routine is called only when a packet is selected randomly through seek_read routine.

No. When the file is first read in, the dissection routine is called for *every* packet in the file. It's also called when:

	a packet is selected randomly;

	a packet is processed if you run a display filter;

	a packet is processed when the display is being changed;

a packet is processed when the dissection is redone because a protocol preference is changed;

	etc.

The raw bytes present in the tvbuff will
 be accessed and decoded. is it right?

Every time the dissectors are called for a packet, tvbuffs are constructed for packet data, and they are accessed and decoded.

2. If so Every time a packet is selected randomly ethereal dissector will get the corresponding raw bytes of the packet from tvbuff . Whether the bytes are read from the captured file each time when seek read is called or all the bytes of all the packets are read once during the file read?.

During the file read, all the bytes of all the packets are read, and a tvbuff is constructed from the packet data.

After the file has been read, for each packet that's processed by whatever processing is done, the bytes of the packet are read, and a tvbuff is constructed from the packet data. (If, for example, the data in all the packets is being printed, all the bytes of all the packets are read; that's done with the seek_read routine, but, in effect, it's sequential, not random, in that particular case.)

3. If read once during the file read How the raw bytes of the individual packets are stored?

They're stored only in the file.  They are not stored in memory.

When packet reassembly is done, the reassembled bytes are *currently* stored in memory. However, there is no guarantee that this will continue to be the case.

Dissectors should make no assumptions about the persistence of the data in the packets. They should assume that any data in the tvbuff they are supplied might not be in memory after the dissector returns.

(See

	http://www.moma.org/collection/depts/paint_sculpt/blowups/paint_sculpt_016.html

for information on The Persistence of Memory. :-))

If the number of packets and the corresponding bytes are more will ethereal gives any overflow message?

As the raw packet data from the file isn't stored in memory, there won't be an overflow for that data. There might be an overflow for packet data if reassembly is done; unfortunately, as the memory allocation is done with GLib's "g_malloc()", the "overflow message" is an abort message when the program crashes. (We should probably figure out a general way of handling out-of-memory conditions, and not use "g_malloc()". Unfortunately, many of the GLib data structures, such as hash tables, used by dissectors *also* use "g_malloc()", so changing the dissectors not to use "g_malloc()" won't completely protect us from those aborts - and, as GTK+ also uses "g_malloc()", even ceasing to use any of the GLib data structures and routines that use "g_malloc()" won't completely protect Ethereal from those aborts.)