Testsuite: support for multi-chunk DNS TXT records; more cases for dnsdb
authorJeremy Harris <jgh146exb@wizmail.org>
Fri, 17 Nov 2023 20:27:16 +0000 (20:27 +0000)
committerJeremy Harris <jgh146exb@wizmail.org>
Fri, 17 Nov 2023 20:27:16 +0000 (20:27 +0000)
adds to: 79670d3c32cc

doc/doc-txt/ChangeLog
test/dnszones-src/db.test.ex
test/scripts/2200-dnsdb/2200
test/src/fakens.c
test/stdout/2200

index 1663f85527b9fb63d02a29314ea89f8b8ebc3264..8722e109f6298fd75deb229db2ebf287dd0cf73f 100644 (file)
@@ -32,8 +32,9 @@ JH/05 Fix TLS resumption for TLS-on-connect.  This was broken by the advent
       to be a static string, for TLS-on-connect cases; meaning that resumption
       will always be attempted (unless deliberately overriden).
 
-JH/06 Bug 3054: Fix dnsdb lookup for a TXT record with multiple chunks.  This
-      was broken by hardening introduced for Bug 3033.
+JH/06 Bug 3054: Fix dnsdb lookup for a TXT record with multiple chunks, with a
+      chunk-separator specification.  This was broken by hardening introduced
+      for Bug 3031.
 
 
 
index 94ac9860830e3bc0bb459d96e9f2835558c5feb5..d6de7aa6c21c798bf3555844cfe8536461ff7c75 100644 (file)
@@ -25,6 +25,7 @@ test.ex.     SOA     exim.test.ex. hostmaster.exim.test.ex 1430683638 1200 120 6
 test.ex.     TXT     "A TXT record for test.ex."
 s/lash       TXT     "A TXT record for s/lash.test.ex."
 long         TXT     "This is a max-length chunk 789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234" "A short chunk" "A final chunk"
+long         TXT     "Second RR"
 
 cname        CNAME   test.ex.
 
index 4b89a733825c74af9a441e1d4132c4d70cbf5b26..3d78a26395d6e67c307f1eba0e3d491cbeb9984b 100644 (file)
@@ -4,7 +4,15 @@ exim -be
 test.ex                    ${lookup dnsdb{test.ex}{$value}fail}
 s/lash.test.ex             ${lookup dnsdb{s/lash.test.ex}{$value}fail}
 txt=test.ex                ${lookup dnsdb{txt=test.ex}{$value}fail}
-txt=long.test.ex           ${lookup dnsdb{>\n; txt=long.test.ex}{$value}fail}
+>X txt=test.ex             ${lookup dnsdb{txt=test.ex}{$value}fail}
+>X; txt=test.ex            ${lookup dnsdb{txt=test.ex}{$value}fail}
+>X, txt=test.ex            ${lookup dnsdb{txt=test.ex}{$value}fail}
+>X, txt=test.ex            ${lookup dnsdb{txt=test.ex}{$value}fail}
+txt=long.test.ex           ${lookup dnsdb{     txt=long.test.ex}{$value}fail}
+>X   txt=long.test.ex      ${lookup dnsdb{>X   txt=long.test.ex}{$value}fail}
+>X;  txt=long.test.ex      ${lookup dnsdb{>X;  txt=long.test.ex}{$value}fail}
+>X,  txt=long.test.ex      ${lookup dnsdb{>X,  txt=long.test.ex}{$value}fail}
+>X,Z txt=long.test.ex      ${lookup dnsdb{>X,Z txt=long.test.ex}{$value}fail}
 a=black-1.test.ex          ${lookup dnsdb{a=black-1.test.ex}{$value}fail}
 xxx=test.ex                ${lookup dnsdb{xxx=test.ex}{$value}fail}
 a=localhost.test.ex        ${lookup dnsdb{a=localhost.test.ex}{$value}fail}
index 0de4e60c29b2a6590de140d6e28f67b0c4bb87e6..3d6f513fc8e878117977418b23755a410d0f8066 100644 (file)
@@ -329,7 +329,7 @@ int domainlen = Ustrlen(domain);
 BOOL pass_on_not_found = FALSE;
 tlist *typeptr;
 uschar *pk = *pkptr;
-uschar buffer[256];
+uschar buffer[512];
 uschar rrdomain[256];
 uschar RRdomain[256];
 
@@ -536,12 +536,16 @@ while (fgets(CS buffer, sizeof(buffer), f) != NULL)
       break;
 
     case ns_t_txt:
-      pp = pk++;
-      if (*p == '"') p++;   /* Should always be the case */
-      while (*p != 0 && *p != '"') *pk++ = *p++;
-      *pp = pk - pp - 1;
+      while (*p)
+        {
+        pp = pk++;            /* Skip the size byte in output */
+        if (*p == '"') p++;   /* Should always be the case */
+        while (*p && *p != '"') *pk++ = *p++;
+        *pp = pk - pp - 1;    /* fill in the size */
+        p++;                  /* skip the closing doublequote */
+        while (isspace(*p)) p++; /* next chunk start */
+        }
       break;
-      /*XXX need a way of doing multi-chunk TXT RRs */
 
     case ns_t_tlsa:
       pk = bytefield(&p, pk);   /* usage */
index 8d02a903e73990dbbd85ab0d93bf2ce005a79db9..bc9d346c136e98b73bd97eb933dcf5d312fc1557 100644 (file)
@@ -1,7 +1,16 @@
 > test.ex                    A TXT record for test.ex.
 > s/lash.test.ex             A TXT record for s/lash.test.ex.
 > txt=test.ex                A TXT record for test.ex.
-> txt=long.test.ex           This is a max-length chunk 789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234A short chunkA final chunk
+> >X txt=test.ex             A TXT record for test.ex.
+> >X; txt=test.ex            A TXT record for test.ex.
+> >X, txt=test.ex            A TXT record for test.ex.
+> >X, txt=test.ex            A TXT record for test.ex.
+> txt=long.test.ex           This is a max-length chunk 789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234
+Second RR
+> >X   txt=long.test.ex      This is a max-length chunk 789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234XSecond RR
+> >X;  txt=long.test.ex      This is a max-length chunk 789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234A short chunkA final chunkXSecond RR
+> >X,  txt=long.test.ex      This is a max-length chunk 789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234 A short chunk A final chunkXSecond RR
+> >X,Z txt=long.test.ex      This is a max-length chunk 789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234ZA short chunkZA final chunkXSecond RR
 > a=black-1.test.ex          V4NET.11.12.13
 > Failed: lookup of "xxx=test.ex" gave DEFER: unsupported DNS record type
 > a=localhost.test.ex        127.0.0.1