Handle non-Unicode error tokens.

Error tokens (at least in one capture) appear to have a server name in
them; handle that as well.  (They also appear to have 3 more bytes of
stuff in them.)

svn path=/trunk/; revision=9551
This commit is contained in:
Guy Harris 2004-01-05 01:18:53 +00:00
parent 6bd03674ed
commit db85655fb0
1 changed files with 38 additions and 11 deletions

View File

@ -3,7 +3,7 @@
* Copyright 2000-2002, Brian Bruns <camber@ais.org>
* Copyright 2002, Steve Langasek <vorlon@netexpress.net>
*
* $Id: packet-tds.c,v 1.22 2004/01/05 00:55:42 guy Exp $
* $Id: packet-tds.c,v 1.23 2004/01/05 01:18:53 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -828,13 +828,13 @@ dissect_tds_env_chg(tvbuff_t *tvb, guint offset, guint token_sz,
else { /* parse collation info structure. From http://www.freetds.org/tds.html#collate */
offset +=2;
collate_codepage = tvb_get_letohs(tvb, offset);
proto_tree_add_text(tree, tvb, offset, 2, "Codepage: %d" , collate_codepage);
proto_tree_add_text(tree, tvb, offset, 2, "Codepage: %u" , collate_codepage);
offset += 2;
collate_flags = tvb_get_letohs(tvb, offset);
proto_tree_add_text(tree, tvb, offset, 2, "Flags: 0x%x", collate_flags);
offset += 2;
collate_charset_id = tvb_get_guint8(tvb, offset);
proto_tree_add_text(tree, tvb, offset, 1, "Charset ID: %d", collate_charset_id);
proto_tree_add_text(tree, tvb, offset, 1, "Charset ID: %u", collate_charset_id);
offset +=1;
}
}
@ -889,7 +889,6 @@ dissect_tds_msg_token(tvbuff_t *tvb, guint offset, guint token_sz, proto_tree *t
g_free(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);
offset +=1;
@ -904,21 +903,49 @@ dissect_tds_msg_token(tvbuff_t *tvb, guint offset, guint token_sz, proto_tree *t
}
static void
dissect_tds_err_token(tvbuff_t *tvb, guint offset, proto_tree *tree)
dissect_tds_err_token(tvbuff_t *tvb, guint offset, guint token_sz, proto_tree *tree)
{
guint16 msg_len;
guint8 srvr_len;
char *msg;
gboolean is_unicode = FALSE;
proto_tree_add_text(tree, tvb, offset, 4, "SQL Error Number: %d", tvb_get_letohl(tvb, offset));
offset += 4;
proto_tree_add_text(tree, tvb, offset, 1, "State: %d", tvb_get_guint8(tvb, offset));
proto_tree_add_text(tree, tvb, offset, 1, "State: %u", tvb_get_guint8(tvb, offset));
offset +=1;
proto_tree_add_text(tree, tvb, offset, 1, "Level: %d", tvb_get_guint8(tvb, offset));
proto_tree_add_text(tree, tvb, offset, 1, "Level: %u", tvb_get_guint8(tvb, offset));
offset +=1;
msg_len = tvb_get_letohs(tvb, offset);
proto_tree_add_text(tree, tvb, offset, 1, "Error length: %d characters", msg_len);
proto_tree_add_text(tree, tvb, offset, 1, "Error length: %u characters", msg_len);
offset +=2;
msg = tvb_fake_unicode(tvb, offset, msg_len, TRUE);
proto_tree_add_text(tree, tvb, offset, msg_len*2, "Error: %s", format_text(msg, strlen(msg)));
srvr_len = tvb_get_guint8(tvb, offset + msg_len);
if(msg_len + srvr_len + 9U + 3U != token_sz) /* 9 is the length of message number (4), state (1), level (1), msg_len (2), srvr_len (1) fields */
is_unicode = TRUE;
if(is_unicode) {
msg = tvb_fake_unicode(tvb, offset, msg_len, TRUE);
msg_len *= 2;
} else {
msg = tvb_get_string(tvb, offset, msg_len);
}
proto_tree_add_text(tree, tvb, offset, msg_len, "Error: %s", format_text(msg, strlen(msg)));
g_free(msg);
offset += msg_len;
proto_tree_add_text(tree, tvb, offset, 1, "Server name length: %u characters", srvr_len);
offset +=1;
if (is_unicode) {
msg = tvb_fake_unicode(tvb, offset, srvr_len, TRUE);
srvr_len *=2;
} else {
msg = tvb_get_string(tvb, offset, srvr_len);
}
proto_tree_add_text(tree, tvb, offset, srvr_len, "Server name: %s", msg);
g_free(msg);
}
@ -1031,7 +1058,7 @@ dissect_tds_resp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
dissect_tds_msg_token(tvb, pos + 3, token_sz - 3, token_tree);
break;
case TDS_ERR_TOKEN:
dissect_tds_err_token(tvb, pos + 3, token_tree);
dissect_tds_err_token(tvb, pos + 3, token_sz - 3, token_tree);
break;
case TDS_DONE_TOKEN:
dissect_tds_done_token(tvb, pos + 1, token_tree);