aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors
diff options
context:
space:
mode:
authorstig <stig@f5534014-38df-0310-8fa8-9805f1628bb7>2008-08-11 12:00:27 +0000
committerstig <stig@f5534014-38df-0310-8fa8-9805f1628bb7>2008-08-11 12:00:27 +0000
commit8e7ca707e1a6fe32c3918913179f49651830be0a (patch)
tree8aeb30bb548c6581ca72dde00ef0da3d89af551a /epan/dissectors
parent22db18c8844f4804108343583912aa3cace18bb5 (diff)
From Roy Marples (bug 2781 and bug 2796):
Display FQDN binary encoded name as text Ensure that get_dns_name does not cross packet sub boundry From me: Preserve the usage of bootp.fqdn.name as a display filter git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@25981 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'epan/dissectors')
-rw-r--r--epan/dissectors/packet-bootp.c16
-rw-r--r--epan/dissectors/packet-dns.c61
-rw-r--r--epan/dissectors/packet-dns.h2
-rw-r--r--epan/dissectors/packet-icmpv6.c6
-rw-r--r--epan/dissectors/packet-nbns.c3
5 files changed, 55 insertions, 33 deletions
diff --git a/epan/dissectors/packet-bootp.c b/epan/dissectors/packet-bootp.c
index 9a9cfc1269..60135e7555 100644
--- a/epan/dissectors/packet-bootp.c
+++ b/epan/dissectors/packet-bootp.c
@@ -674,6 +674,7 @@ bootp_option(tvbuff_t *tvb, proto_tree *bp_tree, int voff, int eoff,
gboolean skip_opaque = FALSE;
guint8 s_option;
int ava_vid;
+ const gchar *dns_name;
static const value_string slpda_vals[] = {
@@ -1167,10 +1168,9 @@ bootp_option(tvbuff_t *tvb, proto_tree *bp_tree, int voff, int eoff,
proto_tree_add_item(v_tree, hf_bootp_fqdn_rcode2, tvb, optoff+2, 1, FALSE);
if (optlen > 3) {
if (fqdn_flags & F_FQDN_E) {
- /* XXX: use code from packet-dns for binary encoded name */
- proto_tree_add_item(v_tree, hf_bootp_fqdn_name,
- tvb, optoff+3, optlen-3, FALSE);
-
+ get_dns_name(tvb, optoff+3, optlen-3, optoff+3, &dns_name);
+ proto_tree_add_string(v_tree, hf_bootp_fqdn_name,
+ tvb, optoff+3, optlen-3, dns_name);
} else {
proto_tree_add_item(v_tree, hf_bootp_fqdn_asciiname,
tvb, optoff+3, optlen-3, FALSE);
@@ -3149,8 +3149,7 @@ dissect_packetcable_ietf_ccc(proto_tree *v_tree, tvbuff_t *tvb, int optoff,
suboptoff += 1;
switch (prov_type) {
case 0:
- /* XXX - check suboption length */
- get_dns_name(tvb, suboptoff, suboptoff, &dns_name);
+ get_dns_name(tvb, suboptoff, subopt_len, suboptoff, &dns_name);
proto_item_append_text(vti, "%s (%u byte%s)", dns_name,
subopt_len - 1, plurality(subopt_len, "", "s") );
break;
@@ -3221,8 +3220,7 @@ dissect_packetcable_ietf_ccc(proto_tree *v_tree, tvbuff_t *tvb, int optoff,
break;
case PKT_CCC_KRB_REALM: /* String values */
- /* XXX - check suboption length */
- get_dns_name(tvb, suboptoff, suboptoff, &dns_name);
+ get_dns_name(tvb, suboptoff, subopt_len, suboptoff, &dns_name);
proto_item_append_text(vti, "%s (%u byte%s)", dns_name,
subopt_len, plurality(subopt_len, "", "s") );
suboptoff += subopt_len;
@@ -3693,7 +3691,7 @@ proto_register_bootp(void)
"Result code of PTR-RR update", HFILL }},
{ &hf_bootp_fqdn_name,
- { "Client name", "bootp.fqdn.name", FT_BYTES,
+ { "Client name", "bootp.fqdn.name", FT_STRING,
BASE_NONE, NULL, 0x0,
"Name to register via DDNS", HFILL }},
diff --git a/epan/dissectors/packet-dns.c b/epan/dissectors/packet-dns.c
index 8be77e83f5..9f20798a20 100644
--- a/epan/dissectors/packet-dns.c
+++ b/epan/dissectors/packet-dns.c
@@ -545,7 +545,7 @@ dns_class_name(int class)
* it will be automatically free()d when the packet has been dissected.
*/
int
-get_dns_name(tvbuff_t *tvb, int offset, int dns_data_offset,
+get_dns_name(tvbuff_t *tvb, int offset, int max_len, int dns_data_offset,
const char **name)
{
int start_offset = offset;
@@ -568,6 +568,8 @@ get_dns_name(tvbuff_t *tvb, int offset, int dns_data_offset,
maxname--; /* reserve space for the trailing '\0' */
for (;;) {
+ if (max_len && offset - start_offset > max_len - 1)
+ break;
component_len = tvb_get_guint8(tvb, offset);
offset++;
if (component_len == 0)
@@ -585,6 +587,8 @@ get_dns_name(tvbuff_t *tvb, int offset, int dns_data_offset,
}
}
while (component_len > 0) {
+ if (max_len && offset - start_offset > max_len - 1)
+ THROW(ReportedBoundsError);
if (maxname > 0) {
*np++ = tvb_get_guint8(tvb, offset);
maxname--;
@@ -722,7 +726,8 @@ get_dns_name_type_class(tvbuff_t *tvb, int offset, int dns_data_offset,
int class;
int start_offset = offset;
- name_len = get_dns_name(tvb, offset, dns_data_offset, name_ret);
+ /* XXX Fix data length */
+ name_len = get_dns_name(tvb, offset, 0, dns_data_offset, name_ret);
offset += name_len;
type = tvb_get_ntohs(tvb, offset);
@@ -1100,7 +1105,8 @@ dissect_dns_answer(tvbuff_t *tvb, int offsetx, int dns_data_offset,
const char *ns_name;
int ns_name_len;
- ns_name_len = get_dns_name(tvb, cur_offset, dns_data_offset, &ns_name);
+ /* XXX Fix data length */
+ ns_name_len = get_dns_name(tvb, cur_offset, 0, dns_data_offset, &ns_name);
name_out = format_text(ns_name, strlen(ns_name));
if (cinfo != NULL)
col_append_fstr(cinfo, COL_INFO, " %s", name_out);
@@ -1117,7 +1123,8 @@ dissect_dns_answer(tvbuff_t *tvb, int offsetx, int dns_data_offset,
const char *cname;
int cname_len;
- cname_len = get_dns_name(tvb, cur_offset, dns_data_offset, &cname);
+ /* XXX Fix data length */
+ cname_len = get_dns_name(tvb, cur_offset, 0, dns_data_offset, &cname);
name_out = format_text(cname, strlen(cname));
if (cinfo != NULL)
col_append_fstr(cinfo, COL_INFO, " %s", name_out);
@@ -1141,7 +1148,8 @@ dissect_dns_answer(tvbuff_t *tvb, int offsetx, int dns_data_offset,
guint32 expire;
guint32 minimum;
- mname_len = get_dns_name(tvb, cur_offset, dns_data_offset, &mname);
+ /* XXX Fix data length */
+ mname_len = get_dns_name(tvb, cur_offset, 0, dns_data_offset, &mname);
name_out = format_text(mname, strlen(mname));
if (cinfo != NULL)
col_append_fstr(cinfo, COL_INFO, " %s", name_out);
@@ -1151,7 +1159,8 @@ dissect_dns_answer(tvbuff_t *tvb, int offsetx, int dns_data_offset,
name_out);
cur_offset += mname_len;
- rname_len = get_dns_name(tvb, cur_offset, dns_data_offset, &rname);
+ /* XXX Fix data length */
+ rname_len = get_dns_name(tvb, cur_offset, 0, dns_data_offset, &rname);
name_out = format_text(rname, strlen(rname));
proto_tree_add_text(rr_tree, tvb, cur_offset, rname_len, "Responsible authority's mailbox: %s",
name_out);
@@ -1189,7 +1198,8 @@ dissect_dns_answer(tvbuff_t *tvb, int offsetx, int dns_data_offset,
const char *pname;
int pname_len;
- pname_len = get_dns_name(tvb, cur_offset, dns_data_offset, &pname);
+ /* XXX Fix data length */
+ pname_len = get_dns_name(tvb, cur_offset, 0, dns_data_offset, &pname);
name_out = format_text(pname, strlen(pname));
if (cinfo != NULL)
col_append_fstr(cinfo, COL_INFO, " %s", name_out);
@@ -1320,7 +1330,8 @@ dissect_dns_answer(tvbuff_t *tvb, int offsetx, int dns_data_offset,
int mx_name_len;
preference = tvb_get_ntohs(tvb, cur_offset);
- mx_name_len = get_dns_name(tvb, cur_offset + 2, dns_data_offset, &mx_name);
+ /* XXX Fix data length */
+ mx_name_len = get_dns_name(tvb, cur_offset + 2, 0, dns_data_offset, &mx_name);
name_out = format_text(mx_name, strlen(mx_name));
if (cinfo != NULL)
col_append_fstr(cinfo, COL_INFO, " %u %s", preference, name_out);
@@ -1418,7 +1429,8 @@ dissect_dns_answer(tvbuff_t *tvb, int offsetx, int dns_data_offset,
cur_offset += 2;
rr_len -= 2;
- signer_name_len = get_dns_name(tvb, cur_offset, dns_data_offset, &signer_name);
+ /* XXX Fix data length */
+ signer_name_len = get_dns_name(tvb, cur_offset, 0, dns_data_offset, &signer_name);
proto_tree_add_text(rr_tree, tvb, cur_offset, signer_name_len,
"Signer's name: %s",
format_text(signer_name, strlen(signer_name)));
@@ -1569,7 +1581,8 @@ dissect_dns_answer(tvbuff_t *tvb, int offsetx, int dns_data_offset,
rr_len -= 16;
break;
case 3:
- gw_name_len = get_dns_name(tvb, cur_offset, dns_data_offset, &gw);
+ /* XXX Fix data length */
+ gw_name_len = get_dns_name(tvb, cur_offset, 0, dns_data_offset, &gw);
proto_tree_add_text(rr_tree, tvb, cur_offset, gw_name_len,
"Gateway: %s", format_text(gw, strlen(gw)));
@@ -1635,7 +1648,8 @@ dissect_dns_answer(tvbuff_t *tvb, int offsetx, int dns_data_offset,
}
if (pre_len > 0) {
- pname_len = get_dns_name(tvb, cur_offset, dns_data_offset,
+ /* XXX Fix data length */
+ pname_len = get_dns_name(tvb, cur_offset, 0, dns_data_offset,
&pname);
} else {
pname="";
@@ -1676,7 +1690,8 @@ dissect_dns_answer(tvbuff_t *tvb, int offsetx, int dns_data_offset,
const char *dname;
int dname_len;
- dname_len = get_dns_name(tvb, cur_offset, dns_data_offset,
+ /* XXX Fix data length */
+ dname_len = get_dns_name(tvb, cur_offset, 0, dns_data_offset,
&dname);
name_out = format_text(dname, strlen(dname));
if (cinfo != NULL)
@@ -1738,7 +1753,8 @@ dissect_dns_answer(tvbuff_t *tvb, int offsetx, int dns_data_offset,
int mask, blockbase, blocksize;
int i;
- next_domain_name_len = get_dns_name(tvb, cur_offset, dns_data_offset,
+ /* XXX Fix data length */
+ next_domain_name_len = get_dns_name(tvb, cur_offset, 0, dns_data_offset,
&next_domain_name);
name_out = format_text(next_domain_name, strlen(next_domain_name));
if (cinfo != NULL)
@@ -1786,7 +1802,8 @@ dissect_dns_answer(tvbuff_t *tvb, int offsetx, int dns_data_offset,
int mask;
int i;
- next_domain_name_len = get_dns_name(tvb, cur_offset, dns_data_offset,
+ /* XXX Fix data length */
+ next_domain_name_len = get_dns_name(tvb, cur_offset, 0, dns_data_offset,
&next_domain_name);
name_out = format_text(next_domain_name, strlen(next_domain_name));
if (cinfo != NULL)
@@ -1823,8 +1840,8 @@ dissect_dns_answer(tvbuff_t *tvb, int offsetx, int dns_data_offset,
const char *kx_name;
int kx_name_len;
- preference = tvb_get_ntohs(tvb, cur_offset);
- kx_name_len = get_dns_name(tvb, cur_offset + 2, dns_data_offset, &kx_name);
+ /* XXX Fix data length */
+ kx_name_len = get_dns_name(tvb, cur_offset + 2, 0, dns_data_offset, &kx_name);
name_out = format_text(kx_name, strlen(kx_name));
if (cinfo != NULL)
col_append_fstr(cinfo, COL_INFO, " %u %s", preference, name_out);
@@ -1946,7 +1963,8 @@ dissect_dns_answer(tvbuff_t *tvb, int offsetx, int dns_data_offset,
proto_tree *key_tree;
proto_item *key_item;
- tkey_algname_len = get_dns_name(tvb, cur_offset, dns_data_offset, &tkey_algname);
+ /* XXX Fix data length */
+ tkey_algname_len = get_dns_name(tvb, cur_offset, 0, dns_data_offset, &tkey_algname);
proto_tree_add_text(rr_tree, tvb, cur_offset, tkey_algname_len,
"Algorithm name: %s",
format_text(tkey_algname, strlen(tkey_algname)));
@@ -2072,7 +2090,8 @@ dissect_dns_answer(tvbuff_t *tvb, int offsetx, int dns_data_offset,
int rr_len = data_len;
if (dns_tree != NULL) {
- tsig_algname_len = get_dns_name(tvb, cur_offset, dns_data_offset, &tsig_raw_algname);
+ /* XXX Fix data length */
+ tsig_algname_len = get_dns_name(tvb, cur_offset, 0, dns_data_offset, &tsig_raw_algname);
tsig_algname=format_text(tsig_raw_algname, strlen(tsig_raw_algname));
proto_tree_add_string(rr_tree, hf_dns_tsig_algorithm_name, tvb, cur_offset, tsig_algname_len, tsig_algname);
cur_offset += tsig_algname_len;
@@ -2260,7 +2279,8 @@ dissect_dns_answer(tvbuff_t *tvb, int offsetx, int dns_data_offset,
cur_offset += 4;
rr_len -= 4;
- dname_len = get_dns_name(tvb, cur_offset, dns_data_offset, &dname);
+ /* XXX Fix data length */
+ dname_len = get_dns_name(tvb, cur_offset, 0, dns_data_offset, &dname);
name_out = format_text(dname, strlen(dname));
if (cinfo != NULL)
col_append_fstr(cinfo, COL_INFO, " %s", name_out);
@@ -2284,7 +2304,8 @@ dissect_dns_answer(tvbuff_t *tvb, int offsetx, int dns_data_offset,
weight = tvb_get_ntohs(tvb, cur_offset+2);
port = tvb_get_ntohs(tvb, cur_offset+4);
- target_len = get_dns_name(tvb, cur_offset + 6, dns_data_offset, &target);
+ /* XXX Fix data length */
+ target_len = get_dns_name(tvb, cur_offset + 6, 0, dns_data_offset, &target);
name_out = format_text(target, strlen(target));
if (cinfo != NULL)
col_append_fstr(cinfo, COL_INFO, " %u %u %u %s", priority, weight, port, name_out);
diff --git a/epan/dissectors/packet-dns.h b/epan/dissectors/packet-dns.h
index b97ef4a954..5a23199ba5 100644
--- a/epan/dissectors/packet-dns.h
+++ b/epan/dissectors/packet-dns.h
@@ -29,7 +29,7 @@
const char *dns_class_name(int class);
-int get_dns_name(tvbuff_t *, int, int, const char **);
+int get_dns_name(tvbuff_t *, int, int, int, const char **);
#define MAXDNAME 1025 /* maximum domain name length */
diff --git a/epan/dissectors/packet-icmpv6.c b/epan/dissectors/packet-icmpv6.c
index e67c3dbd98..576f16b366 100644
--- a/epan/dissectors/packet-icmpv6.c
+++ b/epan/dissectors/packet-icmpv6.c
@@ -1046,7 +1046,8 @@ dissect_nodeinfo(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree
off = tvb_length_remaining(tvb, offset);
break;
case ICMP6_NI_SUBJ_FQDN:
- l = get_dns_name(tvb, offset + sizeof(*ni),
+ /* XXX Fix data length */
+ l = get_dns_name(tvb, offset + sizeof(*ni), 0,
offset + sizeof(*ni), &dname);
if (tvb_bytes_exist(tvb, offset + sizeof(*ni) + l, 1) &&
tvb_get_guint8(tvb, offset + sizeof(*ni) + l) == 0) {
@@ -1125,7 +1126,8 @@ dissect_nodeinfo(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree
field_tree = proto_item_add_subtree(tf, ett_nodeinfo_nodedns);
j = offset + sizeof (*ni) + sizeof(guint32);
while (j < tvb_reported_length(tvb)) {
- l = get_dns_name(tvb, j,
+ /* XXX Fix data length */
+ l = get_dns_name(tvb, j, 0,
offset + sizeof (*ni) + sizeof(guint32),
&dname);
if (tvb_bytes_exist(tvb, j + l, 1) &&
diff --git a/epan/dissectors/packet-nbns.c b/epan/dissectors/packet-nbns.c
index aabeb6a515..d5cf3ed5de 100644
--- a/epan/dissectors/packet-nbns.c
+++ b/epan/dissectors/packet-nbns.c
@@ -287,7 +287,8 @@ get_nbns_name(tvbuff_t *tvb, int offset, int nbns_data_offset,
nbname_buf=ep_alloc(NBNAME_BUF_LEN);
nbname = nbname_buf;
- name_len = get_dns_name(tvb, offset, nbns_data_offset, &name);
+ /* XXX Fix data len */
+ name_len = get_dns_name(tvb, offset, 0, nbns_data_offset, &name);
/* OK, now undo the first-level encoding. */
pname = &name[0];