summaryrefslogtreecommitdiff
path: root/epan/dissectors/packet-tds.c
diff options
context:
space:
mode:
authorMichael Mann <mmann78@netscape.net>2014-10-17 10:11:22 -0400
committerMichael Mann <mmann78@netscape.net>2014-10-19 12:00:52 +0000
commit8842e2e893822297b5d84ecd06e0e9ae6d914a61 (patch)
tree44ac8dedb8c1e3719e17f953ee8ad1af069bbeec /epan/dissectors/packet-tds.c
parentec5159bf6338ceeffb1cb10240f9f758277f420e (diff)
downloadwireshark-8842e2e893822297b5d84ecd06e0e9ae6d914a61.tar.gz
Eliminate proto_tree_add_text from packet-tds.c
Change-Id: Ib3dc7f8a87e55ef34d4847f4837d645e418607a3 Reviewed-on: https://code.wireshark.org/review/4826 Petri-Dish: Michael Mann <mmann78@netscape.net> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Michael Mann <mmann78@netscape.net>
Diffstat (limited to 'epan/dissectors/packet-tds.c')
-rw-r--r--epan/dissectors/packet-tds.c286
1 files changed, 175 insertions, 111 deletions
diff --git a/epan/dissectors/packet-tds.c b/epan/dissectors/packet-tds.c
index 14b52a2ba7..24f1ebc433 100644
--- a/epan/dissectors/packet-tds.c
+++ b/epan/dissectors/packet-tds.c
@@ -513,6 +513,49 @@ static int hf_tds_rpc_parameter_status_by_ref = -1;
static int hf_tds_rpc_parameter_status_default = -1;
static int hf_tds_rpc_parameter_value = -1;
+/* Generated from convert_proto_tree_add_text.pl */
+static int hf_tds_unknown_bytes_3 = -1;
+static int hf_tds_results_token_flags = -1;
+static int hf_tds_process_name = -1;
+static int hf_tds_columns = -1;
+static int hf_tds_severity_level = -1;
+static int hf_tds_server_name = -1;
+static int hf_tds_tds_packet = -1;
+static int hf_tds_new_value = -1;
+static int hf_tds_text_length = -1;
+static int hf_tds_done_token_status_flags = -1;
+static int hf_tds_large_type_size = -1;
+static int hf_tds_usertype32 = -1;
+static int hf_tds_usertype16 = -1;
+static int hf_tds_language_text = -1;
+static int hf_tds_row_count32 = -1;
+static int hf_tds_error_message_length = -1;
+static int hf_tds_error = -1;
+static int hf_tds_sql_error_number = -1;
+static int hf_tds_new_value_length = -1;
+static int hf_tds_old_value = -1;
+static int hf_tds_operation = -1;
+static int hf_tds_ack = -1;
+static int hf_tds_unknown_bytes_1 = -1;
+static int hf_tds_results_token_type = -1;
+static int hf_tds_env_chg_type = -1;
+static int hf_tds_lang_token_status = -1;
+static int hf_tds_unknown_bytes_4 = -1;
+static int hf_tds_old_value_length = -1;
+static int hf_tds_message_length = -1;
+static int hf_tds_server_version = -1;
+static int hf_tds_row_count64 = -1;
+static int hf_tds_line_number32 = -1;
+static int hf_tds_query = -1;
+static int hf_tds_server_name_length = -1;
+static int hf_tds_state = -1;
+static int hf_tds_line_number16 = -1;
+static int hf_tds_process_name_length = -1;
+static int hf_tds_login_offset = -1;
+static int hf_tds_login_length = -1;
+static int hf_tds_login_password = -1;
+static int hf_tds_token_len = -1;
+
/* Initialize the subtree pointers */
static gint ett_tds = -1;
static gint ett_tds_status = -1;
@@ -531,12 +574,14 @@ static gint ett_tds_rpc_parameter_status = -1;
static gint ett_tds7_query = -1;
static gint ett_tds7_login = -1;
static gint ett_tds7_hdr = -1;
+static gint ett_tds_col = -1;
static expert_field ei_tds_type_info_type_undecoded = EI_INIT;
static expert_field ei_tds_invalid_length = EI_INIT;
static expert_field ei_tds_token_length_invalid = EI_INIT;
static expert_field ei_tds_type_info_type = EI_INIT;
static expert_field ei_tds_all_headers_header_type = EI_INIT;
+static expert_field ei_tds_token_stats = EI_INIT;
/* Desegmentation of Netlib buffers crossing TCP segment boundaries. */
static gboolean tds_desegment = TRUE;
@@ -833,14 +878,6 @@ tds_tvb_get_xxtohl(tvbuff_t *tvb, gint offset, gboolean tds_little_endian_flag)
return tvb_get_ntohl(tvb, offset);
}
-static guint64
-tds_tvb_get_xxtoh64(tvbuff_t *tvb, gint offset, gboolean tds_little_endian_flag) {
- if (tds_little_endian_flag)
- return tvb_get_letoh64(tvb, offset);
- else
- return tvb_get_ntoh64(tvb, offset);
-}
-
static int
tds_token_is_fixed_size(guint8 token)
{
@@ -978,7 +1015,6 @@ dissect_tds_query_packet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, td
{
guint offset, len;
guint string_encoding = ENC_UTF_16|ENC_LITTLE_ENDIAN;
- char *msg;
proto_tree *query_tree;
@@ -992,23 +1028,19 @@ dissect_tds_query_packet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, td
((len < 2) || tvb_get_guint8(tvb, offset+1) != 0)))
string_encoding = ENC_ASCII|ENC_NA;
- 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;
+ proto_tree_add_item(query_tree, hf_tds_query, tvb, offset, len, string_encoding);
+ /* offset += len; */
}
static void
dissect_tds5_lang_token(tvbuff_t *tvb, guint offset, guint len, proto_tree *tree) {
- char *msg;
-
- proto_tree_add_text(tree, tvb, offset, 1 , "Status: %u", tvb_get_guint8(tvb, offset));
+
+ proto_tree_add_item(tree, hf_tds_lang_token_status, tvb, offset, 1, ENC_NA);
offset += 1;
len -= 1;
- msg = (gchar*)tvb_get_string_enc(wmem_packet_scope(), tvb, offset, len, ENC_ASCII);
- proto_tree_add_text(tree, tvb, offset, len, "Language text: %s", msg);
+ proto_tree_add_item(tree, hf_tds_language_text, tvb, offset, len, ENC_ASCII|ENC_NA);
}
static void
@@ -1022,6 +1054,7 @@ dissect_tds_query5_packet(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tre
guint token_sz;
proto_tree *query_tree;
proto_tree *token_tree;
+ proto_item *token_item;
offset = 0;
query_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_tds7_query, NULL, "TDS5 Query Packet");
@@ -1040,24 +1073,24 @@ dissect_tds_query5_packet(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tre
token_sz = tds_get_variable_token_size(tvb, pos+1, token, &token_len_field_size,
&token_len_field_val);
- /* XXX - Should this check be done in tds_get_variable_token_size()
- * instead? */
+ token_tree = proto_tree_add_subtree_format(query_tree, tvb, pos, token_sz,
+ ett_tds_token, &token_item, "Token 0x%02x %s", token,
+ val_to_str_const(token, token_names, "Unknown Token Type"));
+
if ((int) token_sz < 0) {
- proto_tree_add_text(query_tree, tvb, 0, 0, "Bogus token size: %u",
- token_sz);
+ expert_add_info_format(pinfo, token_item, &ei_tds_token_length_invalid, "Bogus token size: %u", token_sz);
break;
}
- token_tree = proto_tree_add_subtree_format(query_tree, tvb, pos, token_sz,
- ett_tds_token, NULL, "Token 0x%02x %s", token,
- val_to_str_const(token, token_names, "Unknown Token Type"));
-
/*
* If it's a variable token, put the length field in here
* instead of replicating this for each token subdissector.
*/
if (!tds_token_is_fixed_size(token))
- proto_tree_add_text(token_tree, tvb, pos+1, token_len_field_size, "Length: %u", token_len_field_val);
+ {
+ token_item = proto_tree_add_uint(token_tree, hf_tds_token_len, tvb, pos + 1, 1, token_len_field_val);
+ proto_item_set_len(token_item, token_len_field_size);
+ }
switch (token) {
case TDS_LANG_TOKEN:
@@ -1146,12 +1179,12 @@ dissect_tds7_login(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
for (i = 0; i < 9; i++) {
offset2 = tvb_get_letohs(tvb, offset + i*4);
len = tvb_get_letohs(tvb, offset + i*4 + 2);
- proto_tree_add_text(length_tree, tvb, offset + i*4, 2,
- "%s offset: %u",
+ proto_tree_add_uint_format(length_tree, hf_tds_login_offset, tvb, offset + i*4, 2,
+ offset2, "%s offset: %u",
val_to_str_const(i, login_field_names, "Unknown"),
offset2);
- proto_tree_add_text(length_tree, tvb, offset + i*4 + 2, 2,
- "%s length: %u",
+ proto_tree_add_uint_format(length_tree, hf_tds_login_length, tvb, offset + i*4 + 2, 2,
+ len, "%s length: %u",
val_to_str_const(i, login_field_names, "Unknown"),
len);
if (len != 0) {
@@ -1159,7 +1192,8 @@ dissect_tds7_login(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
/* tds 7 is always unicode */
len *= 2;
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);
+ proto_tree_add_string_format(login_tree, hf_tds_login_password, tvb, offset2, len, val,
+ "%s: %s", val_to_str_const(i, login_field_names, "Unknown"), val);
} else {
/* This field is the password. We retrieve it from the packet
* as a non-unicode string and then perform two operations on it
@@ -1182,7 +1216,8 @@ dissect_tds7_login(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
val2[k] = '\0'; /* Null terminate our new string */
- proto_tree_add_text(login_tree, tvb, offset2, len, "%s: %s", val_to_str_const(i, login_field_names, "Unknown"), val2);
+ proto_tree_add_string_format(login_tree, hf_tds_login_password, tvb, offset2, len, val2,
+ "%s: %s", val_to_str_const(i, login_field_names, "Unknown"), val2);
}
}
}
@@ -1442,13 +1477,11 @@ dissect_tds_env_chg(tvbuff_t *tvb, guint offset, guint token_sz,
{
guint8 env_type;
guint old_len, new_len, old_len_offset;
- char *new_val = NULL, *old_val = NULL;
guint32 string_offset;
gboolean is_unicode = FALSE;
env_type = tvb_get_guint8(tvb, offset);
- proto_tree_add_text(tree, tvb, offset, 1, "Type: %u (%s)", env_type,
- val_to_str_const(env_type, env_chg_names, "Unknown"));
+ proto_tree_add_item(tree, hf_tds_env_chg_type, tvb, offset, 1, ENC_NA);
new_len = tvb_get_guint8(tvb, offset+1);
old_len_offset = offset + new_len + 2;
@@ -1464,20 +1497,15 @@ dissect_tds_env_chg(tvbuff_t *tvb, guint offset, guint token_sz,
old_len = tvb_get_guint8(tvb, old_len_offset);
}
- proto_tree_add_text(tree, tvb, offset + 1, 1, "New Value Length: %u",
- new_len);
+ proto_tree_add_item(tree, hf_tds_new_value_length, tvb, offset + 1, 1, ENC_NA);
if (new_len) {
if (env_type != 7) { /* if it's not 'Collation Info - which is not textual! */
string_offset = offset + 2;
if (is_unicode == TRUE) {
new_len *= 2;
- new_val = tvb_get_string_enc(wmem_packet_scope(), tvb, string_offset,
- new_len, ENC_UTF_16|ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_tds_new_value, tvb, string_offset, new_len, ENC_UTF_16|ENC_LITTLE_ENDIAN);
} else
- 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);
+ proto_tree_add_item(tree, hf_tds_new_value, tvb, string_offset, new_len, ENC_ASCII|ENC_NA);
}
else { /* parse collation info structure. From http://www.freetds.org/tds.html#collate */
offset +=2;
@@ -1490,19 +1518,14 @@ dissect_tds_env_chg(tvbuff_t *tvb, guint offset, guint token_sz,
}
}
- proto_tree_add_text(tree, tvb, old_len_offset, 1, "Old Value Length: %u",
- old_len);
+ proto_tree_add_item(tree, hf_tds_old_value_length, tvb, old_len_offset, 1, ENC_NA);
if (old_len) {
string_offset = old_len_offset + 1;
if (is_unicode == TRUE) {
old_len *= 2;
- old_val = tvb_get_string_enc(wmem_packet_scope(), tvb, string_offset,
- old_len, ENC_UTF_16|ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_tds_old_value, tvb, string_offset, old_len, ENC_UTF_16|ENC_LITTLE_ENDIAN);
} else
- 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);
+ proto_tree_add_item(tree, hf_tds_old_value, tvb, string_offset, old_len, ENC_ASCII|ENC_NA);
}
}
@@ -1511,18 +1534,18 @@ dissect_tds_err_token(tvbuff_t *tvb, guint offset, guint token_sz _U_, proto_tre
{
guint16 msg_len;
guint8 srvr_len, proc_len;
- char *msg;
+ int encoding = tds_little_endian ? ENC_LITTLE_ENDIAN : ENC_BIG_ENDIAN;
gboolean is_unicode = FALSE;
- proto_tree_add_text(tree, tvb, offset, 4, "SQL Error Number: %d", tds_tvb_get_xxtohl(tvb, offset, tds_little_endian));
+ proto_tree_add_item(tree, hf_tds_sql_error_number, tvb, offset, 4, encoding);
offset += 4;
- proto_tree_add_text(tree, tvb, offset, 1, "State: %u", tvb_get_guint8(tvb, offset));
+ proto_tree_add_item(tree, hf_tds_state, tvb, offset, 1, ENC_NA);
offset +=1;
- proto_tree_add_text(tree, tvb, offset, 1, "Severity Level: %u", tvb_get_guint8(tvb, offset));
+ proto_tree_add_item(tree, hf_tds_severity_level, tvb, offset, 1, ENC_NA);
offset +=1;
msg_len = tds_tvb_get_xxtohs(tvb, offset, tds_little_endian);
- proto_tree_add_text(tree, tvb, offset, 1, "Error message length: %u characters", msg_len);
+ proto_tree_add_uint_format_value(tree, hf_tds_error_message_length, tvb, offset, 2, msg_len, "%u characters", msg_len);
offset +=2;
if(tvb_get_guint8(tvb, offset+1) == 0) /* FIXME: It's probably unicode, if the 2nd byte of the message is zero. It's not a good detection method, but it works */
@@ -1530,58 +1553,56 @@ dissect_tds_err_token(tvbuff_t *tvb, guint offset, guint token_sz _U_, proto_tre
if(is_unicode) {
msg_len *= 2;
- msg = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, msg_len, ENC_UTF_16|ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_tds_error, tvb, offset, msg_len, ENC_UTF_16|ENC_LITTLE_ENDIAN);
} else {
- msg = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, msg_len, ENC_ASCII|ENC_NA);
+ proto_tree_add_item(tree, hf_tds_error, 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;
srvr_len = tvb_get_guint8(tvb, offset);
- proto_tree_add_text(tree, tvb, offset, 1, "Server name length: %u characters", srvr_len);
+ proto_tree_add_uint_format_value(tree, hf_tds_server_name_length, tvb, offset, 1, srvr_len, "%u characters", srvr_len);
offset +=1;
if(srvr_len) {
if (is_unicode) {
srvr_len *=2;
- msg = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, srvr_len, ENC_UTF_16|ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_tds_server_name, tvb, offset, srvr_len, ENC_UTF_16|ENC_LITTLE_ENDIAN);
} else {
- msg = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, srvr_len, ENC_ASCII|ENC_NA);
+ proto_tree_add_item(tree, hf_tds_server_name, tvb, offset, srvr_len, ENC_ASCII|ENC_NA);
}
- proto_tree_add_text(tree, tvb, offset, srvr_len, "Server name: %s", msg);
offset += srvr_len;
}
proc_len = tvb_get_guint8(tvb, offset);
- proto_tree_add_text(tree, tvb, offset, 1, "Process name length: %u characters", proc_len);
+ proto_tree_add_uint_format_value(tree, hf_tds_process_name_length, tvb, offset, 1, proc_len, "%u characters", proc_len);
offset +=1;
if(proc_len) {
if (is_unicode) {
proc_len *=2;
- msg = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, proc_len, ENC_UTF_16|ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(tree, hf_tds_process_name, tvb, offset, proc_len, ENC_UTF_16|ENC_LITTLE_ENDIAN);
} else {
- msg = tvb_get_string_enc(wmem_packet_scope(), tvb, offset, proc_len, ENC_ASCII|ENC_NA);
+ proto_tree_add_item(tree, hf_tds_process_name, tvb, offset, proc_len, ENC_ASCII|ENC_NA);
}
- proto_tree_add_text(tree, tvb, offset, proc_len, "Process name: %s", msg);
offset += proc_len;
}
if (TDS_PROTO_TDS7_2_OR_GREATER) {
- proto_tree_add_text(tree, tvb, offset, 4, "line number: %d", tds_tvb_get_xxtohl(tvb, offset, tds_little_endian));
+ proto_tree_add_item(tree, hf_tds_line_number32, tvb, offset, 4, encoding);
} else {
- proto_tree_add_text(tree, tvb, offset, 2, "line number: %d", tds_tvb_get_xxtohs(tvb, offset, tds_little_endian));
+ proto_tree_add_item(tree, hf_tds_line_number16, tvb, offset, 2, encoding);
}
}
static int
-dissect_tds_login_ack_token(tvbuff_t *tvb, guint offset, guint token_sz, proto_tree *tree, tds_conv_info_t *tds_info)
+dissect_tds_login_ack_token(tvbuff_t *tvb, packet_info *pinfo, guint offset, guint token_sz, proto_tree *tree, tds_conv_info_t *tds_info)
{
guint8 msg_len;
guint32 tds_version;
gboolean is_unicode = FALSE;
+ proto_item* ti;
- proto_tree_add_text(tree, tvb, offset, 1, "Ack: %u", tvb_get_guint8(tvb, offset));
+ proto_tree_add_item(tree, hf_tds_ack, tvb, offset, 1, ENC_NA);
offset +=1;
tds_version = tvb_get_ntohl(tvb, offset);
switch (tds_version) {
@@ -1605,12 +1626,12 @@ dissect_tds_login_ack_token(tvbuff_t *tvb, guint offset, guint token_sz, proto_t
offset += 4;
msg_len = tvb_get_guint8(tvb, offset);
- proto_tree_add_text(tree, tvb, offset, 1, "Text length: %u characters", msg_len);
+ ti = proto_tree_add_uint_format_value(tree, hf_tds_text_length, tvb, offset, 1, msg_len, "%u characters", msg_len);
offset +=1;
if(msg_len + 6U + 3U != token_sz - 1) /* 6 is the length of ack(1), version (4), text length (1) fields */
is_unicode = TRUE;
- proto_tree_add_text(tree, tvb, offset, 0, "msg_len: %d, token_sz: %d, total: %d",msg_len, token_sz, msg_len + 6U + 3U);
+ expert_add_info_format(pinfo, ti, &ei_tds_token_stats, "msg_len: %d, token_sz: %d, total: %d",msg_len, token_sz, msg_len + 6U + 3U);
if(is_unicode) {
msg_len *= 2;
proto_tree_add_item(tree, hf_tds_text, tvb, offset, msg_len, ENC_UTF_16|ENC_LITTLE_ENDIAN);
@@ -1619,7 +1640,7 @@ dissect_tds_login_ack_token(tvbuff_t *tvb, guint offset, guint token_sz, proto_t
}
offset += msg_len;
- proto_tree_add_text(tree, tvb, offset, 4, "Server Version");
+ proto_tree_add_item(tree, hf_tds_server_version, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
return offset;
@@ -1631,67 +1652,68 @@ 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;
+ proto_tree* col_tree;
num_columns = tvb_get_letohs(tvb, offset);
- proto_tree_add_text(tree, tvb, offset, 2, "Columns: %u", tvb_get_letohs(tvb, offset));
+ proto_tree_add_item(tree, hf_tds_columns, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset +=2;
for(i=0; i != num_columns; i++) {
- proto_tree_add_text(tree, tvb, offset, 0, "Column %d", i + 1);
+ col_tree = proto_tree_add_subtree_format(tree, tvb, offset, 0, ett_tds_col, NULL, "Column %d", i + 1);
if (TDS_PROTO_TDS7_2_OR_GREATER) {
- proto_tree_add_text(tree, tvb, offset, 4, "usertype: %d", tvb_get_letohl(tvb, offset));
+ proto_tree_add_item(col_tree, hf_tds_usertype32, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset +=4;
} else {
- proto_tree_add_text(tree, tvb, offset, 2, "usertype: %d", tvb_get_letohs(tvb, offset));
+ proto_tree_add_item(col_tree, hf_tds_usertype16, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset +=2;
}
- proto_tree_add_text(tree, tvb, offset, 2, "flags: %d", tvb_get_letohs(tvb, offset));
+ proto_tree_add_item(col_tree, hf_tds_results_token_flags, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset +=2;
type = tvb_get_guint8(tvb, offset);
- proto_tree_add_text(tree, tvb, offset, 1, "Type: %d", type);
+ proto_tree_add_item(col_tree, hf_tds_results_token_type, tvb, offset, 1, ENC_NA);
offset +=1;
if(type == 38 || type == 104 || type == 109 || type == 111) { /* ugly, ugly hack. Wish I knew what it really means!*/
- proto_tree_add_text(tree, tvb, offset, 1, "unknown 1 byte (%x)", tvb_get_guint8(tvb, offset));
+ proto_tree_add_item(col_tree, hf_tds_unknown_bytes_1, tvb, offset, 1, ENC_NA);
offset +=1;
}
else if (type == 35) {
- proto_tree_add_text(tree, tvb, offset, 4, "unknown 4 bytes (%x)", tvb_get_letohl(tvb, offset));
+ proto_tree_add_item(col_tree, hf_tds_unknown_bytes_4, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
- proto_tree_add_item(tree, hf_tds_collate_codepage, tvb, offset, 2, ENC_LITTLE_ENDIAN );
+ proto_tree_add_item(col_tree, hf_tds_collate_codepage, tvb, offset, 2, ENC_LITTLE_ENDIAN );
offset += 2;
- proto_tree_add_item(tree, hf_tds_collate_flags, tvb, offset, 2, ENC_LITTLE_ENDIAN );
+ proto_tree_add_item(col_tree, hf_tds_collate_flags, tvb, offset, 2, ENC_LITTLE_ENDIAN );
offset += 2;
- proto_tree_add_item(tree, hf_tds_collate_charset_id, tvb, offset, 1, ENC_LITTLE_ENDIAN );
+ proto_tree_add_item(col_tree, hf_tds_collate_charset_id, tvb, offset, 1, ENC_LITTLE_ENDIAN );
offset +=1;
table_len = tvb_get_letohs(tvb, offset);
offset +=2;
if(table_len != 0) {
table_len *= 2;
- proto_tree_add_item(tree, hf_tds_table_name, tvb, offset, table_len, ENC_UTF_16|ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(col_tree, hf_tds_table_name, tvb, offset, table_len, ENC_UTF_16|ENC_LITTLE_ENDIAN);
offset += table_len;
}
}
else if (type == 106 || type == 108) {
- proto_tree_add_text(tree, tvb, offset, 3, "unknown 3 bytes");
+ proto_tree_add_item(col_tree, hf_tds_unknown_bytes_3, tvb, offset, 3, ENC_LITTLE_ENDIAN);
offset +=3;
}
else if(type > 128) {
- proto_tree_add_text(tree, tvb, offset, 2, "Large type size: 0x%x", tvb_get_letohs(tvb, offset));
+ proto_tree_add_item(col_tree, hf_tds_large_type_size, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
if (type != 165) {
- proto_tree_add_item(tree, hf_tds_collate_codepage, tvb, offset, 2, ENC_LITTLE_ENDIAN );
+ proto_tree_add_item(col_tree, hf_tds_collate_codepage, tvb, offset, 2, ENC_LITTLE_ENDIAN );
offset += 2;
- proto_tree_add_item(tree, hf_tds_collate_flags, tvb, offset, 2, ENC_LITTLE_ENDIAN );
+ proto_tree_add_item(col_tree, hf_tds_collate_flags, tvb, offset, 2, ENC_LITTLE_ENDIAN );
offset += 2;
- proto_tree_add_item(tree, hf_tds_collate_charset_id, tvb, offset, 1, ENC_LITTLE_ENDIAN );
+ proto_tree_add_item(col_tree, hf_tds_collate_charset_id, tvb, offset, 1, ENC_LITTLE_ENDIAN );
offset +=1;
}
}
msg_len = tvb_get_guint8(tvb, offset);
- proto_tree_add_text(tree, tvb, offset, 1, "message length: %d",msg_len);
+ proto_tree_add_item(col_tree, hf_tds_message_length, tvb, offset, 1, ENC_NA);
offset += 1;
if(msg_len != 0) {
msg_len *= 2;
- proto_tree_add_item(tree, hf_tds_text, tvb, offset, msg_len, ENC_UTF_16|ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(col_tree, hf_tds_text, tvb, offset, msg_len, ENC_UTF_16|ENC_LITTLE_ENDIAN);
offset += msg_len;
}
}
@@ -1701,16 +1723,16 @@ dissect_tds7_results_token(tvbuff_t *tvb, guint offset, proto_tree *tree, tds_co
static void
dissect_tds_done_token(tvbuff_t *tvb, guint offset, proto_tree *tree, tds_conv_info_t *tds_info)
{
- proto_tree_add_text(tree, tvb, offset, 2, "Status flags");
+ int encoding = tds_little_endian ? ENC_LITTLE_ENDIAN : ENC_BIG_ENDIAN;
+
+ proto_tree_add_item(tree, hf_tds_done_token_status_flags, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
- proto_tree_add_text(tree, tvb, offset, 2, "Operation");
+ proto_tree_add_item(tree, hf_tds_operation, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
if (TDS_PROTO_TDS7_2_OR_GREATER) {
- proto_tree_add_text(tree, tvb, offset, 8, "row count: %" G_GINT64_MODIFIER "u",
- tds_tvb_get_xxtoh64(tvb, offset, tds_little_endian));
+ proto_tree_add_item(tree, hf_tds_row_count64, tvb, offset, 8, encoding);
} else {
- proto_tree_add_text(tree, tvb, offset, 4, "row count: %u",
- tds_tvb_get_xxtohl(tvb, offset, tds_little_endian));
+ proto_tree_add_item(tree, hf_tds_row_count32, tvb, offset, 4, encoding);
}
}
@@ -2203,16 +2225,15 @@ dissect_tds_resp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, tds_conv_i
token_sz = tds_get_variable_token_size(tvb, pos + 1,
token, &token_len_field_size, &token_len_field_val);
- length_remaining = tvb_ensure_length_remaining(tvb, pos);
+ length_remaining = tvb_reported_length_remaining(tvb, pos);
+ token_tree = proto_tree_add_subtree_format(tree, tvb, pos, token_sz,
+ ett_tds_token, &token_item, "Token 0x%02x %s", token,
+ val_to_str_const(token, token_names, "Unknown Token Type"));
if ((int) token_sz < 0) {
- token_item = proto_tree_add_text(tree, tvb, pos, 0, "Token");
expert_add_info_format(pinfo, token_item, &ei_tds_token_length_invalid, "Bogus token size: %u", token_sz);
break;
}
- token_tree = proto_tree_add_subtree_format(tree, tvb, pos, token_sz,
- ett_tds_token, &token_item, "Token 0x%02x %s", token,
- val_to_str_const(token, token_names, "Unknown Token Type"));
if ((int) token_len_field_size < 0) {
expert_add_info_format(pinfo, token_item, &ei_tds_token_length_invalid, "Bogus token length field size: %u", token_len_field_size);
@@ -2224,9 +2245,8 @@ dissect_tds_resp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, tds_conv_i
* instead of replicating this for each token subdissector.
*/
if (!tds_token_is_fixed_size(token) && token != TDS_ROW_TOKEN) {
- proto_tree_add_text(token_tree, tvb, pos + 1,
- token_len_field_size, "Length: %u",
- token_len_field_val);
+ token_item = proto_tree_add_uint(token_tree, hf_tds_token_len, tvb, pos + 1, 1, token_len_field_val);
+ proto_item_set_len(token_item, token_len_field_size);
}
if (token_sz > (guint)length_remaining)
@@ -2274,7 +2294,7 @@ dissect_tds_resp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, tds_conv_i
dissect_tds_done_token(tvb, pos + 1, token_tree, tds_info);
break;
case TDS_LOGIN_ACK_TOKEN:
- dissect_tds_login_ack_token(tvb, pos + 3, token_sz - 3, token_tree, tds_info);
+ dissect_tds_login_ack_token(tvb, pinfo, pos + 3, token_sz - 3, token_tree, tds_info);
break;
case TDS7_RESULT_TOKEN:
pos = (dissect_tds7_results_token(tvb, pos + 1, token_tree, tds_info)-1);
@@ -2403,8 +2423,7 @@ dissect_netlib_buffer(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
dissect_tds_nt(next_tvb, pinfo, tds_tree, offset - 8, -1);
break;
default:
- proto_tree_add_text(tds_tree, next_tvb, 0, -1,
- "TDS Packet");
+ proto_tree_add_item(tds_tree, hf_tds_tds_packet, next_tvb, 0, -1, ENC_NA);
break;
}
} else {
@@ -3128,6 +3147,49 @@ proto_register_tds(void)
FT_NONE, BASE_NONE, NULL, 0x0,
NULL, HFILL }
},
+
+ /* Generated from convert_proto_tree_add_text.pl */
+ { &hf_tds_query, { "Query", "tds.query", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_lang_token_status, { "Status", "tds.lang_token_status", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_language_text, { "Language text", "tds.language_text", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_env_chg_type, { "Type", "tds.env_chg_type", FT_UINT8, BASE_DEC, VALS(env_chg_names), 0x0, NULL, HFILL }},
+ { &hf_tds_new_value_length, { "New Value Length", "tds.new_value_length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_new_value, { "New Value", "tds.new_value", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_old_value_length, { "Old Value Length", "tds.old_value_length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_old_value, { "Old Value", "tds.old_value", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_sql_error_number, { "SQL Error Number", "tds.sql_error_number", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_state, { "State", "tds.state", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_severity_level, { "Severity Level", "tds.severity_level", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_error_message_length, { "Error message length", "tds.error_message_length", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_error, { "Error", "tds.error", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_server_name_length, { "Server name length", "tds.server_name_length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_server_name, { "Server name", "tds.server_name", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_process_name_length, { "Process name length", "tds.process_name_length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_process_name, { "Process name", "tds.process_name", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_line_number16, { "line number", "tds.line_number", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_line_number32, { "line number", "tds.line_number", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_ack, { "Ack", "tds.ack", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_text_length, { "Text length", "tds.text_length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_server_version, { "Server Version", "tds.server_version", FT_UINT32, BASE_NONE, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_columns, { "Columns", "tds.columns", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_usertype32, { "usertype", "tds.usertype", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_usertype16, { "usertype", "tds.usertype", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_results_token_flags, { "flags", "tds.results_token_flags", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_results_token_type, { "Type", "tds.results_token_type", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_unknown_bytes_1, { "Unknown byte", "tds.unknown_bytes", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_unknown_bytes_4, { "Unknown bytes", "tds.unknown_bytes", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_unknown_bytes_3, { "Unknown bytes", "tds.unknown_bytes", FT_UINT24, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_large_type_size, { "Large type size", "tds.large_type_size", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_message_length, { "message length", "tds.message_length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_done_token_status_flags, { "Status flags", "tds.done_token.status_flags", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_operation, { "Operation", "tds.operation", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_row_count64, { "row count", "tds.row_count", FT_UINT64, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_row_count32, { "row count", "tds.row_count", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_tds_packet, { "TDS Packet", "tds.tds_packet", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_login_offset, { "Offset", "tds.login_offset", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_login_length, { "Length", "tds.login_length", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_login_password, { "Password", "tds.login_password", FT_STRING, BASE_NONE, NULL, 0x0, NULL, HFILL }},
+ { &hf_tds_token_len, { "Length", "tds.token_len", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
};
static gint *ett[] = {
@@ -3148,6 +3210,7 @@ proto_register_tds(void)
&ett_tds7_query,
&ett_tds7_login,
&ett_tds7_hdr,
+ &ett_tds_col,
};
static ei_register_info ei[] = {
@@ -3156,6 +3219,7 @@ proto_register_tds(void)
{ &ei_tds_type_info_type_undecoded, { "tds.type_info.type.undecoded", PI_UNDECODED, PI_ERROR, "Data type not supported yet", EXPFILL }},
{ &ei_tds_invalid_length, { "tds.invalid_length", PI_MALFORMED, PI_ERROR, "Invalid length", EXPFILL }},
{ &ei_tds_token_length_invalid, { "tds.token.length.invalid", PI_PROTOCOL, PI_WARN, "Bogus token size", EXPFILL }},
+ { &ei_tds_token_stats, { "tds.token.stats", PI_PROTOCOL, PI_NOTE, "Token stats", EXPFILL }},
};
module_t *tds_module;