aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--packet-tds.c147
-rw-r--r--randpkt.c25
2 files changed, 99 insertions, 73 deletions
diff --git a/packet-tds.c b/packet-tds.c
index 9fb2fc0ba4..0c9a4cf697 100644
--- a/packet-tds.c
+++ b/packet-tds.c
@@ -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.4 2002/09/28 16:04:03 sharpe Exp $
+ * $Id: packet-tds.c,v 1.5 2002/11/17 21:47:41 gerald Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@@ -283,16 +283,17 @@ static const value_string login_field_names[] = {
#define MAX_COLUMNS 256
+#define REM_BUF_SIZE 4096
/*
* this is where we store the column information to be used in decoding the
* TDS_ROW_TOKEN PDU's
*/
struct _tds_col {
- char name[256];
- int utype;
- int ctype;
- int csize;
+ gchar name[256];
+ guint16 utype;
+ guint8 ctype;
+ guint csize;
};
/*
@@ -305,7 +306,7 @@ struct _conv_data {
guint num_cols;
struct _tds_col *columns[MAX_COLUMNS];
guint tds_bytes_left;
- unsigned char tds_remainder[4096];
+ guint8 tds_remainder[REM_BUF_SIZE];
};
/*
@@ -317,21 +318,21 @@ struct _packet_data {
guint num_cols;
struct _tds_col *columns[MAX_COLUMNS];
guint tds_bytes_left;
- unsigned char tds_remainder[4096];
+ guint8 tds_remainder[REM_BUF_SIZE];
};
/*
* and finally a place for netlib packets within tcp packets
*/
struct _netlib_data {
- guint packet_type;
- guint packet_size;
- guint packet_last;
+ guint8 packet_type;
+ guint8 packet_last;
+ guint16 packet_size;
guint netlib_unread_bytes;
guint num_cols;
struct _tds_col *columns[MAX_COLUMNS];
guint tds_bytes_left;
- unsigned char tds_remainder[4096];
+ guint8 tds_remainder[REM_BUF_SIZE];
};
/* all the standard memory management stuff */
@@ -360,9 +361,9 @@ static void dissect_tds_ntlmssp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *t
call_dissector(ntlmssp_handle, ntlmssp_tvb, pinfo, tree);
}
-static void dissect_tds7_login(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int length)
+static void dissect_tds7_login(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint length)
{
- int offset, offset2, len, i;
+ guint offset, i, offset2, len;
guint16 bc;
gboolean is_unicode = TRUE;
const char *val;
@@ -381,7 +382,7 @@ static void dissect_tds7_login(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr
/* create display subtree for the protocol */
login_hdr = proto_tree_add_text(tree, tds7_tvb, 0, length,
- "TDS7 Login Packet");
+ "TDS7 Login Packet");
login_tree = proto_item_add_subtree(login_hdr, ett_tds7_login);
header_hdr = proto_tree_add_text(login_tree, tds7_tvb, offset, 50, "Login Packet Header");
@@ -390,19 +391,18 @@ static void dissect_tds7_login(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tr
offset2 = tvb_get_letohs(tds7_tvb, offset + i*4);
len = tvb_get_letohs(tds7_tvb, offset + i*4 + 2);
proto_tree_add_text(header_tree, tds7_tvb, offset + i*4, 2,
- "%s offset: %d",val_to_str(i,login_field_names,"Unknown"),
- offset2);
+ "%s offset: %d",val_to_str(i,login_field_names,"Unknown"),
+ offset2);
proto_tree_add_text(header_tree, tds7_tvb, offset + i*4 + 2, 2,
- "%s length: %d",val_to_str(i,login_field_names,"Unknown"),
- len);
- if (len) {
+ "%s length: %d",val_to_str(i,login_field_names,"Unknown"),
+ len);
+ if (len > 0) {
if (is_unicode == TRUE)
len *= 2;
val = get_unicode_or_ascii_string(tds7_tvb, &offset2,
- is_unicode, &len,
- TRUE, TRUE, &bc);
+ is_unicode, &len, TRUE, TRUE, &bc);
proto_tree_add_text(login_tree, tds7_tvb, offset2, len,
- "%s: %s", val_to_str(i, login_field_names, "Unknown"), val);
+ "%s: %s", val_to_str(i, login_field_names, "Unknown"), val);
}
}
@@ -497,7 +497,7 @@ static char *data_to_string(void *data, guint col_type, guint col_size)
static int
get_skip_count(tvbuff_t *tvb, guint offset, struct _netlib_data *nl_data, guint last_byte)
{
-int token;
+guint8 token;
guint i;
int csize;
unsigned int cur;
@@ -513,7 +513,7 @@ int switched = 0;
case TDS_ROW_TOKEN:
buf = nl_data->tds_remainder;
cur = 1;
- for (i=0;i<nl_data->num_cols;i++) {
+ for (i = 0; i < nl_data->num_cols; i++) {
if (! is_fixed_coltype(nl_data->columns[i]->ctype)) {
if (!switched && cur >= nl_data->tds_bytes_left) {
switched = 1;
@@ -571,50 +571,54 @@ guint cur, i, csize;
* read the results PDU and store the relevent information in the _netlib_data
* structure for later use (see tds_get_row_size)
* XXX - assumes that result token will be entirely contained within packet
- * boundry
+ * boundary
*/
static gboolean
-read_results_tds5(tvbuff_t *tvb, struct _netlib_data *nl_data, int offset)
+read_results_tds5(tvbuff_t *tvb, struct _netlib_data *nl_data, guint offset)
{
guint len, name_len;
guint cur;
guint i;
- len = tvb_get_letohs(tvb, offset+1);
- cur = offset + 3;
+len = tvb_get_letohs(tvb, offset+1);
+cur = offset + 3;
- /*
- * This would be the logical place to check for little/big endianess if we
- * didn't see the login packet.
- */
- nl_data->num_cols = tvb_get_letohs(tvb, cur);
+ /*
+ * This would be the logical place to check for little/big endianess if we
+ * didn't see the login packet.
+ */
+ nl_data->num_cols = tvb_get_letohs(tvb, cur);
+ if (nl_data->num_cols > MAX_COLUMNS) {
+ nl_data->num_cols = 0;
+ return FALSE;
+ }
- cur += 2;
+ cur += 2;
- for (i=0;i<nl_data->num_cols;i++) {
- nl_data->columns[i] = g_mem_chunk_alloc(tds_column);
- name_len = tvb_get_guint8(tvb,cur);
- cur ++;
- cur += name_len;
+ for (i = 0; i < nl_data->num_cols; i++) {
+ nl_data->columns[i] = g_mem_chunk_alloc(tds_column);
+ name_len = tvb_get_guint8(tvb,cur);
+ cur ++;
+ cur += name_len;
- cur ++; /* unknown */
+ cur ++; /* unknown */
- nl_data->columns[i]->utype = tvb_get_letohs(tvb, cur);
- cur += 2;
+ nl_data->columns[i]->utype = tvb_get_letohs(tvb, cur);
+ cur += 2;
- cur += 2; /* unknown */
+ cur += 2; /* unknown */
- nl_data->columns[i]->ctype = tvb_get_guint8(tvb,cur);
- cur ++;
+ nl_data->columns[i]->ctype = tvb_get_guint8(tvb,cur);
+ cur ++;
- if (!is_fixed_coltype(nl_data->columns[i]->ctype)) {
- nl_data->columns[i]->csize = tvb_get_guint8(tvb,cur);
- cur ++;
- } else {
- nl_data->columns[i]->csize = get_size_by_coltype(nl_data->columns[i]->ctype);
- }
- cur ++; /* unknown */
- }
+ if (!is_fixed_coltype(nl_data->columns[i]->ctype)) {
+ nl_data->columns[i]->csize = tvb_get_guint8(tvb,cur);
+ cur ++;
+ } else {
+ nl_data->columns[i]->csize = get_size_by_coltype(nl_data->columns[i]->ctype);
+ }
+ cur ++; /* unknown */
+ }
return TRUE;
}
/*
@@ -641,7 +645,7 @@ store_conv_data(packet_info *pinfo, struct _netlib_data *nl_data)
conv_data->num_cols = nl_data->num_cols;
memcpy(conv_data->columns, nl_data->columns, sizeof(struct _tds_col *) * MAX_COLUMNS);
conv_data->tds_bytes_left = nl_data->tds_bytes_left;
- memcpy(conv_data->tds_remainder, nl_data->tds_remainder, 4096);
+ memcpy(conv_data->tds_remainder, nl_data->tds_remainder, REM_BUF_SIZE);
conversation_add_proto_data(conv,proto_tds, conv_data);
}
@@ -669,7 +673,7 @@ store_pkt_data(packet_info *pinfo, struct _netlib_data *nl_data)
p_data->num_cols = nl_data->num_cols;
memcpy(p_data->columns, nl_data->columns, sizeof(struct _tds_col *) * MAX_COLUMNS);
p_data->tds_bytes_left = nl_data->tds_bytes_left;
- memcpy(p_data->tds_remainder, nl_data->tds_remainder, 4096);
+ memcpy(p_data->tds_remainder, nl_data->tds_remainder, REM_BUF_SIZE);
/* stash it */
p_add_proto_data( pinfo->fd, proto_tds, (void*)p_data);
@@ -696,7 +700,7 @@ load_packet_data(packet_info *pinfo, struct _packet_data *pkt_data)
pkt_data->num_cols = conv_data->num_cols;
memcpy(pkt_data->columns, conv_data->columns, sizeof(struct _tds_col *) * MAX_COLUMNS);
pkt_data->tds_bytes_left = conv_data->tds_bytes_left;
- memcpy(pkt_data->tds_remainder, conv_data->tds_remainder, 4096);
+ memcpy(pkt_data->tds_remainder, conv_data->tds_remainder, REM_BUF_SIZE);
}
/* load packet data into netlib_data */
@@ -714,7 +718,7 @@ load_netlib_data(packet_info *pinfo, struct _netlib_data *nl_data)
nl_data->num_cols = pkt_data->num_cols;
memcpy(nl_data->columns, pkt_data->columns, sizeof(struct _tds_col *) * MAX_COLUMNS);
nl_data->tds_bytes_left = pkt_data->tds_bytes_left;
- memcpy(nl_data->tds_remainder, pkt_data->tds_remainder, 4096);
+ memcpy(nl_data->tds_remainder, pkt_data->tds_remainder, REM_BUF_SIZE);
}
@@ -734,7 +738,8 @@ netlib_read_header(tvbuff_t *tvb, guint offset, struct _netlib_data *nl_data)
if (!is_valid_tds_type(nl_data->packet_type)) {
return FALSE;
}
- if (nl_data->packet_last!=0 && nl_data->packet_last!=1) {
+ /* Valid values are 0 and 1 */
+ if (nl_data->packet_last > 1) {
return FALSE;
}
if (nl_data->packet_size == 0) {
@@ -754,7 +759,7 @@ netlib_read_header(tvbuff_t *tvb, guint offset, struct _netlib_data *nl_data)
* weak heuristics of the netlib check.
*/
static gboolean
-netlib_check_login_pkt(tvbuff_t *tvb, int offset, packet_info *pinfo, struct _netlib_data *nl_data)
+netlib_check_login_pkt(tvbuff_t *tvb, guint offset, packet_info *pinfo, struct _netlib_data *nl_data)
{
guint tds_major, bytes_avail;
@@ -805,8 +810,7 @@ dissect_tds_env_chg(tvbuff_t *tvb, struct _netlib_data *nl_data _U_, guint offse
{
guint8 env_type;
guint packet_len;
-guint old_len, new_len;
-unsigned int old_len_offset;
+guint old_len, new_len, old_len_offset;
const char *new_val = NULL, *old_val = NULL;
guint32 string_offset;
guint16 bc;
@@ -868,7 +872,8 @@ proto_item *ti;
proto_item *tds_hdr;
proto_tree *tds_tree;
guint last_byte, end_of_pkt;
-guint pos, token, token_sz = 0;
+guint pos, token_sz = 0;
+guint8 token;
gint skip_count;
proto_tree *pdu_tree;
@@ -898,7 +903,7 @@ proto_tree *pdu_tree;
tds_tree = proto_item_add_subtree(tds_hdr, ett_tds);
/* is there the second half of a PDU here ? */
- if (nl_data->tds_bytes_left) {
+ if (nl_data->tds_bytes_left > 0) {
/* XXX - should be calling dissection here */
skip_count = get_skip_count(tvb, offset, nl_data, last_byte);
@@ -912,9 +917,8 @@ proto_tree *pdu_tree;
ti = proto_tree_add_text(tds_tree, tvb, offset, token_sz,
"Token 0x%02x %s (continued)", token, val_to_str(token, token_names,
"Unknown Token Type"));
- memcpy( &nl_data->tds_remainder[nl_data->tds_bytes_left],
- tvb_get_ptr(tvb, offset, token_sz),
- token_sz);
+ tvb_memcpy( tvb, &nl_data->tds_remainder[nl_data->tds_bytes_left],
+ offset, token_sz);
nl_data->tds_bytes_left += token_sz;
nl_data->netlib_unread_bytes = 0;
return;
@@ -952,8 +956,7 @@ proto_tree *pdu_tree;
*/
token_sz = last_byte - pos;
nl_data->tds_bytes_left = token_sz;
- memcpy(nl_data->tds_remainder,
- tvb_get_ptr(tvb, pos, token_sz), token_sz);
+ tvb_memcpy(tvb, nl_data->tds_remainder, pos, token_sz);
}
} else {
@@ -1033,8 +1036,8 @@ dissect_netlib(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
conversation_t *conv;
struct _netlib_data nl_data;
struct _packet_data *p_data;
- int offset = 0;
- int bytes_remaining;
+ guint offset = 0;
+ guint bytes_remaining;
p_data = p_get_proto_data(pinfo->fd, proto_tds);
@@ -1067,7 +1070,7 @@ dissect_netlib(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
* if offset is > 0 then we have undecoded data at the front of the
* packet. Call the TDS dissector on it.
*/
- if (nl_data.packet_type == TDS_RESP_PKT && offset) {
+ if (nl_data.packet_type == TDS_RESP_PKT && offset > 0) {
dissect_tds(tvb, pinfo, tree, &nl_data, 0);
}
@@ -1078,7 +1081,7 @@ dissect_netlib(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
/*
* if packet is less than 8 characters, its not a
* netlib packet
- * This is not entirely correct...fix.
+ * XXX - This is not entirely correct...fix.
*/
if (bytes_remaining < 8) {
return FALSE;
diff --git a/randpkt.c b/randpkt.c
index 0b83e8c3c4..8b486daef7 100644
--- a/randpkt.c
+++ b/randpkt.c
@@ -4,7 +4,7 @@
* Creates random packet traces. Useful for debugging sniffers by testing
* assumptions about the veracity of the data found in the packet.
*
- * $Id: randpkt.c,v 1.17 2002/10/16 14:45:27 gerald Exp $
+ * $Id: randpkt.c,v 1.18 2002/11/17 21:47:41 gerald Exp $
*
* Copyright (C) 1999 by Gilbert Ramirez <gram@alumni.rice.edu>
*
@@ -68,6 +68,7 @@ enum {
PKT_NCP2222,
PKT_GIOP,
PKT_BGP,
+ PKT_TDS,
};
typedef struct {
@@ -292,7 +293,26 @@ guint8 pkt_bgp[] = {
0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xff,
+};
+
+/* Ethernet+IP+TCP, indicating TDS NetLib */
+guint8 pkt_tds[] = {
+ 0x00, 0x50, 0x8b, 0x0d,
+ 0x7a, 0xed, 0x00, 0x08,
+ 0xa3, 0x98, 0x39, 0x81,
+ 0x08, 0x00,
+ 0x45, 0x00, 0x03, 0x8d,
+ 0x90, 0xd4, 0x40, 0x00,
+ 0x7c, 0x06, 0xc3, 0x1b,
+ 0xac, 0x14, 0x02, 0x22,
+ 0x0a, 0xc2, 0xee, 0x82,
+
+ 0x05, 0x99, 0x08, 0xf8,
+ 0xff, 0x4e, 0x85, 0x46,
+ 0xa2, 0xb4, 0x42, 0xaa,
+ 0x50, 0x18, 0x3c, 0x28,
+ 0x0f, 0xda, 0x00, 0x00,
};
/* This little data table drives the whole program */
@@ -345,6 +365,9 @@ pkt_example examples[] = {
{ "bgp", "Border Gateway Protocol",
PKT_BGP, pkt_bgp, WTAP_ENCAP_ETHERNET, array_length(pkt_bgp) },
+ { "tds", "TDS NetLib",
+ PKT_TDS, pkt_tds, WTAP_ENCAP_ETHERNET, array_length(pkt_tds) },
+
};