nm4 2010/05/29 20:23:26 BST
Modified files:
exim-doc/doc-docbook spec.xfpt
exim-doc/doc-txt ChangeLog
exim-src/src/lookups dnsdb.c
Log:
DKIM DNS TXT record bug fix. Fixes: #967
Revision Changes Path
1.73 +14 -0 exim/exim-doc/doc-docbook/spec.xfpt
1.611 +3 -0 exim/exim-doc/doc-txt/ChangeLog
1.20 +40 -10 exim/exim-src/src/lookups/dnsdb.c
Index: spec.xfpt
===================================================================
RCS file: /home/cvs/exim/exim-doc/doc-docbook/spec.xfpt,v
retrieving revision 1.72
retrieving revision 1.73
diff -u -r1.72 -r1.73
--- spec.xfpt 5 Mar 2010 16:26:46 -0000 1.72
+++ spec.xfpt 29 May 2010 19:23:25 -0000 1.73
@@ -1,4 +1,4 @@
-. $Cambridge: exim/exim-doc/doc-docbook/spec.xfpt,v 1.72 2010/03/05 16:26:46 nm4 Exp $
+. $Cambridge: exim/exim-doc/doc-docbook/spec.xfpt,v 1.73 2010/05/29 19:23:25 nm4 Exp $
.
. /////////////////////////////////////////////////////////////////////////////
. This is the primary source of the Exim Manual. It is an xfpt document that is
@@ -6628,6 +6628,20 @@
It is permitted to specify a space as the separator character. Further
white space is ignored.
+.new
+.cindex "TXT record" "in &(dnsdb)& lookup"
+For TXT records with multiple items of data, only the first item is returned,
+unless a separator for them is specified using a comma after the separator
+character followed immediately by the TXT record item separator. To concatenate
+items without a separator, use a semicolon instead.
+.code
+${lookup dnsdb{>\n,: txt=a.b.example}}
+${lookup dnsdb{>\n; txt=a.b.example}}
+.endd
+It is permitted to specify a space as the separator character. Further
+white space is ignored.
+.wen
+
.section "Pseudo dnsdb record types" "SECID66"
.cindex "MX record" "in &(dnsdb)& lookup"
By default, both the preference value and the host name are returned for
Index: ChangeLog
===================================================================
RCS file: /home/cvs/exim/exim-doc/doc-txt/ChangeLog,v
retrieving revision 1.610
retrieving revision 1.611
diff -u -r1.610 -r1.611
--- ChangeLog 29 May 2010 19:16:50 -0000 1.610
+++ ChangeLog 29 May 2010 19:23:26 -0000 1.611
@@ -1,4 +1,4 @@
-$Cambridge: exim/exim-doc/doc-txt/ChangeLog,v 1.610 2010/05/29 19:16:50 nm4 Exp $
+$Cambridge: exim/exim-doc/doc-txt/ChangeLog,v 1.611 2010/05/29 19:23:26 nm4 Exp $
Change log file for Exim from version 4.21
-------------------------------------------
@@ -39,6 +39,9 @@
NM/07 Null terminate DKIM strings, Null initialise DKIM variable
Bugzilla 985, 986. Patch by Simon Arlott
+NM/08 Bugzilla 967. DKIM DNS TXT record bug fix
+ Patch by Simon Arlott
+
Exim version 4.71
-----------------
Index: dnsdb.c
===================================================================
RCS file: /home/cvs/exim/exim-src/src/lookups/dnsdb.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- dnsdb.c 16 Nov 2009 19:50:38 -0000 1.19
+++ dnsdb.c 29 May 2010 19:23:26 -0000 1.20
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/exim-src/src/lookups/dnsdb.c,v 1.19 2009/11/16 19:50:38 nm4 Exp $ */
+/* $Cambridge: exim/exim-src/src/lookups/dnsdb.c,v 1.20 2010/05/29 19:23:26 nm4 Exp $ */
/*************************************************
* Exim - an Internet mail transport agent *
@@ -88,17 +88,23 @@
separator character that is used when multiple records are found. The default
separator is newline.
-(b) If the next sequence of characters is 'defer_FOO' followed by a comma,
+(b) If the next character is ',' then the next character is the separator
+character used for multiple items of text in "TXT" records. Alternatively,
+if the next character is ';' then these multiple items are concatenated with
+no separator. With neither of these options specified, only the first item
+is output.
+
+(c) If the next sequence of characters is 'defer_FOO' followed by a comma,
the defer behaviour is set to FOO. The possible behaviours are: 'strict', where
any defer causes the whole lookup to defer; 'lax', where a defer causes the
whole lookup to defer only if none of the DNS queries succeeds; and 'never',
where all defers are as if the lookup failed. The default is 'lax'.
-(c) If the next sequence of characters is a sequence of letters and digits
+(d) If the next sequence of characters is a sequence of letters and digits
followed by '=', it is interpreted as the name of the DNS record type. The
default is "TXT".
-(d) Then there follows list of domain names. This is a generalized Exim list,
+(e) Then there follows list of domain names. This is a generalized Exim list,
which may start with '<' in order to set a specific separator. The default
separator, as always, is colon. */
@@ -114,6 +120,7 @@
int type = T_TXT;
int failrc = FAIL;
uschar *outsep = US"\n";
+uschar *outsep2 = NULL;
uschar *equals, *domain, *found;
uschar buffer[256];
@@ -131,13 +138,24 @@
length = length;
do_cache = do_cache;
-/* If the string starts with '>' we change the output separator */
+/* If the string starts with '>' we change the output separator.
+If it's followed by ';' or ',' we set the TXT output separator. */
while (isspace(*keystring)) keystring++;
if (*keystring == '>')
{
outsep = keystring + 1;
keystring += 2;
+ if (*keystring == ',')
+ {
+ outsep2 = keystring + 1;
+ keystring += 2;
+ }
+ else if (*keystring == ';')
+ {
+ outsep2 = US"";
+ keystring++;
+ }
while (isspace(*keystring)) keystring++;
}
@@ -303,13 +321,25 @@
if (type == T_TXT)
{
- int data_offset = 0;
- while (data_offset < rr->size)
+ if (outsep2 == NULL)
{
- uschar chunk_len = (rr->data)[data_offset++];
- yield = string_cat(yield, &size, &ptr,
- (uschar *)((rr->data)+data_offset), chunk_len);
- data_offset += chunk_len;
+ /* output only the first item of data */
+ yield = string_cat(yield, &size, &ptr, (uschar *)(rr->data+1),
+ (rr->data)[0]);
+ }
+ else
+ {
+ /* output all items */
+ int data_offset = 0;
+ while (data_offset < rr->size)
+ {
+ uschar chunk_len = (rr->data)[data_offset++];
+ if (outsep2[0] != '\0' && data_offset != 1)
+ yield = string_cat(yield, &size, &ptr, outsep2, 1);
+ 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 */