From: Tom Kistner Date: Thu, 30 Apr 2009 08:21:30 +0000 (+0000) Subject: Fix dnsdb lookup to support multi-chunk TXT RRs / Do the same for DKIM TXT lookup... X-Git-Url: https://git.exim.org/users/jgh/exim.git/commitdiff_plain/89cf5892ee8f03197c6f884272ba900f7aa7e2fe Fix dnsdb lookup to support multi-chunk TXT RRs / Do the same for DKIM TXT lookup glue --- diff --git a/src/src/dkim.c b/src/src/dkim.c index 796349bef..fe536d9ca 100644 --- a/src/src/dkim.c +++ b/src/src/dkim.c @@ -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; diff --git a/src/src/lookups/dnsdb.c b/src/src/lookups/dnsdb.c index ab3bc430d..97a1cd6e3 100644 --- a/src/src/lookups/dnsdb.c +++ b/src/src/lookups/dnsdb.c @@ -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 */ {