]> git.ipfire.org Git - thirdparty/squid.git/commitdiff
Bug #1404: CNAME adresses remembered with wrong TTL
authorserassio <>
Sun, 23 Oct 2005 20:10:45 +0000 (20:10 +0000)
committerserassio <>
Sun, 23 Oct 2005 20:10:45 +0000 (20:10 +0000)
should use the lowest TTL of the CNAME and A records, but was using only
the TTL of the A records.

Added too some forgotten things fron Bug #1222.

Forward port of 2.5 patches.

include/rfc1035.h
src/fqdncache.cc
src/ipcache.cc

index f4852856ebf71358bd7d1dfdfa82a2387156d730..6f21a288ec9e12ad9cb1b1d745c38c1ca94eeef9 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $Id: rfc1035.h,v 1.15 2005/05/10 10:39:56 hno Exp $
+ * $Id: rfc1035.h,v 1.16 2005/10/23 14:10:45 serassio Exp $
  *
  * AUTHOR: Duane Wessels
  *
@@ -100,6 +100,7 @@ SQUIDCEXTERN int rfc1035_errno;
 SQUIDCEXTERN const char *rfc1035_error_message;
 
 #define RFC1035_TYPE_A 1
+#define RFC1035_TYPE_CNAME 5
 #define RFC1035_TYPE_PTR 12
 #define RFC1035_CLASS_IN 1
 
index cc1f323cfdc4c098231dd7ff4c9f795ff1d3aae6..fbc47d558429ba91af0670e66019d3abc2efd36f 100644 (file)
@@ -1,6 +1,6 @@
 
 /*
- * $Id: fqdncache.cc,v 1.164 2005/04/18 21:52:42 hno Exp $
+ * $Id: fqdncache.cc,v 1.165 2005/10/23 14:10:45 serassio Exp $
  *
  * DEBUG: section 35    FQDN Cache
  * AUTHOR: Harvest Derived
@@ -362,16 +362,23 @@ fqdncacheParse(fqdncache_entry *f, rfc1035_rr * answers, int nr, const char *err
     assert(answers);
 
     for (k = 0; k < nr; k++) {
-        if (answers[k].type != RFC1035_TYPE_PTR)
-            continue;
-
         if (answers[k]._class != RFC1035_CLASS_IN)
             continue;
 
-        if (!answers[k].rdata[0])
-            continue;
+        if (answers[k].type == RFC1035_TYPE_PTR) {
+            if (!answers[k].rdata[0]) {
+                debug(35, 2) ("fqdncacheParse: blank PTR record for '%s'\n", name);
+                continue;
+            }
 
-        f->names[f->name_count++] = xstrdup(answers[k].rdata);
+            if (strchr(answers[k].rdata, ' ')) {
+                debug(35, 2) ("fqdncacheParse: invalid PTR record '%s' for '%s'\n", answers[k].rdata, name);
+                continue;
+            }
+
+            f->names[f->name_count++] = xstrdup(answers[k].rdata);
+        } else if (answers[k].type != RFC1035_TYPE_CNAME)
+            continue;
 
         if (ttl == 0 || (int) answers[k].ttl < ttl)
             ttl = answers[k].ttl;
@@ -381,8 +388,7 @@ fqdncacheParse(fqdncache_entry *f, rfc1035_rr * answers, int nr, const char *err
     }
 
     if (f->name_count == 0) {
-        debug(35, 1) ("fqdncacheParse: No PTR record\n");
-        f->error_message = xstrdup("No PTR record");
+        debug(35, 1) ("fqdncacheParse: No PTR record for '%s'\n", name);
         return 0;
     }
 
index a53c84ccb6419981d78d7f954f9f497e4e8ff6bb..6c403e2a11de35b5decc9568e6cc75392cf9546e 100644 (file)
@@ -1,6 +1,6 @@
 
 /*
- * $Id: ipcache.cc,v 1.251 2005/04/18 21:52:42 hno Exp $
+ * $Id: ipcache.cc,v 1.252 2005/10/23 14:10:45 serassio Exp $
  *
  * DEBUG: section 14    IP Cache
  * AUTHOR: Harvest Derived
@@ -420,23 +420,24 @@ ipcacheParse(ipcache_entry *i, rfc1035_rr * answers, int nr, const char *error_m
     i->addrs.bad_mask = (unsigned char *)xcalloc(na, sizeof(unsigned char));
 
     for (j = 0, k = 0; k < nr; k++) {
-        if (answers[k].type != RFC1035_TYPE_A)
-            continue;
-
         if (answers[k]._class != RFC1035_CLASS_IN)
             continue;
 
-        if (answers[k].rdlength != 4)
+        if (answers[k].type == RFC1035_TYPE_A) {
+            if (answers[k].rdlength != 4)
+                continue;
+
+            xmemcpy(&i->addrs.in_addrs[j++], answers[k].rdata, 4);
+
+            debug(14, 3) ("ipcacheParse: #%d %s\n",
+                          j - 1,
+                          inet_ntoa(i->addrs.in_addrs[j - 1]));
+        } else if (answers[k].type != RFC1035_TYPE_CNAME)
             continue;
 
         if (ttl == 0 || (int) answers[k].ttl < ttl)
             ttl = answers[k].ttl;
 
-        xmemcpy(&i->addrs.in_addrs[j++], answers[k].rdata, 4);
-
-        debug(14, 3) ("ipcacheParse: #%d %s\n",
-                      j - 1,
-                      inet_ntoa(i->addrs.in_addrs[j - 1]));
     }
 
     assert(j == na);