Fix dnsdb lookup to support multi-chunk TXT RRs / Do the same for DKIM TXT lookup...
authorTom Kistner <tom@duncanthrax.net>
Thu, 30 Apr 2009 08:21:30 +0000 (08:21 +0000)
committerTom Kistner <tom@duncanthrax.net>
Thu, 30 Apr 2009 08:21:30 +0000 (08:21 +0000)
src/src/dkim.c
src/src/lookups/dnsdb.c

index 796349bef6d5b3727918ead5990c9c234dd3ac67..fe536d9caa0dbf00c40bf9ee73258141fd24214e 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/dkim.c,v 1.1.2.6 2009/04/09 13:57:21 tom Exp $ */
+/* $Cambridge: exim/src/src/dkim.c,v 1.1.2.7 2009/04/30 08:21:30 tom Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -34,9 +34,16 @@ int dkim_exim_query_dns_txt(char *name, char *answer) {
 
   /* Copy record content to the answer buffer */
   if (rr != NULL) {
-    int len = (rr->data)[0];
-    //if (len > 511) len = 127; // ???
-    snprintf(answer, PDKIM_DNS_TXT_MAX_RECLEN, "%.*s", len, (char *)(rr->data+1));
+    int rr_offset = 0;
+    int answer_offset = 0;
+    while (rr_offset < rr->size) {
+      uschar len = (rr->data)[rr_offset++];
+      snprintf(answer+(answer_offset),
+               PDKIM_DNS_TXT_MAX_RECLEN-(answer_offset),
+               "%.*s", (int)len, (char *)((rr->data)+rr_offset));
+      rr_offset+=len;
+      answer_offset+=len;
+    }
   }
   else return 1;
 
index ab3bc430d05a85d75c8e81b4587ecf0abf2b3def..97a1cd6e3d7c6d8919f3ebcaa24cad4f8a2e2562 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/lookups/dnsdb.c,v 1.17 2007/01/08 10:50:19 ph10 Exp $ */
+/* $Cambridge: exim/src/src/lookups/dnsdb.c,v 1.17.2.1 2009/04/30 08:21:30 tom Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -303,8 +303,14 @@ while ((domain = string_nextinlist(&keystring, &sep, buffer, sizeof(buffer)))
 
     if (type == T_TXT)
       {
-      yield = string_cat(yield, &size, &ptr, (uschar *)(rr->data+1),
-        (rr->data)[0]);
+      int data_offset = 0;
+      while (data_offset < rr->size)
+        {
+        uschar chunk_len = (rr->data)[data_offset++];
+        yield = string_cat(yield, &size, &ptr,
+                           (uschar *)((rr->data)+data_offset), chunk_len);
+        data_offset += chunk_len;
+        }
       }
     else   /* T_CNAME, T_CSA, T_MX, T_MXH, T_NS, T_PTR, T_SRV */
       {