dns: check if name is root before any other check.
authorDario Lombardo <lomato@gmail.com>
Sat, 31 Mar 2018 20:25:08 +0000 (22:25 +0200)
committerAnders Broman <a.broman58@gmail.com>
Wed, 4 Apr 2018 10:04:23 +0000 (10:04 +0000)
Bug: 14574
Change-Id: Ibacb6955c227a21ab813c48aad463a666fe45c40
Reviewed-on: https://code.wireshark.org/review/26695
Petri-Dish: Dario Lombardo <lomato@gmail.com>
Tested-by: Petri Dish Buildbot
Reviewed-by: Uli Heilmeier <openid@heilmeier.eu>
Reviewed-by: Anders Broman <a.broman58@gmail.com>
epan/dissectors/packet-dns.c

index a4f2ef4c3649ba1edde14360b7b1bee0a1acd0fe..e2d869d7524fe11bf8f82748ebde40dfcdeee161 100644 (file)
@@ -1315,9 +1315,7 @@ expand_dns_name(tvbuff_t *tvb, int offset, int max_len, int dns_data_offset,
   if (len < 0) {
     len = offset - start_offset;
   }
-  if ((len < min_len) || (len > min_len && *name_len == 0)) {
-    THROW(ReportedBoundsError);
-  }
+
   return len;
 }
 
@@ -1328,13 +1326,19 @@ 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 == 1) {
+  if (**name == '\0' && len <= min_len) {
     *name="<Root>";
     *name_len = (guint)strlen(*name);
+    return len;
+  }
+
+  if ((len < min_len) || (len > min_len && *name_len == 0)) {
+    THROW(ReportedBoundsError);
   }
 
   return len;