diff --git a/epan/dissectors/packet-dcerpc-nt.c b/epan/dissectors/packet-dcerpc-nt.c index 1d1277b601..75fd2ff1a6 100644 --- a/epan/dissectors/packet-dcerpc-nt.c +++ b/epan/dissectors/packet-dcerpc-nt.c @@ -47,7 +47,6 @@ static int hf_lsa_String_name_len = -1; static int hf_lsa_String_name_size = -1; static int hf_nt_data_blob_len = -1; -static gint ett_nt_unicode_string = -1; static gint ett_lsa_String = -1; static gint ett_nt_data_blob = -1; static expert_field ei_dcerpc_nt_badsid = EI_INIT; @@ -108,71 +107,25 @@ dissect_null_term_string(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, guint8 *drep _U_, int hf_index, int levels _U_) { - guint8 data; - int tmp_offset = offset; - guint32 len = 0; - char *s; + guint len; - data = tvb_get_guint8 (tvb, tmp_offset); - for ( ;tvb_length_remaining (tvb, tmp_offset) > 0 && data; tmp_offset++) { - data = tvb_get_guint8 (tvb, tmp_offset); - } + len = tvb_strsize(tvb, offset); + proto_tree_add_item(tree, hf_index, tvb, offset, len, ENC_ASCII|ENC_NA); - /* Let's try to the terminator on the last char ...*/ - if (data) { - tmp_offset++; - data = tvb_get_guint8 (tvb, tmp_offset); - } - - if (data) { - proto_tree_add_string(tree, hf_nt_error, tvb, offset, - tmp_offset - offset, "Not a null terminated string"); - return tmp_offset; - } - - len = tmp_offset - offset; - /* tvb_get_string didn't want the length with the 0*/ - s = tvb_get_string(wmem_packet_scope(), tvb, offset, len); - proto_tree_add_string(tree, hf_index, tvb, offset, len + 1, s); - - return tmp_offset; + return offset + len; } int dissect_null_term_wstring(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, - guint8 *drep, int hf_index, int levels _U_) + guint8 *drep _U_, int hf_index, int levels _U_) { - guint16 data; - int tmp_offset = offset; - guint32 len = 0; - char *s; + guint len; - data = dcerpc_tvb_get_ntohs(tvb, tmp_offset, drep); - for ( ; tvb_length_remaining (tvb, tmp_offset) > 1 && data; tmp_offset +=2) { - data = dcerpc_tvb_get_ntohs(tvb, tmp_offset, drep); - } + len = tvb_unicode_strsize(tvb, offset); + proto_tree_add_item(tree, hf_index, tvb, offset, len, ENC_UTF_16|ENC_LITTLE_ENDIAN); - /* Let's try to find the terminator on the last char ...*/ - - if (data) { - tmp_offset += 2; - data = dcerpc_tvb_get_ntohs(tvb, tmp_offset, drep); - } - - if (data) { - proto_tree_add_string(tree, hf_nt_error, tvb, offset, - tmp_offset - offset, "Not a null terminated string"); - return tmp_offset; - } - len = tmp_offset - offset; - - /* tvb_get_string didn't want the length with the 0*/ - s = tvb_get_unicode_string(NULL, tvb, offset, len, ENC_LITTLE_ENDIAN); - proto_tree_add_string(tree, hf_index, tvb, offset, len, s); - g_free(s); - - return tmp_offset; + return offset + len; } /* Parse some common RPC structures */ @@ -1275,9 +1228,9 @@ void cb_wstr_postprocess(packet_info *pinfo, proto_tree *tree _U_, * some way we can get that string, rather than duplicating the * efforts of that routine? */ - s = tvb_get_unicode_string(wmem_packet_scope(), + s = tvb_get_string_enc(wmem_packet_scope(), tvb, start_offset + 12, end_offset - start_offset - 12, - ENC_LITTLE_ENDIAN); + ENC_UTF_16|ENC_LITTLE_ENDIAN); /* Append string to COL_INFO */ @@ -1997,7 +1950,6 @@ void dcerpc_smb_init(int proto_dcerpc) }; static gint *ett[] = { - &ett_nt_unicode_string, &ett_nt_data_blob, &ett_nt_counted_string, &ett_nt_counted_byte_array, diff --git a/epan/dissectors/packet-dcerpc-spoolss.c b/epan/dissectors/packet-dcerpc-spoolss.c index f6ecc377c8..5792e38942 100644 --- a/epan/dissectors/packet-dcerpc-spoolss.c +++ b/epan/dissectors/packet-dcerpc-spoolss.c @@ -498,7 +498,7 @@ dissect_spoolss_string_parm_data(tvbuff_t *tvb, int offset, packet_info *pinfo, offset = dissect_ndr_uint32(tvb, offset, pinfo, tree, di, drep, hf_string_parm_size, &buffer_len); - s = tvb_get_unicode_stringz(wmem_packet_scope(), tvb, offset, &len, ENC_LITTLE_ENDIAN); + s = tvb_get_stringz_enc(wmem_packet_scope(), tvb, offset, &len, ENC_UTF_16|ENC_LITTLE_ENDIAN); if (tree && buffer_len) { tvb_ensure_bytes_exist(tvb, offset, buffer_len); @@ -694,7 +694,7 @@ dissect_printerdata_data(tvbuff_t *tvb, int offset, switch(type) { case DCERPC_REG_SZ: { - char *data = tvb_get_unicode_string(NULL, tvb, offset - size, size, ENC_LITTLE_ENDIAN); + char *data = tvb_get_string_enc(NULL, tvb, offset - size, size, ENC_UTF_16|ENC_LITTLE_ENDIAN); proto_item_append_text(item, ": %s", data); @@ -1083,7 +1083,7 @@ dissect_spoolss_uint16uni(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, return offset; } - text = tvb_get_unicode_string(NULL, tvb, offset, remaining, ENC_LITTLE_ENDIAN); + text = tvb_get_string_enc(NULL, tvb, offset, remaining, ENC_UTF_16|ENC_LITTLE_ENDIAN); len = (int)strlen(text); proto_tree_add_text(tree, tvb, offset, len * 2, "%s: %s", @@ -5838,8 +5838,8 @@ cb_notify_str_postprocess(packet_info *pinfo _U_, len = tvb_get_letohl(tvb, start_offset); - s = tvb_get_unicode_string(NULL, - tvb, start_offset + 4, (end_offset - start_offset - 4), ENC_LITTLE_ENDIAN); + s = tvb_get_string_enc(NULL, + tvb, start_offset + 4, (end_offset - start_offset - 4), ENC_UTF_16|ENC_LITTLE_ENDIAN); /* Append string to upper-level proto_items */ diff --git a/epan/dissectors/packet-dtpt.c b/epan/dissectors/packet-dtpt.c index 1d8f9104e8..9ff1b5aca1 100644 --- a/epan/dissectors/packet-dtpt.c +++ b/epan/dissectors/packet-dtpt.c @@ -234,7 +234,7 @@ dissect_dtpt_wstring(tvbuff_t *tvb, guint offset, proto_tree *tree, int hfindex) guint32 wstring_padding = 0; wstring_length = tvb_get_letohl(tvb, offset); - wstring_data = tvb_get_unicode_string(wmem_packet_scope(), tvb, offset+4, wstring_length, ENC_LITTLE_ENDIAN); + wstring_data = tvb_get_string_enc(wmem_packet_scope(), tvb, offset+4, wstring_length, ENC_UTF_16|ENC_LITTLE_ENDIAN); wstring_size = wstring_length; if (wstring_size%4) { wstring_padding = (4-wstring_size%4); diff --git a/epan/dissectors/packet-ms-mms.c b/epan/dissectors/packet-ms-mms.c index 9b1a1f5514..4da7ab590e 100644 --- a/epan/dissectors/packet-ms-mms.c +++ b/epan/dissectors/packet-ms-mms.c @@ -2,6 +2,12 @@ * * Routines for MicroSoft MMS (Microsoft Media Server) message dissection * + * See + * + * http://msdn.microsoft.com/en-us/library/cc234711.aspx + * + * for the [MS-MMSP] specification. + * * Copyright 2005 * Written by Martin Mathieson * @@ -760,7 +766,7 @@ static void dissect_client_transport_info(tvbuff_t *tvb, packet_info *pinfo, pro offset += 4; /* Extract and show the string in tree and info column */ - transport_info = tvb_get_unicode_string(wmem_packet_scope(), tvb, offset, length_remaining - 20, ENC_LITTLE_ENDIAN); + transport_info = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, length_remaining - 20, ENC_UTF_16|ENC_LITTLE_ENDIAN); proto_tree_add_string_format(tree, hf_msmms_command_client_transport_info, tvb, offset, length_remaining-20, @@ -868,7 +874,7 @@ static void dissect_server_info(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t THROW(ReportedBoundsError); if (server_version_length > 1) { - server_version = tvb_get_unicode_string(wmem_packet_scope(), tvb, offset, server_version_length*2, ENC_LITTLE_ENDIAN); + server_version = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, server_version_length*2, ENC_UTF_16|ENC_LITTLE_ENDIAN); /* Server version string */ proto_tree_add_item(tree, hf_msmms_command_server_version, tvb, @@ -934,7 +940,7 @@ static void dissect_client_player_info(tvbuff_t *tvb, packet_info *pinfo, proto_ offset += 4; /* Extract and show the string in tree and info column */ - player_info = tvb_get_unicode_string(wmem_packet_scope(), tvb, offset, length_remaining - 12, ENC_LITTLE_ENDIAN); + player_info = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, length_remaining - 12, ENC_UTF_16|ENC_LITTLE_ENDIAN); proto_tree_add_item(tree, hf_msmms_command_client_player_info, tvb, offset, length_remaining-12, @@ -1011,7 +1017,7 @@ static void dissect_request_server_file(tvbuff_t *tvb, packet_info *pinfo, proto offset += 4; /* File path on server */ - server_file = tvb_get_unicode_string(wmem_packet_scope(), tvb, offset, length_remaining - 16, ENC_LITTLE_ENDIAN); + server_file = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, length_remaining - 16, ENC_UTF_16|ENC_LITTLE_ENDIAN); proto_tree_add_item(tree, hf_msmms_command_server_file, tvb, offset, length_remaining-16, diff --git a/epan/dissectors/packet-ntlmssp.c b/epan/dissectors/packet-ntlmssp.c index 34d1b64b3e..41c6ab1eb3 100644 --- a/epan/dissectors/packet-ntlmssp.c +++ b/epan/dissectors/packet-ntlmssp.c @@ -1308,7 +1308,7 @@ dissect_ntlmssp_target_info_list(tvbuff_t *tvb, packet_info *pinfo, proto_tree * case NTLM_TARGET_INFO_DNS_DOMAIN_NAME: case NTLM_TARGET_INFO_DNS_TREE_NAME: case NTLM_TARGET_INFO_TARGET_NAME: - text = tvb_get_unicode_string(wmem_packet_scope(), tvb, content_offset, content_length, ENC_LITTLE_ENDIAN); + text = tvb_get_string_enc(wmem_packet_scope(), tvb, content_offset, content_length, ENC_UTF_16|ENC_LITTLE_ENDIAN); proto_tree_add_string(target_info_tree, *hf_array_p[item_type], tvb, content_offset, content_length, text); proto_item_append_text(target_info_tf, ": %s", text); break; diff --git a/epan/dissectors/packet-pnrp.c b/epan/dissectors/packet-pnrp.c index ebc8b5f9c6..9de9d3eb48 100644 --- a/epan/dissectors/packet-pnrp.c +++ b/epan/dissectors/packet-pnrp.c @@ -9,7 +9,6 @@ * By Gerald Combs * Copyright 1998 Gerald Combs * - * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -25,9 +24,12 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -/* The official Dokumentation for the Peer Name Resolution Protocol can be found at - http://msdn.microsoft.com/en-us/library/cc239047(PROT.13).aspx - This dissector is based on Revision 6.1.2 +/* The official Documentation for the Peer Name Resolution Protocol + * ([MS-PNRP]) can be found at + * + * http://msdn.microsoft.com/en-us/library/cc239047.aspx + * + * This dissector is based on Revision 6.1.2 */ #include "config.h" @@ -221,6 +223,7 @@ static const int *inquire_flags[] = { static gint hf_pnrp_message_classifier_unicodeCount = -1; static gint hf_pnrp_message_classifier_arrayLength = -1; static gint hf_pnrp_message_classifier_entryLength = -1; +static gint hf_pnrp_message_classifier_string = -1; /* ACK Message Flags */ static gint hf_pnrp_message_ack_flags_reserved = -1; static gint hf_pnrp_message_ack_flags_Nbit = -1; @@ -685,7 +688,7 @@ static int dissect_pnrp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi /* Entry Length: Must be 0x0002 */ proto_tree_add_item(pnrp_message_tree, hf_pnrp_message_classifier_entryLength, tvb, offset + 10, 2, ENC_BIG_ENDIAN); /* The actual classifier String */ - proto_tree_add_text(pnrp_message_tree, tvb, offset + 12, tvb_get_ntohs(tvb,offset+6)-8, "Classifier: %s",tvb_get_unicode_string(wmem_packet_scope(), tvb, offset + 12, tvb_get_ntohs(tvb,offset+6)-8, ENC_BIG_ENDIAN)); + proto_tree_add_item(pnrp_message_tree, hf_pnrp_message_classifier_string, tvb, offset + 12, tvb_get_ntohs(tvb,offset+6)-8, ENC_UTF_16|ENC_BIG_ENDIAN); } /* There might be padding, so fill up to the next byte */ @@ -1153,6 +1156,9 @@ void proto_register_pnrp(void) { &hf_pnrp_message_classifier_entryLength, { "Entry Length", "pnrp.segment.classifier.entryLength", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }}, + { &hf_pnrp_message_classifier_string, + { "Classifier", "pnrp.segment.classifier.string", FT_STRING, STR_UNICODE, NULL, 0x0, + NULL, HFILL }}, /* Ack Flags */ { &hf_pnrp_message_ack_flags_reserved, { "Reserved", "pnrp.segment.ack.flags.reserved", FT_BOOLEAN, BASE_NONE, NULL, 0x0, diff --git a/epan/dissectors/packet-smb.c b/epan/dissectors/packet-smb.c index cd3344488c..c29789740d 100644 --- a/epan/dissectors/packet-smb.c +++ b/epan/dissectors/packet-smb.c @@ -11111,10 +11111,7 @@ dissect_transaction2_request_parameters(tvbuff_t *tvb, packet_info *pinfo, COUNT_BYTES_TRANS(4); /* file name */ - if (si->unicode) - fn = tvb_get_unicode_stringz(wmem_packet_scope(), tvb, offset, &fn_len, ENC_LITTLE_ENDIAN); - else - fn = tvb_get_stringz(wmem_packet_scope(), tvb, offset, &fn_len); + fn = tvb_get_stringz_enc(wmem_packet_scope(), tvb, offset, &fn_len, (si->unicode ? ENC_UTF_16|ENC_LITTLE_ENDIAN : ENC_ASCII|ENC_NA)); CHECK_STRING_TRANS(fn); proto_tree_add_string(tree, hf_smb_file_name, tvb, offset, fn_len, diff --git a/epan/dissectors/packet-tds.c b/epan/dissectors/packet-tds.c index 3de8a1ad6d..29bec6c1e7 100644 --- a/epan/dissectors/packet-tds.c +++ b/epan/dissectors/packet-tds.c @@ -446,6 +446,8 @@ static int hf_tds_fragment_count = -1; static int hf_tds_collate_codepage = -1; static int hf_tds_collate_flags = -1; static int hf_tds_collate_charset_id = -1; +static int hf_tds_table_name = -1; +static int hf_tds_text = -1; static int hf_tds7_login_total_size = -1; static int hf_tds7_version = -1; @@ -980,7 +982,7 @@ static void dissect_tds_query_packet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, tds_conv_info_t *tds_info) { guint offset, len; - gboolean is_unicode = TRUE; + guint string_encoding = ENC_UTF_16|ENC_LITTLE_ENDIAN; char *msg; proto_item *query_hdr; @@ -995,12 +997,9 @@ dissect_tds_query_packet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, td if (TDS_PROTO_TDS4 || (!TDS_PROTO_TDS7 && ((len < 2) || tvb_get_guint8(tvb, offset+1) != 0))) - is_unicode = FALSE; + string_encoding = ENC_ASCII|ENC_NA; - if (is_unicode) - msg = tvb_get_unicode_string(wmem_packet_scope(), tvb, offset, len, ENC_LITTLE_ENDIAN); - else - msg = (gchar*)tvb_get_string(wmem_packet_scope(), tvb, offset, len); + msg = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, len, string_encoding); proto_tree_add_text(query_tree, tvb, offset, len, "Query: %s", msg); offset += len; @@ -1176,7 +1175,7 @@ dissect_tds7_login(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) if( i != 2) { /* tds 7 is always unicode */ len *= 2; - val = tvb_get_unicode_string(wmem_packet_scope(), tvb, offset2, len, ENC_LITTLE_ENDIAN); + val = tvb_get_string_enc(wmem_packet_scope(), tvb, offset2, len, ENC_UTF_16|ENC_LITTLE_ENDIAN); proto_tree_add_text(login_tree, tvb, offset2, len, "%s: %s", val_to_str_const(i, login_field_names, "Unknown"), val); } else { /* This field is the password. We retrieve it from the packet @@ -1489,10 +1488,11 @@ dissect_tds_env_chg(tvbuff_t *tvb, guint offset, guint token_sz, string_offset = offset + 2; if (is_unicode == TRUE) { new_len *= 2; - new_val = tvb_get_unicode_string(wmem_packet_scope(), tvb, string_offset, - new_len, ENC_LITTLE_ENDIAN); + new_val = tvb_get_string_enc(wmem_packet_scope(), tvb, string_offset, + new_len, ENC_UTF_16|ENC_LITTLE_ENDIAN); } else - new_val = (gchar*)tvb_get_string(wmem_packet_scope(), tvb, string_offset, new_len); + new_val = tvb_get_string_enc(wmem_packet_scope(), tvb, string_offset, + new_len, ENC_ASCII|ENC_NA); proto_tree_add_text(tree, tvb, string_offset, new_len, "New Value: %s", new_val); } @@ -1513,10 +1513,11 @@ dissect_tds_env_chg(tvbuff_t *tvb, guint offset, guint token_sz, string_offset = old_len_offset + 1; if (is_unicode == TRUE) { old_len *= 2; - old_val = tvb_get_unicode_string(wmem_packet_scope(), tvb, string_offset, - old_len, ENC_LITTLE_ENDIAN); + old_val = tvb_get_string_enc(wmem_packet_scope(), tvb, string_offset, + old_len, ENC_UTF_16|ENC_LITTLE_ENDIAN); } else - old_val = (gchar*)tvb_get_string(wmem_packet_scope(), tvb, string_offset, old_len); + old_val = tvb_get_string_enc(wmem_packet_scope(), tvb, string_offset, + old_len, ENC_ASCII|ENC_NA); proto_tree_add_text(tree, tvb, string_offset, old_len, "Old Value: %s", old_val); } @@ -1546,9 +1547,9 @@ dissect_tds_err_token(tvbuff_t *tvb, guint offset, guint token_sz _U_, proto_tre if(is_unicode) { msg_len *= 2; - msg = tvb_get_unicode_string(wmem_packet_scope(), tvb, offset, msg_len, ENC_LITTLE_ENDIAN); + msg = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, msg_len, ENC_UTF_16|ENC_LITTLE_ENDIAN); } else { - msg = (gchar*)tvb_get_string(wmem_packet_scope(), tvb, offset, msg_len); + msg = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, msg_len, ENC_ASCII|ENC_NA); } proto_tree_add_text(tree, tvb, offset, msg_len, "Error: %s", format_text((guchar*)msg, strlen(msg))); offset += msg_len; @@ -1560,9 +1561,9 @@ dissect_tds_err_token(tvbuff_t *tvb, guint offset, guint token_sz _U_, proto_tre if(srvr_len) { if (is_unicode) { srvr_len *=2; - msg = tvb_get_unicode_string(wmem_packet_scope(), tvb, offset, srvr_len, ENC_LITTLE_ENDIAN); + msg = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, srvr_len, ENC_UTF_16|ENC_LITTLE_ENDIAN); } else { - msg = (gchar*)tvb_get_string(wmem_packet_scope(), tvb, offset, srvr_len); + msg = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, srvr_len, ENC_ASCII|ENC_NA); } proto_tree_add_text(tree, tvb, offset, srvr_len, "Server name: %s", msg); offset += srvr_len; @@ -1575,9 +1576,9 @@ dissect_tds_err_token(tvbuff_t *tvb, guint offset, guint token_sz _U_, proto_tre if(proc_len) { if (is_unicode) { proc_len *=2; - msg = tvb_get_unicode_string(wmem_packet_scope(), tvb, offset, proc_len, ENC_LITTLE_ENDIAN); + msg = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, proc_len, ENC_UTF_16|ENC_LITTLE_ENDIAN); } else { - msg = (gchar*)tvb_get_string(wmem_packet_scope(), tvb, offset, proc_len); + msg = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, proc_len, ENC_ASCII|ENC_NA); } proto_tree_add_text(tree, tvb, offset, proc_len, "Process name: %s", msg); offset += proc_len; @@ -1595,7 +1596,6 @@ dissect_tds_login_ack_token(tvbuff_t *tvb, guint offset, guint token_sz, proto_t { guint8 msg_len; guint32 tds_version; - char *msg; gboolean is_unicode = FALSE; proto_tree_add_text(tree, tvb, offset, 1, "Ack: %u", tvb_get_guint8(tvb, offset)); @@ -1630,11 +1630,10 @@ dissect_tds_login_ack_token(tvbuff_t *tvb, guint offset, guint token_sz, proto_t proto_tree_add_text(tree, tvb, offset, 0, "msg_len: %d, token_sz: %d, total: %d",msg_len, token_sz, msg_len + 6U + 3U); if(is_unicode) { msg_len *= 2; - msg = tvb_get_unicode_string(wmem_packet_scope(), tvb, offset, msg_len, ENC_LITTLE_ENDIAN); + proto_tree_add_item(tree, hf_tds_text, tvb, offset, msg_len, ENC_UTF_16|ENC_LITTLE_ENDIAN); } else { - msg = (gchar*)tvb_get_string(wmem_packet_scope(), tvb, offset, msg_len); + proto_tree_add_item(tree, hf_tds_text, tvb, offset, msg_len, ENC_ASCII|ENC_NA); } - proto_tree_add_text(tree, tvb, offset, msg_len, "Text: %s", format_text((guchar*)msg, strlen(msg))); offset += msg_len; proto_tree_add_text(tree, tvb, offset, 4, "Server Version"); @@ -1649,7 +1648,6 @@ dissect_tds7_results_token(tvbuff_t *tvb, guint offset, proto_tree *tree, tds_co guint16 num_columns, table_len; guint8 type, msg_len; int i; - char *msg; num_columns = tvb_get_letohs(tvb, offset); proto_tree_add_text(tree, tvb, offset, 2, "Columns: %u", tvb_get_letohs(tvb, offset)); @@ -1685,8 +1683,7 @@ dissect_tds7_results_token(tvbuff_t *tvb, guint offset, proto_tree *tree, tds_co offset +=2; if(table_len != 0) { table_len *= 2; - msg = tvb_get_unicode_string(wmem_packet_scope(), tvb, offset, table_len, ENC_LITTLE_ENDIAN); - proto_tree_add_text(tree, tvb, offset, table_len, "Table name: %s", msg); + proto_tree_add_item(tree, hf_tds_table_name, tvb, offset, table_len, ENC_UTF_16|ENC_LITTLE_ENDIAN); offset += table_len; } } @@ -1711,8 +1708,7 @@ dissect_tds7_results_token(tvbuff_t *tvb, guint offset, proto_tree *tree, tds_co offset += 1; if(msg_len != 0) { msg_len *= 2; - msg = tvb_get_unicode_string(wmem_packet_scope(), tvb, offset, msg_len, ENC_LITTLE_ENDIAN); - proto_tree_add_text(tree, tvb, offset, msg_len, "Text: %s", msg); + proto_tree_add_item(tree, hf_tds_text, tvb, offset, msg_len, ENC_UTF_16|ENC_LITTLE_ENDIAN); offset += msg_len; } } @@ -1878,7 +1874,6 @@ dissect_tds_type_varbyte(tvbuff_t *tvb, guint *offset, packet_info *pinfo, proto #define CHARBIN_NULL 0xFFFFU #define CHARBIN_NULL32 0xFFFFFFFFU guint32 length; - char *string_value; proto_tree *sub_tree = NULL; proto_item *item = NULL, *length_item = NULL; @@ -1913,8 +1908,7 @@ dissect_tds_type_varbyte(tvbuff_t *tvb, guint *offset, packet_info *pinfo, proto proto_tree_add_item(sub_tree, hf_tds_type_varbyte_data_string, tvb, *offset, length, ENC_ASCII|ENC_NA); break; case TDS_DATA_TYPE_NVARCHAR: /* NVarChar */ - string_value = tvb_get_unicode_string(wmem_packet_scope(), tvb, *offset, length, ENC_LITTLE_ENDIAN); - proto_tree_add_string(sub_tree, hf_tds_type_varbyte_data_string, tvb, *offset, length, string_value); + proto_tree_add_item(sub_tree, hf_tds_type_varbyte_data_string, tvb, *offset, length, ENC_UTF_16|ENC_LITTLE_ENDIAN); break; case TDS_DATA_TYPE_XML: /* XML (introduced in TDS 7.2) */ case TDS_DATA_TYPE_UDT: /* CLR-UDT (introduced in TDS 7.2) */ @@ -2067,8 +2061,7 @@ dissect_tds_type_varbyte(tvbuff_t *tvb, guint *offset, packet_info *pinfo, proto break; case TDS_DATA_TYPE_NVARCHAR: /* NVarChar */ case TDS_DATA_TYPE_NCHAR: /* NChar */ - string_value = tvb_get_unicode_string(wmem_packet_scope(), tvb, *offset, length, ENC_LITTLE_ENDIAN); - proto_tree_add_string(sub_tree, hf_tds_type_varbyte_data_string, tvb, *offset, length, string_value); + proto_tree_add_item(sub_tree, hf_tds_type_varbyte_data_string, tvb, *offset, length, ENC_UTF_16|ENC_LITTLE_ENDIAN); break; default: DISSECTOR_ASSERT_NOT_REACHED(); @@ -2094,8 +2087,7 @@ dissect_tds_type_varbyte(tvbuff_t *tvb, guint *offset, packet_info *pinfo, proto else { switch(data_type) { case TDS_DATA_TYPE_NTEXT: /* NText */ - string_value = tvb_get_unicode_string(wmem_packet_scope(), tvb, *offset, length, ENC_LITTLE_ENDIAN); - proto_tree_add_string(sub_tree, hf_tds_type_varbyte_data_string, tvb, *offset, length, string_value); + proto_tree_add_item(sub_tree, hf_tds_type_varbyte_data_string, tvb, *offset, length, ENC_UTF_16|ENC_LITTLE_ENDIAN); break; default: /*TODO*/ proto_tree_add_expert_format(sub_tree, pinfo, &ei_tds_type_info_type_undecoded, tvb, *offset, length, "Data type %d not supported yet", data_type); @@ -2116,7 +2108,6 @@ dissect_tds_rpc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) proto_tree *sub_tree = NULL, *status_sub_tree = NULL; int offset = 0; guint len; - char *val; guint8 data_type; item = proto_tree_add_item(tree, hf_tds_rpc, tvb, 0, -1, ENC_NA); @@ -2149,8 +2140,7 @@ dissect_tds_rpc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) } else if (len != 0) { len *= 2; - val = tvb_get_unicode_string(wmem_packet_scope(), tvb, offset, len, ENC_LITTLE_ENDIAN); - proto_tree_add_string(tree, hf_tds_rpc_name, tvb, offset, len, val); + proto_tree_add_item(tree, hf_tds_rpc_name, tvb, offset, len, ENC_UTF_16|ENC_LITTLE_ENDIAN); offset += len; } break; @@ -2179,8 +2169,7 @@ dissect_tds_rpc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) ++offset; if(len) { len *= 2; - val = tvb_get_unicode_string(wmem_packet_scope(), tvb, offset, len, ENC_LITTLE_ENDIAN); - proto_tree_add_string(sub_tree, hf_tds_rpc_parameter_name, tvb, offset, len, val); + proto_tree_add_item(sub_tree, hf_tds_rpc_parameter_name, tvb, offset, len, ENC_UTF_16|ENC_LITTLE_ENDIAN); offset += len; } item = proto_tree_add_item(sub_tree, hf_tds_rpc_parameter_status, tvb, offset, 1, ENC_LITTLE_ENDIAN); @@ -2778,6 +2767,16 @@ proto_register_tds(void) FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, + { &hf_tds_table_name, + { "Table name", "tds.table_name", + FT_STRING, STR_UNICODE, NULL, 0x0, + NULL, HFILL } + }, + { &hf_tds_text, + { "Text", "tds.text", + FT_STRING, STR_UNICODE, NULL, 0x0, + NULL, HFILL } + }, { &hf_tds_fragment_overlap, { "Segment overlap", "tds.fragment.overlap", FT_BOOLEAN, BASE_NONE, NULL, 0x0, diff --git a/epan/dissectors/packet-tnef.c b/epan/dissectors/packet-tnef.c index 12b0b979b0..a3460b1119 100644 --- a/epan/dissectors/packet-tnef.c +++ b/epan/dissectors/packet-tnef.c @@ -247,7 +247,7 @@ static const value_string tnef_Attribute_vals[] = { { 0, NULL } }; -static gint dissect_counted_values(tvbuff_t *tvb, gint offset, int hf_id, packet_info *pinfo, proto_tree *tree, gboolean single, gboolean unicode, guint encoding) +static gint dissect_counted_values(tvbuff_t *tvb, gint offset, int hf_id, packet_info *pinfo, proto_tree *tree, gboolean single, guint encoding) { proto_item *item; guint32 length, count, i; @@ -271,12 +271,7 @@ static gint dissect_counted_values(tvbuff_t *tvb, gint offset, int hf_id, packe proto_tree_add_item(tree, hf_tnef_value_length, tvb, offset, 4, ENC_LITTLE_ENDIAN); offset += 4; - if (unicode) { - char *unicode_str = tvb_get_unicode_string(wmem_packet_scope(), tvb, offset, length, ENC_LITTLE_ENDIAN); - proto_tree_add_string(tree, hf_id, tvb, offset, length, unicode_str); - } else { - proto_tree_add_item(tree, hf_id, tvb, offset, length, encoding); - } + proto_tree_add_item(tree, hf_id, tvb, offset, length, encoding); offset += length; /* XXX: may be padding ? */ @@ -406,9 +401,7 @@ static void dissect_mapiprops(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tre proto_tree_add_item(tag_tree, hf_tnef_property_tag_name_length, tvb, offset, 4, ENC_LITTLE_ENDIAN); offset += 4; - name_string = tvb_get_unicode_string (wmem_packet_scope(), tvb, offset, tag_length, ENC_LITTLE_ENDIAN); - proto_tree_add_string_format_value(tag_tree, hf_tnef_property_tag_name_string, tvb, offset, - tag_length, name_string, "%s", name_string); + proto_tree_add_item(tag_tree, hf_tnef_property_tag_name_string, tvb, offset, tag_length, ENC_UTF_16|ENC_LITTLE_ENDIAN); offset += tag_length; if((padding = (4 - tag_length % 4)) != 4) { @@ -437,14 +430,13 @@ static void dissect_mapiprops(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tre break; case PT_STRING8: /* XXX - code page? */ - offset = dissect_counted_values(tvb, offset, hf_tnef_PropValue_lpszA, pinfo, prop_tree, TRUE, FALSE, ENC_ASCII|ENC_NA); + offset = dissect_counted_values(tvb, offset, hf_tnef_PropValue_lpszA, pinfo, prop_tree, TRUE, ENC_ASCII|ENC_NA); break; case PT_BINARY: - offset = dissect_counted_values(tvb, offset, hf_tnef_PropValue_bin, pinfo, prop_tree, TRUE, FALSE, ENC_NA); + offset = dissect_counted_values(tvb, offset, hf_tnef_PropValue_bin, pinfo, prop_tree, TRUE, ENC_NA); break; case PT_UNICODE: - /* XXX - UCS-2 and UTF-16 need ENC_ values */ - offset = dissect_counted_values (tvb, offset, hf_tnef_PropValue_lpszW, pinfo, prop_tree, TRUE, TRUE, ENC_NA); + offset = dissect_counted_values (tvb, offset, hf_tnef_PropValue_lpszW, pinfo, prop_tree, TRUE, ENC_UTF_16|ENC_NA); break; case PT_CLSID: offset = nspi_dissect_struct_MAPIUID(tvb, offset, pinfo, prop_tree, &di, drep, hf_tnef_PropValue_lpguid, 0);