diff options
-rw-r--r-- | epan/packet.c | 122 | ||||
-rw-r--r-- | packet-clnp.c | 59 | ||||
-rw-r--r-- | packet-icmpv6.c | 72 | ||||
-rw-r--r-- | packet-ip.c | 78 | ||||
-rw-r--r-- | packet-ppp.c | 56 |
5 files changed, 142 insertions, 245 deletions
diff --git a/epan/packet.c b/epan/packet.c index ab50d0a614..7969171aae 100644 --- a/epan/packet.c +++ b/epan/packet.c @@ -1,7 +1,7 @@ /* packet.c * Routines for packet disassembly * - * $Id: packet.c,v 1.84 2002/12/08 02:32:36 gerald Exp $ + * $Id: packet.c,v 1.85 2003/01/20 05:42:37 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -335,6 +335,29 @@ struct dissector_handle { int proto_index; }; +static int +call_dissector_through_handle(dissector_handle_t handle, tvbuff_t *tvb, + packet_info *pinfo, proto_tree *tree) +{ + int ret; + + if (handle->is_new) + ret = (*handle->dissector.new)(tvb, pinfo, tree); + else { + (*handle->dissector.old)(tvb, pinfo, tree); + ret = tvb_length(tvb); + if (ret == 0) { + /* + * XXX - a tvbuff can have 0 bytes of data in + * it, so we have to make sure we don't return + * 0. + */ + ret = 1; + } + } + return ret; +} + /* * Call a dissector through a handle. * If the protocol for that handle isn't enabled, return 0 without @@ -349,7 +372,14 @@ call_dissector_work(dissector_handle_t handle, tvbuff_t *tvb, { const char *saved_proto; guint16 saved_can_desegment; - int ret; + volatile int ret; + gboolean save_writable; + volatile address save_dl_src; + volatile address save_dl_dst; + volatile address save_net_src; + volatile address save_net_dst; + volatile address save_src; + volatile address save_dst; if (handle->proto_index != -1 && !proto_is_protocol_enabled(handle->proto_index)) { @@ -375,19 +405,87 @@ call_dissector_work(dissector_handle_t handle, tvbuff_t *tvb, pinfo->current_proto = proto_get_protocol_short_name(handle->proto_index); } - if (handle->is_new) - ret = (*handle->dissector.new)(tvb, pinfo, tree); - else { - (*handle->dissector.old)(tvb, pinfo, tree); - ret = tvb_length(tvb); - if (ret == 0) { + + if (pinfo->in_error_pkt) { + /* + * This isn't a packet being transported inside + * the protocol whose dissector is calling us, + * it's a copy of a packet that caused an error + * in some protocol included in a packet that + * reports the error (e.g., an ICMP Unreachable + * packet). + */ + + /* + * Save the current state of the writability of + * the columns, and restore them after the + * dissector returns, so that the columns + * don't reflect the packet that got the error, + * they reflect the packet that reported the + * error. + */ + save_writable = col_get_writable(pinfo->cinfo); + col_set_writable(pinfo->cinfo, FALSE); + save_dl_src = pinfo->dl_src; + save_dl_dst = pinfo->dl_dst; + save_net_src = pinfo->net_src; + save_net_dst = pinfo->net_dst; + save_src = pinfo->src; + save_dst = pinfo->dst; + + /* Dissect the contained packet. */ + TRY { + ret = call_dissector_through_handle(handle, tvb, + pinfo, tree); + } + CATCH(BoundsError) { /* - * XXX - a tvbuff can have 0 bytes of data in - * it, so we have to make sure we don't return - * 0. + * Restore the column writability and addresses. */ - ret = 1; + col_set_writable(pinfo->cinfo, save_writable); + pinfo->dl_src = save_dl_src; + pinfo->dl_dst = save_dl_dst; + pinfo->net_src = save_net_src; + pinfo->net_dst = save_net_dst; + pinfo->src = save_src; + pinfo->dst = save_dst; + + /* + * Restore the current protocol, so any + * "Short Frame" indication reflects that + * protocol, not the protocol for the + * packet that got the error. + */ + pinfo->current_proto = saved_proto; + + /* + * Restore the desegmentability state. + */ + pinfo->can_desegment = saved_can_desegment; + + /* + * Rethrow the exception, so this will be + * reported as a short frame. + */ + RETHROW; + } + CATCH(ReportedBoundsError) { + ; /* do nothing */ } + ENDTRY; + + col_set_writable(pinfo->cinfo, save_writable); + pinfo->dl_src = save_dl_src; + pinfo->dl_dst = save_dl_dst; + pinfo->net_src = save_net_src; + pinfo->net_dst = save_net_dst; + pinfo->src = save_src; + pinfo->dst = save_dst; + } else { + /* + * Just call the subdissector. + */ + ret = call_dissector_through_handle(handle, tvb, pinfo, tree); } pinfo->current_proto = saved_proto; pinfo->can_desegment = saved_can_desegment; diff --git a/packet-clnp.c b/packet-clnp.c index b06b5893a0..ca32671549 100644 --- a/packet-clnp.c +++ b/packet-clnp.c @@ -1,7 +1,7 @@ /* packet-clnp.c * Routines for ISO/OSI network and transport protocol packet disassembly * - * $Id: packet-clnp.c,v 1.63 2003/01/05 02:50:23 guy Exp $ + * $Id: packet-clnp.c,v 1.64 2003/01/20 05:42:30 guy Exp $ * Laurent Deniel <deniel@worldnet.fr> * Ralf Schneider <Ralf.Schneider@t-online.de> * @@ -86,6 +86,7 @@ static const fragment_items clnp_frag_items = { "segments" }; +static dissector_handle_t clnp_handle; static dissector_handle_t data_handle; /* @@ -1617,15 +1618,9 @@ static void dissect_clnp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) gint len; guint next_length; proto_tree *discpdu_tree; - volatile address save_dl_src; - volatile address save_dl_dst; - volatile address save_net_src; - volatile address save_net_dst; - volatile address save_src; - volatile address save_dst; gboolean save_in_error_pkt; fragment_data *fd_head; - tvbuff_t *volatile next_tvb; + tvbuff_t *next_tvb; gboolean update_col_info = TRUE; gboolean save_fragmented; @@ -1942,22 +1937,10 @@ static void dissect_clnp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) if (tree) { next_length = tvb_length_remaining(tvb, offset); if (next_length != 0) { - /* We have payload; dissect it. - Make the columns non-writable, so the packet isn't shown - in the summary based on what the discarded PDU's contents - are. */ - col_set_writable(pinfo->cinfo, FALSE); - - /* Also, save the current values of the addresses, and restore - them when we're finished dissecting the contained packet, so - that the address columns in the summary don't reflect the - contained packet, but reflect this packet instead. */ - save_dl_src = pinfo->dl_src; - save_dl_dst = pinfo->dl_dst; - save_net_src = pinfo->net_src; - save_net_dst = pinfo->net_dst; - save_src = pinfo->src; - save_dst = pinfo->dst; + /* We have payload; dissect it. */ + ti = proto_tree_add_text(clnp_tree, tvb, offset, next_length, + "Discarded PDU"); + discpdu_tree = proto_item_add_subtree(ti, ett_clnp_disc_pdu); /* Save the current value of the "we're inside an error packet" flag, and set that flag; subdissectors may treat packets @@ -1966,34 +1949,10 @@ static void dissect_clnp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) save_in_error_pkt = pinfo->in_error_pkt; pinfo->in_error_pkt = TRUE; - /* Dissect the contained packet. - Catch ReportedBoundsError, and do nothing if we see it, - because it's not an error if the contained packet is short; - there's no guarantee that all of it was included. - - XXX - should catch BoundsError, and re-throw it after cleaning - up. */ - ti = proto_tree_add_text(clnp_tree, tvb, offset, next_length, - "Discarded PDU"); - discpdu_tree = proto_item_add_subtree(ti, ett_clnp_disc_pdu); - TRY { - dissect_clnp(next_tvb, pinfo, discpdu_tree); - } - CATCH(ReportedBoundsError) { - ; /* do nothing */ - } - ENDTRY; + call_dissector(clnp_handle, next_tvb, pinfo, discpdu_tree); /* Restore the "we're inside an error packet" flag. */ pinfo->in_error_pkt = save_in_error_pkt; - - /* Restore the addresses. */ - pinfo->dl_src = save_dl_src; - pinfo->dl_dst = save_dl_dst; - pinfo->net_src = save_net_src; - pinfo->net_dst = save_net_dst; - pinfo->src = save_src; - pinfo->dst = save_dst; } } pinfo->fragmented = save_fragmented; @@ -2152,8 +2111,6 @@ void proto_register_cltp(void) void proto_reg_handoff_clnp(void) { - dissector_handle_t clnp_handle; - data_handle = find_dissector("data"); clnp_handle = create_dissector_handle(dissect_clnp, proto_clnp); diff --git a/packet-icmpv6.c b/packet-icmpv6.c index 3b311f0f6c..2fa4fd8615 100644 --- a/packet-icmpv6.c +++ b/packet-icmpv6.c @@ -1,7 +1,7 @@ /* packet-icmpv6.c * Routines for ICMPv6 packet disassembly * - * $Id: packet-icmpv6.c,v 1.68 2002/12/02 23:43:26 guy Exp $ + * $Id: packet-icmpv6.c,v 1.69 2003/01/20 05:42:30 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -116,71 +116,27 @@ static const value_string names_router_pref[] = { static void dissect_contained_icmpv6(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree) { - tvbuff_t *next_tvb; - volatile address save_dl_src; - volatile address save_dl_dst; - volatile address save_net_src; - volatile address save_net_dst; - volatile address save_src; - volatile address save_dst; gboolean save_in_error_pkt; + tvbuff_t *next_tvb; + + /* Save the current value of the "we're inside an error packet" + flag, and set that flag; subdissectors may treat packets + that are the payload of error packets differently from + "real" packets. */ + save_in_error_pkt = pinfo->in_error_pkt; + pinfo->in_error_pkt = TRUE; next_tvb = tvb_new_subset(tvb, offset, -1, -1); /* tiny sanity check */ if ((tvb_get_guint8(tvb, offset) & 0xf0) == 0x60) { - /* The contained packet is an IPv6 datagram; dissect it. - - Set the columns non-writable, so that the packet list - shows this as an ICMPv6 packet, not as the type of packet - for which the ICMPv6 packet was generated. */ - col_set_writable(pinfo->cinfo, FALSE); - - /* Also, save the current values of the addresses, and restore - them when we're finished dissecting the contained packet, so - that the address columns in the summary don't reflect the - contained packet, but reflect this packet instead. */ - save_dl_src = pinfo->dl_src; - save_dl_dst = pinfo->dl_dst; - save_net_src = pinfo->net_src; - save_net_dst = pinfo->net_dst; - save_src = pinfo->src; - save_dst = pinfo->dst; - - /* Save the current value of the "we're inside an error packet" - flag, and set that flag; subdissectors may treat packets - that are the payload of error packets differently from - "real" packets. */ - save_in_error_pkt = pinfo->in_error_pkt; - pinfo->in_error_pkt = TRUE; - - /* Dissect the contained packet. - Catch ReportedBoundsError, and do nothing if we see it, - because it's not an error if the contained packet is short; - there's no guarantee that all of it was included. - - XXX - should catch BoundsError, and re-throw it after cleaning - up. */ - TRY { - call_dissector(ipv6_handle, next_tvb, pinfo, tree); - } - CATCH(ReportedBoundsError) { - ; /* do nothing */ - } - ENDTRY; - - /* Restore the "we're inside an error packet" flag. */ - pinfo->in_error_pkt = save_in_error_pkt; - - /* Restore the addresses. */ - pinfo->dl_src = save_dl_src; - pinfo->dl_dst = save_dl_dst; - pinfo->net_src = save_net_src; - pinfo->net_dst = save_net_dst; - pinfo->src = save_src; - pinfo->dst = save_dst; + /* The contained packet is an IPv6 datagram; dissect it. */ + call_dissector(ipv6_handle, next_tvb, pinfo, tree); } else call_dissector(data_handle,next_tvb, pinfo, tree); + + /* Restore the "we're inside an error packet" flag. */ + pinfo->in_error_pkt = save_in_error_pkt; } static void diff --git a/packet-ip.c b/packet-ip.c index 65403c6cfe..bef1c05e3a 100644 --- a/packet-ip.c +++ b/packet-ip.c @@ -1,7 +1,7 @@ /* packet-ip.c * Routines for IP and miscellaneous IP protocol packet disassembly * - * $Id: packet-ip.c,v 1.179 2003/01/19 22:21:01 guy Exp $ + * $Id: packet-ip.c,v 1.180 2003/01/20 05:42:30 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -1304,14 +1304,6 @@ dissect_icmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) guint8 num_addrs = 0; guint8 addr_entry_size = 0; int i; - gboolean save_writable; - const char *save_current_proto; - volatile address save_dl_src; - volatile address save_dl_dst; - volatile address save_net_src; - volatile address save_net_dst; - volatile address save_src; - volatile address save_dst; gboolean save_in_error_pkt; tvbuff_t *next_tvb; @@ -1496,31 +1488,6 @@ dissect_icmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) case ICMP_PARAMPROB: case ICMP_SOURCEQUENCH: case ICMP_REDIRECT: - /* Decode the IP header and first 64 bits of data from the - original datagram. - - Set the columns non-writable, so that the packet list - shows this as an ICMP packet, not as the type of packet - for which the ICMP packet was generated. Save the current - setting, so we can restore it after we're done. */ - save_writable = col_get_writable(pinfo->cinfo); - col_set_writable(pinfo->cinfo, FALSE); - - /* Save the current protocol string as well, and restore it - after we're done. */ - save_current_proto = pinfo->current_proto; - - /* Also, save the current values of the addresses, and restore - them when we're finished dissecting the contained packet, so - that the address columns in the summary don't reflect the - contained packet, but reflect this packet instead. */ - save_dl_src = pinfo->dl_src; - save_dl_dst = pinfo->dl_dst; - save_net_src = pinfo->net_src; - save_net_dst = pinfo->net_dst; - save_src = pinfo->src; - save_dst = pinfo->dst; - /* Save the current value of the "we're inside an error packet" flag, and set that flag; subdissectors may treat packets that are the payload of error packets differently from @@ -1528,50 +1495,13 @@ dissect_icmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) save_in_error_pkt = pinfo->in_error_pkt; pinfo->in_error_pkt = TRUE; - /* Dissect the contained packet. - Catch ReportedBoundsError, and do nothing if we see it, - because it's not an error if the contained packet is short; - there's no guarantee that all of it was included. */ + /* Decode the IP header and first 64 bits of data from the + original datagram. */ next_tvb = tvb_new_subset(tvb, 8, -1, -1); - TRY { - call_dissector(ip_handle, next_tvb, pinfo, icmp_tree); - } - CATCH(BoundsError) { - /* Restore the writability of the columns. */ - col_set_writable(pinfo->cinfo, save_writable); - - /* Restore the current protocol string. */ - pinfo->current_proto = save_current_proto; - - /* Restore the "we're inside an error packet" flag. */ - pinfo->in_error_pkt = save_in_error_pkt; - - /* Restore the addresses. */ - pinfo->dl_src = save_dl_src; - pinfo->dl_dst = save_dl_dst; - pinfo->net_src = save_net_src; - pinfo->net_dst = save_net_dst; - pinfo->src = save_src; - pinfo->dst = save_dst; - - /* Rethrow the exception, so this will be reported as a short frame */ - RETHROW; - } - CATCH(ReportedBoundsError) { - ; /* do nothing */ - } - ENDTRY; + call_dissector(ip_handle, next_tvb, pinfo, icmp_tree); /* Restore the "we're inside an error packet" flag. */ pinfo->in_error_pkt = save_in_error_pkt; - - /* Restore the addresses. */ - pinfo->dl_src = save_dl_src; - pinfo->dl_dst = save_dl_dst; - pinfo->net_src = save_net_src; - pinfo->net_dst = save_net_dst; - pinfo->src = save_src; - pinfo->dst = save_dst; break; case ICMP_ECHOREPLY: diff --git a/packet-ppp.c b/packet-ppp.c index 72eaeea55d..268ca868a6 100644 --- a/packet-ppp.c +++ b/packet-ppp.c @@ -1,7 +1,7 @@ /* packet-ppp.c * Routines for ppp packet disassembly * - * $Id: packet-ppp.c,v 1.105 2003/01/06 22:33:57 guy Exp $ + * $Id: packet-ppp.c,v 1.106 2003/01/20 05:42:30 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -2276,7 +2276,7 @@ dissect_cp( tvbuff_t *tvb, int proto_id, int proto_subtree_index, proto_tree *tree ) { proto_item *ti; - proto_tree *volatile fh_tree = NULL; + proto_tree *fh_tree = NULL; proto_item *tf; proto_tree *field_tree; @@ -2360,12 +2360,6 @@ dissect_cp( tvbuff_t *tvb, int proto_id, int proto_subtree_index, case PROTREJ: if(tree) { - volatile address save_dl_src; - volatile address save_dl_dst; - volatile address save_net_src; - volatile address save_net_dst; - volatile address save_src; - volatile address save_dst; gboolean save_in_error_pkt; tvbuff_t *next_tvb; @@ -2381,24 +2375,6 @@ dissect_cp( tvbuff_t *tvb, int proto_id, int proto_subtree_index, "Rejected packet (%d byte%s)", length, plurality(length, "", "s")); - /* Decode the rejected packet. - - Set the columns non-writable, so that the packet list - shows this as an LCP packet, not as the type of packet - for which the LCP packet was generated. */ - col_set_writable(pinfo->cinfo, FALSE); - - /* Also, save the current values of the addresses, and restore - them when we're finished dissecting the contained packet, so - that the address columns in the summary don't reflect the - contained packet, but reflect this packet instead. */ - save_dl_src = pinfo->dl_src; - save_dl_dst = pinfo->dl_dst; - save_net_src = pinfo->net_src; - save_net_dst = pinfo->net_dst; - save_src = pinfo->src; - save_dst = pinfo->dst; - /* Save the current value of the "we're inside an error packet" flag, and set that flag; subdissectors may treat packets that are the payload of error packets differently from @@ -2406,35 +2382,15 @@ dissect_cp( tvbuff_t *tvb, int proto_id, int proto_subtree_index, save_in_error_pkt = pinfo->in_error_pkt; pinfo->in_error_pkt = TRUE; - /* Dissect the contained packet. - Catch ReportedBoundsError, and do nothing if we see it, - because it's not an error if the contained packet is short; - there's no guarantee that all of it was included. - - XXX - should catch BoundsError, and re-throw it after cleaning - up. */ + /* Decode the rejected packet. */ next_tvb = tvb_new_subset(tvb, offset, length, length); - TRY { - if (!dissector_try_port(ppp_subdissector_table, protocol, - next_tvb, pinfo, fh_tree)) { - call_dissector(data_handle, next_tvb, pinfo, fh_tree); - } + if (!dissector_try_port(ppp_subdissector_table, protocol, + next_tvb, pinfo, fh_tree)) { + call_dissector(data_handle, next_tvb, pinfo, fh_tree); } - CATCH(ReportedBoundsError) { - ; /* do nothing */ - } - ENDTRY; /* Restore the "we're inside an error packet" flag. */ pinfo->in_error_pkt = save_in_error_pkt; - - /* Restore the addresses. */ - pinfo->dl_src = save_dl_src; - pinfo->dl_dst = save_dl_dst; - pinfo->net_src = save_net_src; - pinfo->net_dst = save_net_dst; - pinfo->src = save_src; - pinfo->dst = save_dst; } } break; |