aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-dns.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2005-06-27 07:50:11 +0000
committerGuy Harris <guy@alum.mit.edu>2005-06-27 07:50:11 +0000
commit81466a539ed617b5898a4eaeb6d631c626fe703c (patch)
treef1d7a85a01fd88d07648dcd4ccf409bdb5484a21 /epan/dissectors/packet-dns.c
parent004f6a0baf6935c2c551aaa4f1c9721be6ad929b (diff)
The name returned by "get_dns_name()" (and thus by
"get_dns_name_type_class()") is null-terminated - and the length returned is *NOT* the length of the string, it's the length of the chunk of DNS data extracted by "get_dns_name()", and that chunk could just point to a later chunk as part of DNS compression. When running the name through "format_text()", just use "strlen()" to get the length, so you don't get a value that's too large *OR* too small (both are possible - "too large" if it's uncompressed and includes length informatioin, "too small" if it contains a pointer to a string longer than the pointer). When adding a string value to the protocol tree, add the *raw* name, not the formatted name - the Ethereal display code will format the string's value as necessary. Add formatting code for DNS names in replies. svn path=/trunk/; revision=14793
Diffstat (limited to 'epan/dissectors/packet-dns.c')
-rw-r--r--epan/dissectors/packet-dns.c124
1 files changed, 72 insertions, 52 deletions
diff --git a/epan/dissectors/packet-dns.c b/epan/dissectors/packet-dns.c
index bcb5cd755a..a8915cdf33 100644
--- a/epan/dissectors/packet-dns.c
+++ b/epan/dissectors/packet-dns.c
@@ -750,7 +750,6 @@ dissect_dns_query(tvbuff_t *tvb, int offset, int dns_data_offset,
int len;
char name[MAXDNAME];
char *name_out;
- int name_out_len;
int name_len;
int type;
int class;
@@ -768,11 +767,11 @@ dissect_dns_query(tvbuff_t *tvb, int offset, int dns_data_offset,
type_name = dns_type_name(type);
- /* the name might contain non-printable characters, format it first */
- /* the actual name to display will be smaller than the name_len */
- /* XXX - is the name guaranteed to be a valid string or might strlen() fail? */
- name_out_len = (name_len <= (int) strlen(name)) ? name_len : strlen(name);
- name_out = format_text(name, name_out_len);
+ /*
+ * The name might contain octets that aren't printable characters,
+ * format it for display.
+ */
+ name_out = format_text(name, strlen(name));
if (cinfo != NULL) {
col_append_fstr(cinfo, COL_INFO, " %s %s", type_name, name_out);
@@ -782,7 +781,7 @@ dissect_dns_query(tvbuff_t *tvb, int offset, int dns_data_offset,
name_out, type_name, dns_class_name(class));
q_tree = proto_item_add_subtree(tq, ett_dns_qd);
- proto_tree_add_string(q_tree, hf_dns_qry_name, tvb, offset, name_len, name_out);
+ proto_tree_add_string(q_tree, hf_dns_qry_name, tvb, offset, name_len, name);
offset += name_len;
proto_tree_add_uint_format(q_tree, hf_dns_qry_type, tvb, offset, 2, type,
@@ -931,6 +930,7 @@ dissect_dns_answer(tvbuff_t *tvb, int offset, int dns_data_offset,
{
int len;
char name[MAXDNAME];
+ char *name_out;
int name_len;
int type;
int class;
@@ -966,17 +966,22 @@ dissect_dns_answer(tvbuff_t *tvb, int offset, int dns_data_offset,
if (cinfo != NULL)
col_append_fstr(cinfo, COL_INFO, " %s", type_name);
if (dns_tree != NULL) {
+ /*
+ * The name might contain octets that aren't printable characters,
+ * format it for display.
+ */
+ name_out = format_text(name, strlen(name));
if (type != T_OPT) {
trr = proto_tree_add_text(dns_tree, tvb, offset,
(data_offset - data_start) + data_len,
"%s: type %s, class %s",
- name, type_name, class_name);
+ name_out, type_name, class_name);
rr_tree = add_rr_to_tree(trr, ett_dns_rr, tvb, offset, name, name_len,
type, class, ttl, data_len);
} else {
trr = proto_tree_add_text(dns_tree, tvb, offset,
(data_offset - data_start) + data_len,
- "%s: type %s", name, type_name);
+ "%s: type %s", name_out, type_name);
rr_tree = add_opt_rr_to_tree(trr, ett_dns_rr, tvb, offset, name, name_len,
type, class, ttl, data_len);
}
@@ -1013,12 +1018,13 @@ dissect_dns_answer(tvbuff_t *tvb, int offset, int dns_data_offset,
int ns_name_len;
ns_name_len = get_dns_name(tvb, cur_offset, dns_data_offset, ns_name, sizeof(ns_name));
+ name_out = format_text(ns_name, strlen(ns_name));
if (cinfo != NULL)
- col_append_fstr(cinfo, COL_INFO, " %s", ns_name);
+ col_append_fstr(cinfo, COL_INFO, " %s", name_out);
if (dns_tree != NULL) {
- proto_item_append_text(trr, ", ns %s", ns_name);
+ proto_item_append_text(trr, ", ns %s", name_out);
proto_tree_add_text(rr_tree, tvb, cur_offset, ns_name_len, "Name server: %s",
- ns_name);
+ name_out);
}
}
break;
@@ -1029,12 +1035,13 @@ dissect_dns_answer(tvbuff_t *tvb, int offset, int dns_data_offset,
int cname_len;
cname_len = get_dns_name(tvb, cur_offset, dns_data_offset, cname, sizeof(cname));
+ name_out = format_text(cname, strlen(cname));
if (cinfo != NULL)
- col_append_fstr(cinfo, COL_INFO, " %s", cname);
+ col_append_fstr(cinfo, COL_INFO, " %s", name_out);
if (dns_tree != NULL) {
- proto_item_append_text(trr, ", cname %s", cname);
+ proto_item_append_text(trr, ", cname %s", name_out);
proto_tree_add_text(rr_tree, tvb, cur_offset, cname_len, "Primary name: %s",
- cname);
+ name_out);
}
}
break;
@@ -1052,17 +1059,19 @@ dissect_dns_answer(tvbuff_t *tvb, int offset, int dns_data_offset,
guint32 minimum;
mname_len = get_dns_name(tvb, cur_offset, dns_data_offset, mname, sizeof(mname));
+ name_out = format_text(mname, strlen(mname));
if (cinfo != NULL)
- col_append_fstr(cinfo, COL_INFO, " %s", mname);
+ col_append_fstr(cinfo, COL_INFO, " %s", name_out);
if (dns_tree != NULL) {
- proto_item_append_text(trr, ", mname %s", mname);
+ proto_item_append_text(trr, ", mname %s", name_out);
proto_tree_add_text(rr_tree, tvb, cur_offset, mname_len, "Primary name server: %s",
- mname);
+ name_out);
cur_offset += mname_len;
rname_len = get_dns_name(tvb, cur_offset, dns_data_offset, rname, sizeof(rname));
+ name_out = format_text(rname, strlen(rname));
proto_tree_add_text(rr_tree, tvb, cur_offset, rname_len, "Responsible authority's mailbox: %s",
- rname);
+ name_out);
cur_offset += rname_len;
serial = tvb_get_ntohl(tvb, cur_offset);
@@ -1098,12 +1107,13 @@ dissect_dns_answer(tvbuff_t *tvb, int offset, int dns_data_offset,
int pname_len;
pname_len = get_dns_name(tvb, cur_offset, dns_data_offset, pname, sizeof(pname));
+ name_out = format_text(pname, strlen(pname));
if (cinfo != NULL)
- col_append_fstr(cinfo, COL_INFO, " %s", pname);
+ col_append_fstr(cinfo, COL_INFO, " %s", name_out);
if (dns_tree != NULL) {
- proto_item_append_text(trr, ", %s", pname);
+ proto_item_append_text(trr, ", %s", name_out);
proto_tree_add_text(rr_tree, tvb, cur_offset, pname_len, "Domain name: %s",
- pname);
+ name_out);
}
break;
}
@@ -1223,14 +1233,15 @@ dissect_dns_answer(tvbuff_t *tvb, int offset, int dns_data_offset,
preference = tvb_get_ntohs(tvb, cur_offset);
mx_name_len = get_dns_name(tvb, cur_offset + 2, dns_data_offset, mx_name, sizeof(mx_name));
+ name_out = format_text(mx_name, strlen(mx_name));
if (cinfo != NULL)
- col_append_fstr(cinfo, COL_INFO, " %u %s", preference, mx_name);
+ col_append_fstr(cinfo, COL_INFO, " %u %s", preference, name_out);
if (dns_tree != NULL) {
proto_item_append_text(trr, ", preference %u, mx %s",
- preference, mx_name);
+ preference, name_out);
proto_tree_add_text(rr_tree, tvb, cur_offset, 2, "Preference: %u", preference);
proto_tree_add_text(rr_tree, tvb, cur_offset + 2, mx_name_len, "Mail exchange: %s",
- mx_name);
+ name_out);
}
}
break;
@@ -1321,7 +1332,8 @@ dissect_dns_answer(tvbuff_t *tvb, int offset, int dns_data_offset,
signer_name_len = get_dns_name(tvb, cur_offset, dns_data_offset, signer_name, sizeof(signer_name));
proto_tree_add_text(rr_tree, tvb, cur_offset, signer_name_len,
- "Signer's name: %s", signer_name);
+ "Signer's name: %s",
+ format_text(signer_name, strlen(signer_name)));
cur_offset += signer_name_len;
rr_len -= signer_name_len;
@@ -1470,7 +1482,8 @@ dissect_dns_answer(tvbuff_t *tvb, int offset, int dns_data_offset,
break;
case 3:
gw_name_len = get_dns_name(tvb, cur_offset, dns_data_offset, gw, sizeof(gw));
- proto_tree_add_text(rr_tree, tvb, cur_offset, gw_name_len, "Gateway: %s", gw);
+ proto_tree_add_text(rr_tree, tvb, cur_offset, gw_name_len,
+ "Gateway: %s", format_text(gw, strlen(gw)));
cur_offset += gw_name_len;
rr_len -= gw_name_len;
@@ -1540,12 +1553,13 @@ dissect_dns_answer(tvbuff_t *tvb, int offset, int dns_data_offset,
strcpy(pname, "");
pname_len = 0;
}
+ name_out = format_text(pname, strlen(pname));
if (cinfo != NULL) {
col_append_fstr(cinfo, COL_INFO, " %d %s %s",
pre_len,
ip6_to_str(&suffix),
- pname);
+ name_out);
}
if (dns_tree != NULL) {
proto_tree_add_text(rr_tree, tvb, a6_offset, 1,
@@ -1559,12 +1573,12 @@ dissect_dns_answer(tvbuff_t *tvb, int offset, int dns_data_offset,
}
if (pre_len > 0) {
proto_tree_add_text(rr_tree, tvb, a6_offset, pname_len,
- "Prefix name: %s", pname);
+ "Prefix name: %s", name_out);
}
proto_item_append_text(trr, ", addr %d %s %s",
pre_len,
ip6_to_str(&suffix),
- pname);
+ name_out);
}
}
break;
@@ -1576,12 +1590,13 @@ dissect_dns_answer(tvbuff_t *tvb, int offset, int dns_data_offset,
dname_len = get_dns_name(tvb, cur_offset, dns_data_offset,
dname, sizeof(dname));
+ name_out = format_text(dname, strlen(dname));
if (cinfo != NULL)
- col_append_fstr(cinfo, COL_INFO, " %s", dname);
+ col_append_fstr(cinfo, COL_INFO, " %s", name_out);
if (dns_tree != NULL) {
- proto_item_append_text(trr, ", dname %s", dname);
+ proto_item_append_text(trr, ", dname %s", name_out);
proto_tree_add_text(rr_tree, tvb, cur_offset,
- dname_len, "Target name: %s", dname);
+ dname_len, "Target name: %s", name_out);
}
}
break;
@@ -1637,13 +1652,13 @@ dissect_dns_answer(tvbuff_t *tvb, int offset, int dns_data_offset,
next_domain_name_len = get_dns_name(tvb, cur_offset, dns_data_offset,
next_domain_name, sizeof(next_domain_name));
+ name_out = format_text(next_domain_name, strlen(next_domain_name));
if (cinfo != NULL)
- col_append_fstr(cinfo, COL_INFO, " %s", next_domain_name);
+ col_append_fstr(cinfo, COL_INFO, " %s", name_out);
if (dns_tree != NULL) {
- proto_item_append_text(trr, ", next domain name %s",
- next_domain_name);
+ proto_item_append_text(trr, ", next domain name %s", name_out);
proto_tree_add_text(rr_tree, tvb, cur_offset, next_domain_name_len,
- "Next domain name: %s", next_domain_name);
+ "Next domain name: %s", name_out);
cur_offset += next_domain_name_len;
rr_len -= next_domain_name_len;
rr_type = 0;
@@ -1685,13 +1700,13 @@ dissect_dns_answer(tvbuff_t *tvb, int offset, int dns_data_offset,
next_domain_name_len = get_dns_name(tvb, cur_offset, dns_data_offset,
next_domain_name, sizeof(next_domain_name));
+ name_out = format_text(next_domain_name, strlen(next_domain_name));
if (cinfo != NULL)
- col_append_fstr(cinfo, COL_INFO, " %s", next_domain_name);
+ col_append_fstr(cinfo, COL_INFO, " %s", name_out);
if (dns_tree != NULL) {
- proto_item_append_text(trr, ", next domain name %s",
- next_domain_name);
+ proto_item_append_text(trr, ", next domain name %s", name_out);
proto_tree_add_text(rr_tree, tvb, cur_offset, next_domain_name_len,
- "Next domain name: %s", next_domain_name);
+ "Next domain name: %s", name_out);
cur_offset += next_domain_name_len;
rr_len -= next_domain_name_len;
rr_type = 0;
@@ -1722,14 +1737,15 @@ dissect_dns_answer(tvbuff_t *tvb, int offset, int dns_data_offset,
preference = tvb_get_ntohs(tvb, cur_offset);
kx_name_len = get_dns_name(tvb, cur_offset + 2, dns_data_offset, kx_name, sizeof(kx_name));
+ name_out = format_text(kx_name, strlen(kx_name));
if (cinfo != NULL)
- col_append_fstr(cinfo, COL_INFO, " %u %s", preference, kx_name);
+ col_append_fstr(cinfo, COL_INFO, " %u %s", preference, name_out);
if (dns_tree != NULL) {
proto_item_append_text(trr, ", preference %u, kx %s",
- preference, kx_name);
+ preference, name_out);
proto_tree_add_text(rr_tree, tvb, cur_offset, 2, "Preference: %u", preference);
proto_tree_add_text(rr_tree, tvb, cur_offset + 2, kx_name_len, "Key exchange: %s",
- kx_name);
+ name_out);
}
}
break;
@@ -1844,7 +1860,8 @@ dissect_dns_answer(tvbuff_t *tvb, int offset, int dns_data_offset,
tkey_algname_len = get_dns_name(tvb, cur_offset, dns_data_offset, tkey_algname, sizeof(tkey_algname));
proto_tree_add_text(rr_tree, tvb, cur_offset, tkey_algname_len,
- "Algorithm name: %s", tkey_algname);
+ "Algorithm name: %s",
+ format_text(tkey_algname, strlen(tkey_algname)));
cur_offset += tkey_algname_len;
rr_len -= tkey_algname_len;
@@ -1969,7 +1986,8 @@ dissect_dns_answer(tvbuff_t *tvb, int offset, int dns_data_offset,
if (dns_tree != NULL) {
tsig_algname_len = get_dns_name(tvb, cur_offset, dns_data_offset, tsig_algname, sizeof(tsig_algname));
proto_tree_add_text(rr_tree, tvb, cur_offset, tsig_algname_len,
- "Algorithm name: %s", tsig_algname);
+ "Algorithm name: %s",
+ format_text(tsig_algname, strlen(tsig_algname)));
cur_offset += tsig_algname_len;
rr_len -= tsig_algname_len;
@@ -2146,12 +2164,13 @@ dissect_dns_answer(tvbuff_t *tvb, int offset, int dns_data_offset,
rr_len -= 4;
dname_len = get_dns_name(tvb, cur_offset, dns_data_offset, dname, sizeof(dname));
+ name_out = format_text(dname, strlen(dname));
if (cinfo != NULL)
- col_append_fstr(cinfo, COL_INFO, " %s", dname);
+ col_append_fstr(cinfo, COL_INFO, " %s", name_out);
if (dns_tree != NULL) {
- proto_item_append_text(trr, ", name result domain %s", dname);
+ proto_item_append_text(trr, ", name result domain %s", name_out);
proto_tree_add_text(rr_tree, tvb, cur_offset, dname_len, "Name result domain: %s",
- dname);
+ name_out);
}
}
break;
@@ -2169,17 +2188,18 @@ dissect_dns_answer(tvbuff_t *tvb, int offset, int dns_data_offset,
port = tvb_get_ntohs(tvb, cur_offset+4);
target_len = get_dns_name(tvb, cur_offset + 6, dns_data_offset, target, sizeof(target));
+ name_out = format_text(target, strlen(target));
if (cinfo != NULL)
- col_append_fstr(cinfo, COL_INFO, " %u %u %u %s", priority, weight, port, target);
+ col_append_fstr(cinfo, COL_INFO, " %u %u %u %s", priority, weight, port, name_out);
if (dns_tree != NULL) {
proto_item_append_text(trr,
", priority %u, weight %u, port %u, target %s",
- priority, weight, port, target);
+ priority, weight, port, name_out);
proto_tree_add_text(rr_tree, tvb, cur_offset, 2, "Priority: %u", priority);
proto_tree_add_text(rr_tree, tvb, cur_offset + 2, 2, "Weight: %u", weight);
proto_tree_add_text(rr_tree, tvb, cur_offset + 4, 2, "Port: %u", port);
proto_tree_add_text(rr_tree, tvb, cur_offset + 6, target_len, "Target: %s",
- target);
+ name_out);
}
}
break;