Wireshark-dev: Re: [Wireshark-dev] Removal of pinfo->private_data
From: Jeff Morriss <jeff.morriss.ws@xxxxxxxxx>
Date: Wed, 26 Nov 2014 11:42:48 -0500
On 11/25/14 11:43, mmann78@xxxxxxxxxxxx wrote:
necessary and how many were "copy/paste imitators".  Some also
copy/pasted the same comment that was (paraphrasing) "Don't let
exceptions thrown by subdissectors get in our way of continuing to
dissect".  I've always thought of TRY/CATCH blocks as a "performance
hit" and that they should be avoided whenever possible.  However, when I
I'm glad I'm not the only one who has thought that about the performance 
impact.  Though I think the last time I said it someone questioned 
whether it's really true or not (anyway I now have a question in the 
back of my mind about its validity).
was cleaning up the "save & restore uses" of pinfo->private_data
(https://code.wireshark.org/review/5486/), a quick glance at the code
around it gave me the impression the TRY/CATCH blocks may still be
legitimate.
There are still other dissectors that have TRY/CATCH blocks to restore
other members of the packet_info structure (so I guess those have to
stay), but I wasn't sure if now would be the time to evaluate the use of
the TRY/CATCH blocks and possibly eliminate some.  What should the
reasons be for a dissector to use a TRY/CATCH block and is just "fear of
a malformed packet in a subdissector's tvb" enough?  Should dissectors
some how be "protected" before/after calls to call_dissector() (and
similar) so they can do their "save & restore" before/after that call?
That was the reason for at least some of them, especially the saving and 
restoration of private_data.  I started adding that years ago because I 
ran into a situation where a subdissector had modified private_data 
(changing it from a pointer to an integer) and then threw an exception 
(so it failed to restore private_data to its old value).  Of course 
someone later accessed private_data assuming it to still be a pointer 
which resulted in a segmentation violation.
(My assumption was other dissectors might have the same problem though 
it might end in a less violent but also much less clear way: 
private_data might still be a pointer but it might point to something 
wrong leading to really weird behavior.)
Having an automatic push/pop of (copies of) pinfo certainly would make 
it much less error prone.  Though it also might cost more in 
performance, at least for normal captures where exceptions aren't common.