diff options
author | Erika Szelleova <szelleerika@gmail.com> | 2018-06-18 19:23:32 +0200 |
---|---|---|
committer | Anders Broman <a.broman58@gmail.com> | 2018-06-19 08:40:45 +0000 |
commit | 31c1cd95cfce27a12f364eb3de78efd2b0c6d1b8 (patch) | |
tree | 386539bf41ba873de1924232de5d7493cf82dbcf /epan | |
parent | bf829007b4235be1b5144c40c8f7189064f4d44a (diff) |
DNS: changed maximum length of dns names from 1025 to 255
According to RFC1035 there are limitations on the maximum length of DNS
names. The maximum length in the code was defined as 1025, this commit
changes it to 255. Also a new macro is introduced which holds the
minimum length of a DNS name.
Bug: 14041
Change-Id: Ic63b332b2a357e33728df183c05ab0e222faf13f
Reviewed-on: https://code.wireshark.org/review/28309
Petri-Dish: Alexis La Goutte <alexis.lagoutte@gmail.com>
Tested-by: Petri Dish Buildbot
Reviewed-by: Dario Lombardo <lomato@gmail.com>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan')
-rw-r--r-- | epan/dissectors/packet-dns.c | 11 | ||||
-rw-r--r-- | epan/dissectors/packet-dns.h | 2 | ||||
-rw-r--r-- | epan/dissectors/packet-nbt.c | 2 |
3 files changed, 8 insertions, 7 deletions
diff --git a/epan/dissectors/packet-dns.c b/epan/dissectors/packet-dns.c index efc2fd199b..1bdd91734a 100644 --- a/epan/dissectors/packet-dns.c +++ b/epan/dissectors/packet-dns.c @@ -617,6 +617,8 @@ typedef struct _dns_conv_info_t { #define O_PADDING 12 /* EDNS(0) Padding Option (RFC7830) */ #define O_CHAIN 13 /* draft-ietf-dnsop-edns-chain-query */ +#define MIN_DNAME_LEN 2 /* minimum domain name length */ + static const true_false_string tfs_flags_response = { "Message is a response", "Message is a query" @@ -1165,7 +1167,7 @@ expand_dns_name(tvbuff_t *tvb, int offset, int max_len, int dns_data_offset, * than the minimum length, we're looking at bad data and we're liable * to put the dissector into a loop. Instead we throw an exception */ - maxname=MAXDNAME; + maxname = MAX_DNAME_LEN; np=(guchar *)wmem_alloc(wmem_packet_scope(), maxname); *name=np; (*name_len) = 0; @@ -1295,7 +1297,7 @@ expand_dns_name(tvbuff_t *tvb, int offset, int max_len, int dns_data_offset, * If we find a pointer to itself, it is a trivial loop. Otherwise if we * processed a large number of pointers, assume an indirect loop. */ - if (indir_offset == offset + 2 || pointers_count > MAXDNAME/4) { + if (indir_offset == offset + 2 || pointers_count > MAX_DNAME_LEN) { *name="<Name contains a pointer that loops>"; *name_len = (guint)strlen(*name); if (len < min_len) { @@ -1326,18 +1328,17 @@ get_dns_name(tvbuff_t *tvb, int offset, int max_len, int dns_data_offset, const guchar **name, guint* name_len) { int len; - const int min_len = 2; len = expand_dns_name(tvb, offset, max_len, dns_data_offset, name, name_len); /* Zero-length name means "root server" */ - if (**name == '\0' && len <= min_len) { + if (**name == '\0' && len <= MIN_DNAME_LEN) { *name="<Root>"; *name_len = (guint)strlen(*name); return len; } - if ((len < min_len) || (len > min_len && *name_len == 0)) { + if ((len < MIN_DNAME_LEN) || (len > MIN_DNAME_LEN && *name_len == 0)) { THROW(ReportedBoundsError); } diff --git a/epan/dissectors/packet-dns.h b/epan/dissectors/packet-dns.h index bb05273928..e0ea8c0897 100644 --- a/epan/dissectors/packet-dns.h +++ b/epan/dissectors/packet-dns.h @@ -18,6 +18,6 @@ extern const value_string dns_classes[]; /* Just like expand_dns_name, but pretty-prints empty names. */ int get_dns_name(tvbuff_t *, int, int, int, const guchar **, guint*); -#define MAXDNAME 1025 /* maximum domain name length */ +#define MAX_DNAME_LEN 255 /* maximum domain name length */ #endif /* packet-dns.h */ diff --git a/epan/dissectors/packet-nbt.c b/epan/dissectors/packet-nbt.c index a45b9a7041..749b76b1b9 100644 --- a/epan/dissectors/packet-nbt.c +++ b/epan/dissectors/packet-nbt.c @@ -454,7 +454,7 @@ add_name_and_type(proto_tree *tree, tvbuff_t *tvb, int offset, int len, } } -#define MAX_NAME_LEN (NETBIOS_NAME_LEN - 1)*4 + MAXDNAME + 64 +#define MAX_NAME_LEN (NETBIOS_NAME_LEN - 1)*4 + MAX_DNAME_LEN + 64 static int dissect_nbns_query(tvbuff_t *tvb, int offset, int nbns_data_offset, |