chiark / gitweb /
regress: Move case-*.in opening to shlib playback_prepare
[adns.git] / src / parse.c
index 07d0614afcbf6d002849e99c1940bbda64a3cd06..2eb68e4b7c794b9656a8030b7a8636ff78e3e3ea 100644 (file)
@@ -4,7 +4,7 @@
  */
 /*
  *  This file is part of adns, which is
- *    Copyright (C) 1997-2000,2003,2006,2014-2016  Ian Jackson
+ *    Copyright (C) 1997-2000,2003,2006,2014-2016,2020  Ian Jackson
  *    Copyright (C) 2014  Mark Wooding
  *    Copyright (C) 1999-2000,2003,2006  Tony Finch
  *    Copyright (C) 1991 Massachusetts Institute of Technology
@@ -71,6 +71,7 @@ adns_status adns__findlabel_next(findlabel_state *fls,
                                 int *lablen_r, int *labstart_r) {
   int lablen, jumpto;
   const char *dgram;
+  int had_pointer= 0;
 
   dgram= fls->dgram;
   for (;;) {
@@ -81,6 +82,7 @@ adns_status adns__findlabel_next(findlabel_state *fls,
     if ((lablen & 0x0c0) != 0x0c0) return adns_s_unknownformat;
     if (fls->cbyte >= fls->dglen) goto x_truncated;
     if (fls->cbyte >= fls->max) goto x_badresponse;
+    if (had_pointer++ >= 2) goto x_loop;
     GET_B(fls->cbyte,jumpto);
     jumpto |= (lablen&0x3f)<<8;
     if (fls->dmend_r) *(fls->dmend_r)= fls->cbyte;
@@ -107,7 +109,12 @@ adns_status adns__findlabel_next(findlabel_state *fls,
 
  x_badresponse: 
   adns__diag(fls->ads,fls->serv,fls->qu,
-            "label in domain runs beyond end of domain");
+            "label in domain runs or points outside of packet");
+  return adns_s_invalidresponse;
+
+ x_loop: 
+  adns__diag(fls->ads,fls->serv,fls->qu,
+            "compressed label pointer chain");
   return adns_s_invalidresponse;
 }