diff options
author | AndersBroman <anders.broman@ericsson.com> | 2014-03-28 14:57:24 +0100 |
---|---|---|
committer | Anders Broman <a.broman58@gmail.com> | 2014-03-28 14:05:29 +0000 |
commit | f7c62543f97260654b28381e7a082dcefa56bf68 (patch) | |
tree | 6a5e93de81265566fe9ad5600db913236a786286 /epan/dissectors/packet-sdp.c | |
parent | 3438243c1e976374314a5377237fa352bf5247e7 (diff) |
tvb_get_ascii_string is really expensive. On a large capture file which I
profiled in october Fetch cost has gone from 15,6M to 24,2M, changing
tvb_get_string() to tvb_get_string_enc() with ENC_UTF_8 where it seems
safe helps a bit and should be done any way.
Change-Id: I4d3e640bfde3304a991c09e2a30ad7dd132fc5ac
Reviewed-on: https://code.wireshark.org/review/855
Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan/dissectors/packet-sdp.c')
-rw-r--r-- | epan/dissectors/packet-sdp.c | 64 |
1 files changed, 32 insertions, 32 deletions
diff --git a/epan/dissectors/packet-sdp.c b/epan/dissectors/packet-sdp.c index 8e71f6a32b..9569b6e815 100644 --- a/epan/dissectors/packet-sdp.c +++ b/epan/dissectors/packet-sdp.c @@ -506,7 +506,7 @@ dissect_sdp_connection_info(tvbuff_t *tvb, proto_item* ti, return; tokenlen = next_offset - offset; /* Save connection address type */ - media_info->connection_type = (char*)tvb_get_string(wmem_packet_scope(), tvb, offset, tokenlen); + media_info->connection_type = (char*)tvb_get_string_enc(wmem_packet_scope(), tvb, offset, tokenlen, ENC_UTF_8); DPRINT(("parsed connection line type=%s", media_info->connection_type)); @@ -522,11 +522,11 @@ dissect_sdp_connection_info(tvbuff_t *tvb, proto_item* ti, tokenlen = -1; /* end of tvbuff */ /* Save connection address */ media_info->connection_address = - (char*)tvb_get_string(wmem_packet_scope(), tvb, offset, tvb_length_remaining(tvb, offset)); + (char*)tvb_get_string_enc(wmem_packet_scope(), tvb, offset, tvb_length_remaining(tvb, offset), ENC_UTF_8); } else { tokenlen = next_offset - offset; /* Save connection address */ - media_info->connection_address = (char*)tvb_get_string(wmem_packet_scope(), tvb, offset, tokenlen); + media_info->connection_address = (char*)tvb_get_string_enc(wmem_packet_scope(), tvb, offset, tokenlen, ENC_UTF_8); } DPRINT(("parsed connection line address=%s", media_info->connection_address)); @@ -734,7 +734,7 @@ static void dissect_key_mgmt(tvbuff_t *tvb, packet_info * pinfo, proto_item * ti return; tokenlen = next_offset - offset; - prtcl_id = tvb_get_string(wmem_packet_scope(), tvb, offset, tokenlen); + prtcl_id = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, tokenlen, ENC_UTF_8); proto_tree_add_item(key_tree, hf_key_mgmt_prtcl_id, tvb, offset, tokenlen, ENC_ASCII|ENC_NA); @@ -744,7 +744,7 @@ static void dissect_key_mgmt(tvbuff_t *tvb, packet_info * pinfo, proto_item * ti if (len < 0) return; - data_p = tvb_get_string(wmem_packet_scope(), tvb, offset, len); + data_p = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, len, ENC_UTF_8); keymgmt_tvb = base64_to_tvb(tvb, data_p); add_new_data_source(pinfo, keymgmt_tvb, "Key Management Data"); @@ -787,7 +787,7 @@ static void dissect_sdp_session_attribute(tvbuff_t *tvb, packet_info * pinfo, pr proto_tree_add_item(sdp_session_attribute_tree, hf_session_attribute_field, tvb, offset, tokenlen, ENC_ASCII|ENC_NA); - field_name = tvb_get_string(wmem_packet_scope(), tvb, offset, tokenlen); + field_name = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, tokenlen, ENC_UTF_8); offset = next_offset + 1; @@ -856,7 +856,7 @@ dissect_sdp_media(tvbuff_t *tvb, proto_item *ti, proto_tree_add_item(sdp_media_tree, hf_media_media, tvb, offset, tokenlen, ENC_ASCII|ENC_NA); - media_info->media_type[media_info->media_count] = (char*)tvb_get_string(wmem_packet_scope(), tvb, offset, tokenlen); + media_info->media_type[media_info->media_count] = (char*)tvb_get_string_enc(wmem_packet_scope(), tvb, offset, tokenlen, ENC_UTF_8); DPRINT(("parsed media_type=%s, for media_count=%d", media_info->media_type[media_info->media_count], @@ -873,14 +873,14 @@ dissect_sdp_media(tvbuff_t *tvb, proto_item *ti, if (next_offset != -1) { tokenlen = next_offset - offset; /* Save port info */ - media_info->media_port[media_info->media_count] = (char*)tvb_get_string(wmem_packet_scope(), tvb, offset, tokenlen); + media_info->media_port[media_info->media_count] = (char*)tvb_get_string_enc(wmem_packet_scope(), tvb, offset, tokenlen, ENC_UTF_8); DPRINT(("parsed media_port=%s, for media_count=%d", media_info->media_port[media_info->media_count], media_info->media_count)); proto_tree_add_uint(sdp_media_tree, hf_media_port, tvb, offset, tokenlen, - atoi((char*)tvb_get_string(wmem_packet_scope(), tvb, offset, tokenlen))); + atoi((char*)tvb_get_string_enc(wmem_packet_scope(), tvb, offset, tokenlen, ENC_UTF_8))); offset = next_offset + 1; next_offset = tvb_find_guint8(tvb, offset, -1, ' '); if (next_offset == -1) @@ -896,13 +896,13 @@ dissect_sdp_media(tvbuff_t *tvb, proto_item *ti, return; tokenlen = next_offset - offset; /* Save port info */ - media_info->media_port[media_info->media_count] = (char*)tvb_get_string(wmem_packet_scope(), tvb, offset, tokenlen); + media_info->media_port[media_info->media_count] = (char*)tvb_get_string_enc(wmem_packet_scope(), tvb, offset, tokenlen, ENC_UTF_8); DPRINT(("parsed media_port=%s, for media_count=%d", media_info->media_port[media_info->media_count], media_info->media_count)); /* XXX Remember Port */ proto_tree_add_uint(sdp_media_tree, hf_media_port, tvb, offset, tokenlen, - atoi((char*)tvb_get_string(wmem_packet_scope(), tvb, offset, tokenlen))); + atoi((char*)tvb_get_string_enc(wmem_packet_scope(), tvb, offset, tokenlen, ENC_UTF_8))); offset = next_offset + 1; } @@ -913,7 +913,7 @@ dissect_sdp_media(tvbuff_t *tvb, proto_item *ti, tokenlen = next_offset - offset; /* Save port protocol */ - media_info->media_proto[media_info->media_count] = (char*)tvb_get_string(wmem_packet_scope(), tvb, offset, tokenlen); + media_info->media_proto[media_info->media_count] = (char*)tvb_get_string_enc(wmem_packet_scope(), tvb, offset, tokenlen, ENC_UTF_8); DPRINT(("parsed media_proto=%s, for media_count=%d", media_info->media_proto[media_info->media_count], @@ -936,7 +936,7 @@ dissect_sdp_media(tvbuff_t *tvb, proto_item *ti, } if (!strcmp(media_info->media_proto[media_info->media_count], "RTP/AVP")) { - media_format = tvb_get_string(wmem_packet_scope(), tvb, offset, tokenlen); + media_format = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, tokenlen, ENC_UTF_8); proto_tree_add_string(sdp_media_tree, hf_media_format, tvb, offset, tokenlen, val_to_str_ext((guint32)strtoul((char*)media_format, NULL, 10), &rtp_payload_type_vals_ext, "%u")); idx = transport_info->media[transport_info->media_count].pt_count; @@ -1104,7 +1104,7 @@ decode_sdp_fmtp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset /* Find the name of the parameter */ tokenlen = next_offset - offset; - field_name = tvb_get_string(wmem_packet_scope(), tvb, offset, tokenlen); + field_name = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, tokenlen, ENC_UTF_8); #if 0 proto_tree_add_text(tree, tvb, offset, tokenlen, "Debug; MIMEtype '%s'Parameter name: '%s'", mime_type, field_name); */ #endif @@ -1115,14 +1115,14 @@ decode_sdp_fmtp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset if (strcmp((char*)field_name, "profile-level-id") == 0) { offset++; tokenlen = end_offset - offset; - format_specific_parameter = tvb_get_string(wmem_packet_scope(), tvb, offset, tokenlen); + format_specific_parameter = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, tokenlen, ENC_UTF_8); item = proto_tree_add_uint(tree, hf_sdp_fmtp_mpeg4_profile_level_id, tvb, offset, tokenlen, (guint32)strtol((char*)format_specific_parameter, NULL, 10)); PROTO_ITEM_SET_GENERATED(item); } else if (strcmp((char*)field_name, "config") == 0) { /* String including "=" */ tokenlen = end_offset - offset; - format_specific_parameter = tvb_get_string(wmem_packet_scope(), tvb, offset, tokenlen); + format_specific_parameter = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, tokenlen, ENC_UTF_8); /* ascii_bytes_to_tvb requires the "=" to be in the buffer */ data_tvb = ascii_bytes_to_tvb(tvb, pinfo, tokenlen, format_specific_parameter); if (mp4ves_handle && data_tvb) { @@ -1137,14 +1137,14 @@ decode_sdp_fmtp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset if (strcmp((char*)field_name, "profile") == 0) { offset++; tokenlen = end_offset - offset; - format_specific_parameter = tvb_get_string(wmem_packet_scope(), tvb, offset, tokenlen); + format_specific_parameter = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, tokenlen, ENC_UTF_8); item = proto_tree_add_uint(tree, hf_sdp_fmtp_h263_profile, tvb, offset, tokenlen, (guint32)strtol((char*)format_specific_parameter, NULL, 10)); PROTO_ITEM_SET_GENERATED(item); } else if (strcmp((char*)field_name, "level") == 0) { offset++; tokenlen = end_offset - offset; - format_specific_parameter = tvb_get_string(wmem_packet_scope(), tvb, offset, tokenlen); + format_specific_parameter = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, tokenlen, ENC_UTF_8); item = proto_tree_add_uint(tree, hf_sdp_fmtp_h263_level, tvb, offset, tokenlen, (guint32)strtol((char*)format_specific_parameter, NULL, 10)); PROTO_ITEM_SET_GENERATED(item); @@ -1170,7 +1170,7 @@ decode_sdp_fmtp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset /* Length includes "=" as it's required by ascii_bytes_to_tvb()*/ tokenlen = end_offset - offset; - format_specific_parameter = tvb_get_string(wmem_packet_scope(), tvb, offset, tokenlen); + format_specific_parameter = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, tokenlen, ENC_UTF_8); data_tvb = ascii_bytes_to_tvb(tvb, pinfo, tokenlen, format_specific_parameter); if (!data_tvb) { proto_tree_add_text(tree, tvb, offset, tokenlen, "Could not convert '%s' to 3 bytes", format_specific_parameter); @@ -1188,7 +1188,7 @@ decode_sdp_fmtp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset } else if (strcmp(field_name, "packetization-mode") == 0) { offset++; tokenlen = end_offset - offset; - format_specific_parameter = tvb_get_string(wmem_packet_scope(), tvb, offset, tokenlen); + format_specific_parameter = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, tokenlen, ENC_UTF_8); item = proto_tree_add_uint(tree, hf_sdp_h264_packetization_mode, tvb, offset, tokenlen, (guint32)strtol((char*)format_specific_parameter, NULL, 10)); PROTO_ITEM_SET_GENERATED(item); @@ -1215,7 +1215,7 @@ decode_sdp_fmtp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset tokenlen = end_offset - offset; } - data_p = tvb_get_string(wmem_packet_scope(), tvb, offset, tokenlen); + data_p = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, tokenlen, ENC_UTF_8); proto_tree_add_text(tree, tvb, offset, tokenlen, "NAL unit 1 string: %s", data_p); /* proto_tree_add_text(tree, tvb, offset, tokenlen, "String %s", data_p); */ @@ -1234,7 +1234,7 @@ decode_sdp_fmtp(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, gint offset /* Second NAL unit */ offset = comma_offset +1; tokenlen = end_offset - offset; - data_p = tvb_get_string(wmem_packet_scope(), tvb, offset, tokenlen); + data_p = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, tokenlen, ENC_UTF_8); proto_tree_add_text(tree, tvb, offset, tokenlen, "NAL unit 2 string: %s", data_p); data_tvb = base64_to_tvb(tvb, data_p); add_new_data_source(pinfo, data_tvb, "h264 prop-parameter-sets 2"); @@ -1324,7 +1324,7 @@ static void dissect_sdp_media_attribute(tvbuff_t *tvb, packet_info *pinfo, proto offset = tvb_skip_wsp(tvb, offset, tvb_length_remaining(tvb, offset)); /* Value is the remainder of the line */ - attribute_value = tvb_get_string(wmem_packet_scope(), tvb, offset, tvb_length_remaining(tvb, offset)); + attribute_value = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, tvb_length_remaining(tvb, offset), ENC_UTF_8); @@ -1344,7 +1344,7 @@ static void dissect_sdp_media_attribute(tvbuff_t *tvb, packet_info *pinfo, proto proto_tree_add_item(sdp_media_attribute_tree, hf_media_format, tvb, offset, tokenlen, ENC_ASCII|ENC_NA); - payload_type = tvb_get_string(wmem_packet_scope(), tvb, offset, tokenlen); + payload_type = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, tokenlen, ENC_UTF_8); offset = next_offset + 1; @@ -1367,7 +1367,7 @@ static void dissect_sdp_media_attribute(tvbuff_t *tvb, packet_info *pinfo, proto key = wmem_new(wmem_file_scope(), gint); *key = (gint)strtol((char*)payload_type, NULL, 10); - transport_info->encoding_name[pt] = (char*)tvb_get_string(wmem_packet_scope(), tvb, offset, tokenlen); + transport_info->encoding_name[pt] = (char*)tvb_get_string_enc(wmem_packet_scope(), tvb, offset, tokenlen, ENC_UTF_8); next_offset = next_offset + 1; offset = next_offset; @@ -1379,7 +1379,7 @@ static void dissect_sdp_media_attribute(tvbuff_t *tvb, packet_info *pinfo, proto tokenlen = next_offset - offset; proto_tree_add_item(sdp_media_attribute_tree, hf_media_sample_rate, tvb, offset, tokenlen, ENC_ASCII|ENC_NA); - transport_info->sample_rate[pt] = atoi(tvb_get_string(wmem_packet_scope(), tvb, offset, tokenlen)); + transport_info->sample_rate[pt] = atoi(tvb_get_string_enc(wmem_packet_scope(), tvb, offset, tokenlen, ENC_UTF_8)); /* As per RFC2327 it is possible to have multiple Media Descriptions ("m="). For example: @@ -1442,7 +1442,7 @@ static void dissect_sdp_media_attribute(tvbuff_t *tvb, packet_info *pinfo, proto media_format_item = proto_tree_add_item(sdp_media_attribute_tree, hf_media_format, tvb, offset, tokenlen, ENC_ASCII|ENC_NA); - media_format = atoi((char*)tvb_get_string(wmem_packet_scope(), tvb, offset, tokenlen)); + media_format = atoi((char*)tvb_get_string_enc(wmem_packet_scope(), tvb, offset, tokenlen, ENC_UTF_8)); if (media_format >= SDP_NO_OF_PT) { return; /* Invalid */ } @@ -1517,10 +1517,10 @@ static void dissect_sdp_media_attribute(tvbuff_t *tvb, packet_info *pinfo, proto port_end_offset = tvb_find_guint8(tvb, port_offset, -1, ';'); } /* Attempt to convert address */ - if (str_to_ip((char*)tvb_get_string(wmem_packet_scope(), tvb, address_offset, port_offset-address_offset), + if (str_to_ip((char*)tvb_get_string_enc(wmem_packet_scope(), tvb, address_offset, port_offset-address_offset, ENC_UTF_8), &media_info->msrp_ipaddr)) { /* Get port number */ - media_info->msrp_port_number = atoi((char*)tvb_get_string(wmem_packet_scope(), tvb, port_offset + 1, port_end_offset - port_offset - 1)); + media_info->msrp_port_number = atoi((char*)tvb_get_string_enc(wmem_packet_scope(), tvb, port_offset + 1, port_end_offset - port_offset - 1, ENC_UTF_8)); /* Set flag so this info can be used */ media_info->msrp_transport_address_set = TRUE; } @@ -1586,7 +1586,7 @@ static void dissect_sdp_media_attribute(tvbuff_t *tvb, packet_info *pinfo, proto } tokenlen = next_offset - offset; proto_tree_add_uint(sdp_media_attribute_tree, hf_sdp_crypto_tag, tvb, offset, tokenlen, - atoi((char*)tvb_get_string(wmem_packet_scope(), tvb, offset, tokenlen))); + atoi((char*)tvb_get_string_enc(wmem_packet_scope(), tvb, offset, tokenlen, ENC_UTF_8))); offset = next_offset + 1; /* crypto-suite */ @@ -1663,7 +1663,7 @@ static void dissect_sdp_media_attribute(tvbuff_t *tvb, packet_info *pinfo, proto } else { tokenlen = next_offset - offset; } - data_p = tvb_get_string(wmem_packet_scope(), tvb, offset, tokenlen); + data_p = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, tokenlen, ENC_UTF_8); key_salt_tvb = base64_to_tvb(tvb, data_p); add_new_data_source(pinfo, key_salt_tvb, "Key_Salt_tvb"); if (master_key_length != 0) { @@ -1712,7 +1712,7 @@ static void dissect_sdp_media_attribute(tvbuff_t *tvb, packet_info *pinfo, proto /* This will not work if more than one parameter */ /* number of octets used for the MKI in the RTP payload */ - transport_info->mki_len = atoi((char*)tvb_get_string(wmem_packet_scope(), tvb, offset, tokenlen)); + transport_info->mki_len = atoi((char*)tvb_get_string_enc(wmem_packet_scope(), tvb, offset, tokenlen, ENC_UTF_8)); proto_tree_add_item(parameter_tree, hf_sdp_crypto_mki_length, tvb, offset, tokenlen, ENC_ASCII|ENC_NA); } |