On Wed, Aug 15, 2012 at 11:36 AM, Jakub Zawadzki
<darkjames...@darkjames.pl> wrote:
> On Wed, Aug 15, 2012 at 10:22:13AM -0400, Evan Huus wrote:
>> On Wed, Aug 15, 2012 at 9:53 AM, Jakub Zawadzki
>> <darkjames...@darkjames.pl> wrote:
>> > From commit r42254 (reference counting of edt)
>> > we have problem with ep_ memory not being returned to pool after 
>> > dissecting packet.
>> > Wireshark after initial opening file, always keep edt for currently 
>> > selected packet,
>> > so edt_refs is always > 0.
>> >
>> > You can reproduce it by loading some bigger files, and several times open 
>> > expert
>> > or conversation window.
>> >
>> > After r43188 (not part of wireshark-1.8) affected is also filtering (if at 
>> > least one packet
>> > match filter), or selecting other packets.
>>
>> I'm not sure I follow. Are we calling epan_dissect_run() for each
>> packet selected without calling
>> epan_dissect_cleanup()/epan_dissect_init() in between?
>
> From r43188 sequence of selecting new packet (cf_select_packet() in file.c) 
> is:
>    cf_read_frame()
>    old_edt = cf->edt;
>    cf->edt = epan_dissect_new()                ; edt_refs++
>    epan_dissect_run(cf->edt, ...)
>    if (old_edt)
>      epan_dissect_free(old_edt);               ; edt_refs--  (edt_refs != 0, 
> no gc)
>
> Old code was doing something like:
>    cf_read_frame()
>    epan_dissect_free(cf->edt);               ; edt_refs--    (likely edt_refs 
> == 0, gc ep memory)
>    cf->edt = epan_dissect_new()              ; edt_refs++
>
> I have working fix for this, but check below.

Based on the log for r43188 I expect there's someway to force clear
the GtkTreeStore, so that old_edt can be unrefed (triggering a gc)
before cf->edt is re-allocated?

Is your fix checked in or attached to a bug somewhere?

>> I understand that to be a bug in the caller, not a bug in ep_'s memory 
>> manager, or
>> did r42254 change the behaviour of the API in an unexpected way?
>
> cf_select_packet() don't call epan_dissect_free() but holds edt reference in 
> cf->edt,
> so if we have selected packet than edt_refs > 0 (this is also true before 
> r43188).

Yes, I understand now.

> If in such situation we do something which requires redissecting lot of 
> packet (or do it several times)
> wireshark will eat all your memory ;-)
>
> I think it'd be best if each dissection have unique, single ep_pool (no 
> ref-counting),
> but it's lot of work, so we need some workaround, also for 1.8 ;/

Agreed that this is desirable. Not 100% sure how much work it will be
- does it make sense to attach the ep_ memory pool to the edt struct,
and then just have a global stack whose top tracks the 'active' edt?

I was going to suggest just a global var to track the active edt, but
remembered that some weird nesting conditions were what required the
ref-counting in the first place. I think a stack should take care of
that?

Evan
___________________________________________________________________________
Sent via:    Wireshark-dev mailing list <wireshark-dev@wireshark.org>
Archives:    http://www.wireshark.org/lists/wireshark-dev
Unsubscribe: https://wireshark.org/mailman/options/wireshark-dev
             mailto:wireshark-dev-requ...@wireshark.org?subject=unsubscribe

Reply via email to