]> git.ipfire.org Git - thirdparty/postfix.git/commitdiff
postfix-3.6-20200925
authorWietse Venema <wietse@porcupine.org>
Fri, 25 Sep 2020 05:00:00 +0000 (00:00 -0500)
committerViktor Dukhovni <postfix-users@dukhovni.org>
Mon, 12 Oct 2020 01:32:29 +0000 (23:32 -0200)
37 files changed:
postfix/HISTORY
postfix/WISHLIST
postfix/src/cleanup/Makefile.in
postfix/src/cleanup/cleanup_milter.c
postfix/src/cleanup/cleanup_milter.in17a [new file with mode: 0644]
postfix/src/cleanup/cleanup_milter.in17b [new file with mode: 0644]
postfix/src/cleanup/cleanup_milter.in17c [new file with mode: 0644]
postfix/src/cleanup/cleanup_milter.in17d [new file with mode: 0644]
postfix/src/cleanup/cleanup_milter.in17e [new file with mode: 0644]
postfix/src/cleanup/cleanup_milter.in17f [new file with mode: 0644]
postfix/src/cleanup/cleanup_milter.in17g [new file with mode: 0644]
postfix/src/cleanup/cleanup_milter.ref17a1 [new file with mode: 0644]
postfix/src/cleanup/cleanup_milter.ref17a2 [new file with mode: 0644]
postfix/src/cleanup/cleanup_milter.ref17b1 [new file with mode: 0644]
postfix/src/cleanup/cleanup_milter.ref17b2 [new file with mode: 0644]
postfix/src/cleanup/cleanup_milter.ref17c1 [new file with mode: 0644]
postfix/src/cleanup/cleanup_milter.ref17c2 [new file with mode: 0644]
postfix/src/cleanup/cleanup_milter.ref17d1 [new file with mode: 0644]
postfix/src/cleanup/cleanup_milter.ref17d2 [new file with mode: 0644]
postfix/src/cleanup/cleanup_milter.ref17e1 [new file with mode: 0644]
postfix/src/cleanup/cleanup_milter.ref17e2 [new file with mode: 0644]
postfix/src/cleanup/cleanup_milter.ref17f1 [new file with mode: 0644]
postfix/src/cleanup/cleanup_milter.ref17f2 [new file with mode: 0644]
postfix/src/cleanup/cleanup_milter.ref17g1 [new file with mode: 0644]
postfix/src/cleanup/cleanup_milter.ref17g2 [new file with mode: 0644]
postfix/src/cleanup/cleanup_out_recipient.c
postfix/src/cleanup/test-queue-file17 [new file with mode: 0644]
postfix/src/global/Makefile.in
postfix/src/global/been_here.c
postfix/src/global/been_here.h
postfix/src/global/delivered_hdr.c
postfix/src/global/delivered_hdr.ref [new file with mode: 0644]
postfix/src/global/mail_version.h
postfix/src/util/Makefile.in
postfix/src/util/vstream.c
postfix/src/util/vstream_test.ref
postfix/src/util/vstring.h

index 408c9ce3872bfbd4b778f77428f7cdba63ac1010..5b9f68cb6868e4703b3135a33233585b8f44d29f 100644 (file)
@@ -25153,3 +25153,21 @@ Apologies for any names omitted.
 
        Cleanup: replaced hard-coded 'private' with named constant.
        File: global/scache_clnt.c.
+
+       Bugfix (introduced: Postfix 2.3): when deleting a recipient
+       with a milter, delete the recipient from the duplicate
+       filter, so that the recipient can be added back. Files:
+       global/been_here.[hc], cleanup/cleanup_milter.c,
+       cleanup/Makefile.in, lots of cleanup unit test files.
+
+20200925
+
+       Cleanup: vstream_fseek() support for reading or writing
+       memory buffer streams, and minor cleanups in VSTREAM support
+       for reading/writing VSTRINGs. Also added unit tests. Files:
+       util/vstream.c, util/vstring.h.
+
+       Bugfix (introduced: before Postfix alpha): the code that
+       looks for Delivered-To: headers ignored headers longer than
+       $line_length_limit. Also added unit tests. File:
+       global/delivered_hdr.c.
index b2eff8711362a877ae6fa39873ec62696c8a8b59..6ff3680d16d0e8472a3ff007c8b22292b387f7c2 100644 (file)
@@ -29,9 +29,6 @@ Wish list:
        Update makedefs and sys-defs.h for current Linux kernels and
        *BSD releases.
 
-       When deleting a recipient with a milter, delete the recipient from
-       the duplicate filter, so that the recipient can be added back.
-
        DNS wrapper class, like XSASL, to support different stub
        resolvers without contaminating Postfix programs with the
        idiosyncracies of stub resolvers. Handle differences in
index 546aae1c94859dfd2729d5527eaffe2efa1c61fe..2b8f11917acea03f4ca44042237ca8aee68c5291 100644 (file)
@@ -86,23 +86,25 @@ milter_tests: cleanup_milter_test bug_tests \
        cleanup_milter_test15a cleanup_milter_test15b cleanup_milter_test15c \
        cleanup_milter_test15d cleanup_milter_test15e cleanup_milter_test15f \
        cleanup_milter_test15g cleanup_milter_test15h cleanup_milter_test15i \
-       cleanup_milter_test16a cleanup_milter_test16b
+       cleanup_milter_test16a cleanup_milter_test16b cleanup_milter_test17a \
+       cleanup_milter_test17b cleanup_milter_test17c cleanup_milter_test17d \
+       cleanup_milter_test17e cleanup_milter_test17f cleanup_milter_test17g
 
 root_tests:
 
 cleanup_masquerade_test: cleanup_masquerade cleanup_masq.ref
        rm -f cleanup_masq.tmp
-       $(SHLIB_ENV) ./cleanup_masquerade '' a.b.c,b.c xxx@aa.a.b.c    >>cleanup_masq.tmp
-       $(SHLIB_ENV) ./cleanup_masquerade '' A.B.C,B.C xxx@aa.a.b.c    >>cleanup_masq.tmp
-       $(SHLIB_ENV) ./cleanup_masquerade '' a.b.c,b.c xxx@AA.A.B.C    >>cleanup_masq.tmp
-       $(SHLIB_ENV) ./cleanup_masquerade 'xxx' a.b.c,b.c xxx@aa.a.b.c >>cleanup_masq.tmp
-       $(SHLIB_ENV) ./cleanup_masquerade 'yyy' a.b.c,b.c xxx@aa.a.b.c >>cleanup_masq.tmp
-       $(SHLIB_ENV) ./cleanup_masquerade '' !a.b.c,b.c xxx@aa.a.b.c   >>cleanup_masq.tmp
-       $(SHLIB_ENV) ./cleanup_masquerade '' a.b.c,b.c xxx@a.b.c       >>cleanup_masq.tmp
-       $(SHLIB_ENV) ./cleanup_masquerade '' !a.b.c,b.c xxx@a.b.c      >>cleanup_masq.tmp
-       $(SHLIB_ENV) ./cleanup_masquerade '' a.b.c,b.c xxx@aaa.b.c     >>cleanup_masq.tmp
-       $(SHLIB_ENV) ./cleanup_masquerade '' a.b.c,b.c xxx@b.c         >>cleanup_masq.tmp
-       $(SHLIB_ENV) ./cleanup_masquerade 'fail:whatever' xy xxx@b.c   >>cleanup_masq.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_masquerade '' a.b.c,b.c xxx@aa.a.b.c    >>cleanup_masq.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_masquerade '' A.B.C,B.C xxx@aa.a.b.c    >>cleanup_masq.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_masquerade '' a.b.c,b.c xxx@AA.A.B.C    >>cleanup_masq.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_masquerade 'xxx' a.b.c,b.c xxx@aa.a.b.c >>cleanup_masq.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_masquerade 'yyy' a.b.c,b.c xxx@aa.a.b.c >>cleanup_masq.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_masquerade '' !a.b.c,b.c xxx@aa.a.b.c   >>cleanup_masq.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_masquerade '' a.b.c,b.c xxx@a.b.c       >>cleanup_masq.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_masquerade '' !a.b.c,b.c xxx@a.b.c      >>cleanup_masq.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_masquerade '' a.b.c,b.c xxx@aaa.b.c     >>cleanup_masq.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_masquerade '' a.b.c,b.c xxx@b.c         >>cleanup_masq.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_masquerade 'fail:whatever' xy xxx@b.c   >>cleanup_masq.tmp
        diff cleanup_masq.ref cleanup_masq.tmp
        rm -f cleanup_masq.tmp
 
@@ -115,10 +117,10 @@ bug1_test: cleanup_milter bug1.file bug1.in bug1.ref bug1.text.ref \
        ../postcat/postcat
        cp bug1.file bug1.file.tmp
        chmod u+w bug1.file.tmp
-       $(SHLIB_ENV) ./cleanup_milter <bug1.in
-       $(SHLIB_ENV) ../postcat/postcat -ov bug1.file.tmp 2>/dev/null >bug1.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <bug1.in
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov bug1.file.tmp 2>/dev/null >bug1.tmp
        diff bug1.ref bug1.tmp
-       $(SHLIB_ENV) ../postcat/postcat bug1.file.tmp 2>/dev/null >bug1.tmp
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat bug1.file.tmp 2>/dev/null >bug1.tmp
        diff bug1.text.ref bug1.tmp
        rm -f bug1.file.tmp bug1.tmp
 
@@ -126,10 +128,10 @@ bug2_test: cleanup_milter bug2.file bug2.in bug2.ref bug2.text.ref \
        ../postcat/postcat
        cp bug2.file bug2.file.tmp
        chmod u+w bug2.file.tmp
-       $(SHLIB_ENV) ./cleanup_milter <bug2.in
-       $(SHLIB_ENV) ../postcat/postcat -ov bug2.file.tmp 2>/dev/null >bug2.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <bug2.in
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov bug2.file.tmp 2>/dev/null >bug2.tmp
        diff bug2.ref bug2.tmp
-       $(SHLIB_ENV) ../postcat/postcat bug2.file.tmp 2>/dev/null >bug2.tmp
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat bug2.file.tmp 2>/dev/null >bug2.tmp
        diff bug2.text.ref bug2.tmp
        rm -f bug2.file.tmp bug2.tmp
 
@@ -137,10 +139,10 @@ bug3_test: cleanup_milter bug3.file bug3.in bug3.ref bug3.text.ref \
        ../postcat/postcat
        cp bug3.file bug3.file.tmp
        chmod u+w bug3.file.tmp
-       $(SHLIB_ENV) ./cleanup_milter <bug3.in
-       $(SHLIB_ENV) ../postcat/postcat -ov bug3.file.tmp 2>/dev/null >bug3.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <bug3.in
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov bug3.file.tmp 2>/dev/null >bug3.tmp
        diff bug3.ref bug3.tmp
-       $(SHLIB_ENV) ../postcat/postcat bug3.file.tmp 2>/dev/null >bug3.tmp
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat bug3.file.tmp 2>/dev/null >bug3.tmp
        diff bug3.text.ref bug3.tmp
        rm -f bug3.file.tmp bug3.tmp
 
@@ -150,8 +152,8 @@ cleanup_milter_test: cleanup_milter test-queue-file cleanup_milter.in1 \
        cleanup_milter.ref1 ../postcat/postcat
        cp test-queue-file test-queue-file.tmp
        chmod u+w test-queue-file.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in1
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file.tmp 2>/dev/null >cleanup_milter.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in1
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file.tmp 2>/dev/null >cleanup_milter.tmp
        diff cleanup_milter.ref1 cleanup_milter.tmp
        rm -f test-queue-file.tmp cleanup_milter.tmp
 
@@ -159,8 +161,8 @@ cleanup_milter_test2: cleanup_milter test-queue-file2 cleanup_milter.in2 \
        cleanup_milter.ref2 ../postcat/postcat
        cp test-queue-file2 test-queue-file2.tmp
        chmod u+w test-queue-file2.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in2
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file2.tmp 2>/dev/null >cleanup_milter.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in2
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file2.tmp 2>/dev/null >cleanup_milter.tmp
        diff cleanup_milter.ref2 cleanup_milter.tmp
        rm -f test-queue-file2.tmp cleanup_milter.tmp
 
@@ -168,8 +170,8 @@ cleanup_milter_test3: cleanup_milter test-queue-file3 cleanup_milter.in3 \
        cleanup_milter.ref3 ../postcat/postcat
        cp test-queue-file3 test-queue-file3.tmp
        chmod u+w test-queue-file3.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in3
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file3.tmp 2>/dev/null >cleanup_milter.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in3
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file3.tmp 2>/dev/null >cleanup_milter.tmp
        diff cleanup_milter.ref3 cleanup_milter.tmp
        rm -f test-queue-file3.tmp cleanup_milter.tmp
 
@@ -178,18 +180,18 @@ cleanup_milter_test4: cleanup_milter test-queue-file4 cleanup_milter.in4a \
        test-queue-file4 ../postcat/postcat
        cp test-queue-file4 test-queue-file4.tmp
        chmod u+w test-queue-file4.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in4a
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file4.tmp 2>/dev/null >cleanup_milter.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in4a
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file4.tmp 2>/dev/null >cleanup_milter.tmp
        diff cleanup_milter.ref4 cleanup_milter.tmp
        cp test-queue-file4 test-queue-file4.tmp
        chmod u+w test-queue-file4.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in4b
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file4.tmp 2>/dev/null >cleanup_milter.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in4b
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file4.tmp 2>/dev/null >cleanup_milter.tmp
        diff cleanup_milter.ref4 cleanup_milter.tmp
        cp test-queue-file4 test-queue-file4.tmp
        chmod u+w test-queue-file4.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in4c
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file4.tmp 2>/dev/null >cleanup_milter.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in4c
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file4.tmp 2>/dev/null >cleanup_milter.tmp
        diff cleanup_milter.ref4 cleanup_milter.tmp
        rm -f test-queue-file4.tmp cleanup_milter.tmp
 
@@ -197,8 +199,8 @@ cleanup_milter_test5: cleanup_milter test-queue-file5 cleanup_milter.in5 \
        cleanup_milter.ref5 ../postcat/postcat
        cp test-queue-file5 test-queue-file5.tmp
        chmod u+w test-queue-file5.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in5
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file5.tmp 2>/dev/null >cleanup_milter.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in5
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file5.tmp 2>/dev/null >cleanup_milter.tmp
        diff cleanup_milter.ref5 cleanup_milter.tmp
        rm -f test-queue-file5.tmp cleanup_milter.tmp
 
@@ -209,8 +211,8 @@ cleanup_milter_test6a: cleanup_milter test-queue-file6 cleanup_milter.in6a \
        cleanup_milter.ref6a test-queue-file6 ../postcat/postcat
        cp test-queue-file6 test-queue-file6.tmp
        chmod u+w test-queue-file6.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in6a
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file6.tmp 2>/dev/null >cleanup_milter.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in6a
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file6.tmp 2>/dev/null >cleanup_milter.tmp
        diff cleanup_milter.ref6a cleanup_milter.tmp
        rm -f test-queue-file6.tmp cleanup_milter.tmp
 
@@ -218,8 +220,8 @@ cleanup_milter_test6b: cleanup_milter test-queue-file6 cleanup_milter.in6b \
        cleanup_milter.ref6b ../postcat/postcat
        cp test-queue-file6 test-queue-file6.tmp
        chmod u+w test-queue-file6.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in6b
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file6.tmp 2>/dev/null >cleanup_milter.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in6b
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file6.tmp 2>/dev/null >cleanup_milter.tmp
        diff cleanup_milter.ref6b cleanup_milter.tmp
        rm -f test-queue-file6.tmp cleanup_milter.tmp
 
@@ -227,8 +229,8 @@ cleanup_milter_test6c: cleanup_milter test-queue-file6 cleanup_milter.in6c \
        cleanup_milter.ref6c ../postcat/postcat
        cp test-queue-file6 test-queue-file6.tmp
        chmod u+w test-queue-file6.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in6c
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file6.tmp 2>/dev/null >cleanup_milter.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in6c
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file6.tmp 2>/dev/null >cleanup_milter.tmp
        diff cleanup_milter.ref6c cleanup_milter.tmp
        rm -f test-queue-file6.tmp cleanup_milter.tmp
 
@@ -236,8 +238,8 @@ cleanup_milter_test7: cleanup_milter test-queue-file7 cleanup_milter.in7 \
        cleanup_milter.ref7 ../postcat/postcat
        cp test-queue-file7 test-queue-file7.tmp
        chmod u+w test-queue-file7.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in7
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file7.tmp 2>/dev/null >cleanup_milter.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in7
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file7.tmp 2>/dev/null >cleanup_milter.tmp
        diff cleanup_milter.ref7 cleanup_milter.tmp
        rm -f test-queue-file7.tmp cleanup_milter.tmp
 
@@ -245,8 +247,8 @@ cleanup_milter_test8: cleanup_milter test-queue-file8 cleanup_milter.in8 \
        cleanup_milter.ref8 ../postcat/postcat
        cp test-queue-file8 test-queue-file8.tmp
        chmod u+w test-queue-file8.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in8
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file8.tmp 2>/dev/null >cleanup_milter.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in8
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file8.tmp 2>/dev/null >cleanup_milter.tmp
        diff cleanup_milter.ref8 cleanup_milter.tmp
        rm -f test-queue-file8.tmp cleanup_milter.tmp
 
@@ -254,8 +256,8 @@ cleanup_milter_test9: cleanup_milter test-queue-file9 cleanup_milter.in9 \
        cleanup_milter.ref9 ../postcat/postcat
        cp test-queue-file9 test-queue-file9.tmp
        chmod u+w test-queue-file9.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in9
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file9.tmp 2>/dev/null >cleanup_milter.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in9
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file9.tmp 2>/dev/null >cleanup_milter.tmp
        diff cleanup_milter.ref9 cleanup_milter.tmp
        rm -f test-queue-file9.tmp cleanup_milter.tmp
 
@@ -263,8 +265,8 @@ cleanup_milter_test10a: cleanup_milter test-queue-file10 cleanup_milter.in10a \
        cleanup_milter.ref10a ../postcat/postcat
        cp test-queue-file10 test-queue-file10.tmp
        chmod u+w test-queue-file10.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in10a
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file10.tmp 2>/dev/null >cleanup_milter.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in10a
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file10.tmp 2>/dev/null >cleanup_milter.tmp
        diff cleanup_milter.ref10a cleanup_milter.tmp
        rm -f test-queue-file10.tmp cleanup_milter.tmp
 
@@ -272,8 +274,8 @@ cleanup_milter_test10b: cleanup_milter test-queue-file10 cleanup_milter.in10b \
        cleanup_milter.ref10b ../postcat/postcat
        cp test-queue-file10 test-queue-file10.tmp
        chmod u+w test-queue-file10.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in10b
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file10.tmp 2>/dev/null >cleanup_milter.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in10b
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file10.tmp 2>/dev/null >cleanup_milter.tmp
        diff cleanup_milter.ref10b cleanup_milter.tmp
        rm -f test-queue-file10.tmp cleanup_milter.tmp
 
@@ -281,8 +283,8 @@ cleanup_milter_test10c: cleanup_milter test-queue-file10 cleanup_milter.in10c \
        cleanup_milter.ref10c ../postcat/postcat
        cp test-queue-file10 test-queue-file10.tmp
        chmod u+w test-queue-file10.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in10c
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file10.tmp 2>/dev/null >cleanup_milter.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in10c
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file10.tmp 2>/dev/null >cleanup_milter.tmp
        diff cleanup_milter.ref10c cleanup_milter.tmp
        rm -f test-queue-file10.tmp cleanup_milter.tmp
 
@@ -290,8 +292,8 @@ cleanup_milter_test10d: cleanup_milter test-queue-file10 cleanup_milter.in10c \
        cleanup_milter.ref10d ../postcat/postcat
        cp test-queue-file10 test-queue-file10.tmp
        chmod u+w test-queue-file10.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in10d
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file10.tmp 2>/dev/null >cleanup_milter.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in10d
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file10.tmp 2>/dev/null >cleanup_milter.tmp
        diff cleanup_milter.ref10d cleanup_milter.tmp
        rm -f test-queue-file10.tmp cleanup_milter.tmp
 
@@ -299,8 +301,8 @@ cleanup_milter_test10e: cleanup_milter test-queue-file10 cleanup_milter.in10c \
        cleanup_milter.ref10e ../postcat/postcat
        cp test-queue-file10 test-queue-file10.tmp
        chmod u+w test-queue-file10.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in10e
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file10.tmp 2>/dev/null >cleanup_milter.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in10e
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file10.tmp 2>/dev/null >cleanup_milter.tmp
        diff cleanup_milter.ref10e cleanup_milter.tmp
        rm -f test-queue-file10.tmp cleanup_milter.tmp
 
@@ -308,8 +310,8 @@ cleanup_milter_test11: cleanup_milter test-queue-file11 cleanup_milter.in11 \
        cleanup_milter.ref11 ../postcat/postcat
        cp test-queue-file11 test-queue-file11.tmp
        chmod u+w test-queue-file11.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in11
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file11.tmp 2>/dev/null >cleanup_milter.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in11
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file11.tmp 2>/dev/null >cleanup_milter.tmp
        diff cleanup_milter.ref11 cleanup_milter.tmp
        rm -f test-queue-file11.tmp cleanup_milter.tmp
 
@@ -317,8 +319,8 @@ cleanup_milter_test12: cleanup_milter test-queue-file12 cleanup_milter.in12 \
        cleanup_milter.ref12 ../postcat/postcat
        cp test-queue-file12 test-queue-file12.tmp
        chmod u+w test-queue-file12.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in12
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file12.tmp 2>/dev/null >cleanup_milter.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in12
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file12.tmp 2>/dev/null >cleanup_milter.tmp
        diff cleanup_milter.ref12 cleanup_milter.tmp
        rm -f test-queue-file12.tmp cleanup_milter.tmp
 
@@ -326,8 +328,8 @@ cleanup_milter_test13a: cleanup_milter test-queue-file13a cleanup_milter.in13a \
        cleanup_milter.ref13a ../postcat/postcat
        cp test-queue-file13a test-queue-file13a.tmp
        chmod u+w test-queue-file13a.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in13a
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file13a.tmp 2>/dev/null >cleanup_milter.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in13a
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file13a.tmp 2>/dev/null >cleanup_milter.tmp
        diff cleanup_milter.ref13a cleanup_milter.tmp
        rm -f test-queue-file13a.tmp cleanup_milter.tmp
 
@@ -335,8 +337,8 @@ cleanup_milter_test13b: cleanup_milter test-queue-file13b cleanup_milter.in13b \
        cleanup_milter.ref13b ../postcat/postcat
        cp test-queue-file13b test-queue-file13b.tmp
        chmod u+w test-queue-file13b.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in13b
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file13b.tmp 2>/dev/null >cleanup_milter.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in13b
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file13b.tmp 2>/dev/null >cleanup_milter.tmp
        diff cleanup_milter.ref13b cleanup_milter.tmp
        rm -f test-queue-file13b.tmp cleanup_milter.tmp
 
@@ -344,8 +346,8 @@ cleanup_milter_test13c: cleanup_milter test-queue-file13c cleanup_milter.in13c \
        cleanup_milter.ref13c ../postcat/postcat
        cp test-queue-file13c test-queue-file13c.tmp
        chmod u+w test-queue-file13c.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in13c
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file13c.tmp 2>/dev/null >cleanup_milter.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in13c
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file13c.tmp 2>/dev/null >cleanup_milter.tmp
        diff cleanup_milter.ref13c cleanup_milter.tmp
        rm -f test-queue-file13c.tmp cleanup_milter.tmp
 
@@ -353,8 +355,8 @@ cleanup_milter_test13d: cleanup_milter test-queue-file13d cleanup_milter.in13d \
        cleanup_milter.ref13d ../postcat/postcat
        cp test-queue-file13d test-queue-file13d.tmp
        chmod u+w test-queue-file13d.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in13d
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file13d.tmp 2>/dev/null >cleanup_milter.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in13d
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file13d.tmp 2>/dev/null >cleanup_milter.tmp
        diff cleanup_milter.ref13d cleanup_milter.tmp
        rm -f test-queue-file13d.tmp cleanup_milter.tmp
 
@@ -362,8 +364,8 @@ cleanup_milter_test13e: cleanup_milter test-queue-file13e cleanup_milter.in13e \
        cleanup_milter.ref13e ../postcat/postcat
        cp test-queue-file13e test-queue-file13e.tmp
        chmod u+w test-queue-file13e.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in13e
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file13e.tmp 2>/dev/null >cleanup_milter.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in13e
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file13e.tmp 2>/dev/null >cleanup_milter.tmp
        diff cleanup_milter.ref13e cleanup_milter.tmp
        rm -f test-queue-file13e.tmp cleanup_milter.tmp
 
@@ -371,8 +373,8 @@ cleanup_milter_test13g: cleanup_milter test-queue-file13g cleanup_milter.in13g \
        cleanup_milter.ref13g ../postcat/postcat
        cp test-queue-file13g test-queue-file13g.tmp
        chmod u+w test-queue-file13g.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in13g
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file13g.tmp 2>/dev/null >cleanup_milter.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in13g
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file13g.tmp 2>/dev/null >cleanup_milter.tmp
        diff cleanup_milter.ref13g cleanup_milter.tmp
        rm -f test-queue-file13g.tmp cleanup_milter.tmp
 
@@ -380,8 +382,8 @@ cleanup_milter_test13h: cleanup_milter test-queue-file13h cleanup_milter.in13h \
        cleanup_milter.ref13h ../postcat/postcat
        cp test-queue-file13h test-queue-file13h.tmp
        chmod u+w test-queue-file13h.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in13h
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file13h.tmp 2>/dev/null >cleanup_milter.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in13h
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file13h.tmp 2>/dev/null >cleanup_milter.tmp
        diff cleanup_milter.ref13h cleanup_milter.tmp
        rm -f test-queue-file13h.tmp cleanup_milter.tmp
 
@@ -389,8 +391,8 @@ cleanup_milter_test13i: cleanup_milter test-queue-file13i cleanup_milter.in13i \
        cleanup_milter.ref13i ../postcat/postcat
        cp test-queue-file13i test-queue-file13i.tmp
        chmod u+w test-queue-file13i.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in13i
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file13i.tmp 2>/dev/null >cleanup_milter.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in13i
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file13i.tmp 2>/dev/null >cleanup_milter.tmp
        diff cleanup_milter.ref13i cleanup_milter.tmp
        rm -f test-queue-file13i.tmp cleanup_milter.tmp
 
@@ -398,8 +400,8 @@ cleanup_milter_test13f: cleanup_milter test-queue-file13f cleanup_milter.in13f \
        cleanup_milter.ref13f ../postcat/postcat
        cp test-queue-file13f test-queue-file13f.tmp
        chmod u+w test-queue-file13f.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in13f
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file13f.tmp 2>/dev/null >cleanup_milter.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in13f
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file13f.tmp 2>/dev/null >cleanup_milter.tmp
        diff cleanup_milter.ref13f cleanup_milter.tmp
        rm -f test-queue-file13f.tmp cleanup_milter.tmp
 
@@ -408,9 +410,9 @@ cleanup_milter_test14a: cleanup_milter test-queue-file14 cleanup_milter.in14a \
        cleanup_milter.reg14a
        cp test-queue-file14 test-queue-file14a.tmp
        chmod u+w test-queue-file14a.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in14a 2>cleanup_milter.tmp1
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in14a 2>cleanup_milter.tmp1
        diff cleanup_milter.ref14a1 cleanup_milter.tmp1
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file14a.tmp 2>/dev/null >cleanup_milter.tmp2
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file14a.tmp 2>/dev/null >cleanup_milter.tmp2
        diff cleanup_milter.ref14a2 cleanup_milter.tmp2
        rm -f test-queue-file14a.tmp cleanup_milter.tmp1 cleanup_milter.tmp2
 
@@ -419,9 +421,9 @@ cleanup_milter_test14b: cleanup_milter test-queue-file14 cleanup_milter.in14b \
        cleanup_milter.reg14b
        cp test-queue-file14 test-queue-file14b.tmp
        chmod u+w test-queue-file14b.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in14b 2>cleanup_milter.tmp1
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in14b 2>cleanup_milter.tmp1
        diff cleanup_milter.ref14b1 cleanup_milter.tmp1
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file14b.tmp 2>/dev/null >cleanup_milter.tmp2
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file14b.tmp 2>/dev/null >cleanup_milter.tmp2
        diff cleanup_milter.ref14b2 cleanup_milter.tmp2
        rm -f test-queue-file14b.tmp cleanup_milter.tmp1 cleanup_milter.tmp2
 
@@ -430,9 +432,9 @@ cleanup_milter_test14c: cleanup_milter test-queue-file14 cleanup_milter.in14c \
        cleanup_milter.reg14c
        cp test-queue-file14 test-queue-file14c.tmp
        chmod u+w test-queue-file14c.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in14c 2>cleanup_milter.tmp1
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in14c 2>cleanup_milter.tmp1
        diff cleanup_milter.ref14c1 cleanup_milter.tmp1
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file14c.tmp 2>/dev/null >cleanup_milter.tmp2
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file14c.tmp 2>/dev/null >cleanup_milter.tmp2
        diff cleanup_milter.ref14c2 cleanup_milter.tmp2
        rm -f test-queue-file14c.tmp cleanup_milter.tmp1 cleanup_milter.tmp2
 
@@ -441,9 +443,9 @@ cleanup_milter_test14d: cleanup_milter test-queue-file14 cleanup_milter.in14d \
        cleanup_milter.reg14d
        cp test-queue-file14 test-queue-file14d.tmp
        chmod u+w test-queue-file14d.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in14d 2>cleanup_milter.tmp1
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in14d 2>cleanup_milter.tmp1
        diff cleanup_milter.ref14d1 cleanup_milter.tmp1
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file14d.tmp 2>/dev/null >cleanup_milter.tmp2
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file14d.tmp 2>/dev/null >cleanup_milter.tmp2
        diff cleanup_milter.ref14d2 cleanup_milter.tmp2
        rm -f test-queue-file14d.tmp cleanup_milter.tmp1 cleanup_milter.tmp2
 
@@ -452,9 +454,9 @@ cleanup_milter_test14e: cleanup_milter test-queue-file14 cleanup_milter.in14e \
        cleanup_milter.reg14e
        cp test-queue-file14 test-queue-file14e.tmp
        chmod u+w test-queue-file14e.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in14e 2>cleanup_milter.tmp1
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in14e 2>cleanup_milter.tmp1
        diff cleanup_milter.ref14e1 cleanup_milter.tmp1
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file14e.tmp 2>/dev/null >cleanup_milter.tmp2
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file14e.tmp 2>/dev/null >cleanup_milter.tmp2
        diff cleanup_milter.ref14e2 cleanup_milter.tmp2
        rm -f test-queue-file14e.tmp cleanup_milter.tmp1 cleanup_milter.tmp2
 
@@ -463,9 +465,9 @@ cleanup_milter_test14f: cleanup_milter test-queue-file14 cleanup_milter.in14f \
        cleanup_milter.reg14f
        cp test-queue-file14 test-queue-file14f.tmp
        chmod u+w test-queue-file14f.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in14f 2>cleanup_milter.tmp1
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in14f 2>cleanup_milter.tmp1
        diff cleanup_milter.ref14f1 cleanup_milter.tmp1
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file14f.tmp 2>/dev/null >cleanup_milter.tmp2
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file14f.tmp 2>/dev/null >cleanup_milter.tmp2
        diff cleanup_milter.ref14f2 cleanup_milter.tmp2
        rm -f test-queue-file14f.tmp cleanup_milter.tmp1 cleanup_milter.tmp2
 
@@ -474,9 +476,9 @@ cleanup_milter_test14g: cleanup_milter test-queue-file14 cleanup_milter.in14g \
        cleanup_milter.reg14g
        cp test-queue-file14 test-queue-file14g.tmp
        chmod u+w test-queue-file14g.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in14g 2>cleanup_milter.tmp1
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in14g 2>cleanup_milter.tmp1
        diff cleanup_milter.ref14g1 cleanup_milter.tmp1
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file14g.tmp 2>/dev/null >cleanup_milter.tmp2
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file14g.tmp 2>/dev/null >cleanup_milter.tmp2
        diff cleanup_milter.ref14g2 cleanup_milter.tmp2
        rm -f test-queue-file14g.tmp cleanup_milter.tmp1 cleanup_milter.tmp2
 
@@ -485,9 +487,9 @@ cleanup_milter_test15a: cleanup_milter test-queue-file15 cleanup_milter.in15a \
        cleanup_milter.reg15a
        cp test-queue-file15 test-queue-file15a.tmp
        chmod u+w test-queue-file15a.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in15a 2>cleanup_milter.tmp1
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in15a 2>cleanup_milter.tmp1
        diff cleanup_milter.ref15a1 cleanup_milter.tmp1
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file15a.tmp 2>/dev/null >cleanup_milter.tmp2
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file15a.tmp 2>/dev/null >cleanup_milter.tmp2
        diff cleanup_milter.ref15a2 cleanup_milter.tmp2
        rm -f test-queue-file15a.tmp cleanup_milter.tmp1 cleanup_milter.tmp2
 
@@ -496,9 +498,9 @@ cleanup_milter_test15b: cleanup_milter test-queue-file15 cleanup_milter.in15b \
        cleanup_milter.reg15b
        cp test-queue-file15 test-queue-file15b.tmp
        chmod u+w test-queue-file15b.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in15b 2>cleanup_milter.tmp1
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in15b 2>cleanup_milter.tmp1
        diff cleanup_milter.ref15b1 cleanup_milter.tmp1
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file15b.tmp 2>/dev/null >cleanup_milter.tmp2
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file15b.tmp 2>/dev/null >cleanup_milter.tmp2
        diff cleanup_milter.ref15b2 cleanup_milter.tmp2
        rm -f test-queue-file15b.tmp cleanup_milter.tmp1 cleanup_milter.tmp2
 
@@ -507,9 +509,9 @@ cleanup_milter_test15c: cleanup_milter test-queue-file15 cleanup_milter.in15c \
        cleanup_milter.reg15c
        cp test-queue-file15 test-queue-file15c.tmp
        chmod u+w test-queue-file15c.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in15c 2>cleanup_milter.tmp1
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in15c 2>cleanup_milter.tmp1
        diff cleanup_milter.ref15c1 cleanup_milter.tmp1
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file15c.tmp 2>/dev/null >cleanup_milter.tmp2
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file15c.tmp 2>/dev/null >cleanup_milter.tmp2
        diff cleanup_milter.ref15c2 cleanup_milter.tmp2
        rm -f test-queue-file15c.tmp cleanup_milter.tmp1 cleanup_milter.tmp2
 
@@ -518,9 +520,9 @@ cleanup_milter_test15d: cleanup_milter test-queue-file15 cleanup_milter.in15d \
        cleanup_milter.reg15d
        cp test-queue-file15 test-queue-file15d.tmp
        chmod u+w test-queue-file15d.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in15d 2>cleanup_milter.tmp1
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in15d 2>cleanup_milter.tmp1
        diff cleanup_milter.ref15d1 cleanup_milter.tmp1
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file15d.tmp 2>/dev/null >cleanup_milter.tmp2
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file15d.tmp 2>/dev/null >cleanup_milter.tmp2
        diff cleanup_milter.ref15d2 cleanup_milter.tmp2
        rm -f test-queue-file15d.tmp cleanup_milter.tmp1 cleanup_milter.tmp2
 
@@ -529,9 +531,9 @@ cleanup_milter_test15e: cleanup_milter test-queue-file15 cleanup_milter.in15e \
        cleanup_milter.reg15e
        cp test-queue-file15 test-queue-file15e.tmp
        chmod u+w test-queue-file15e.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in15e 2>cleanup_milter.tmp1
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in15e 2>cleanup_milter.tmp1
        diff cleanup_milter.ref15e1 cleanup_milter.tmp1
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file15e.tmp 2>/dev/null >cleanup_milter.tmp2
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file15e.tmp 2>/dev/null >cleanup_milter.tmp2
        diff cleanup_milter.ref15e2 cleanup_milter.tmp2
        rm -f test-queue-file15e.tmp cleanup_milter.tmp1 cleanup_milter.tmp2
 
@@ -540,9 +542,9 @@ cleanup_milter_test15f: cleanup_milter test-queue-file15 cleanup_milter.in15f \
        cleanup_milter.reg15f
        cp test-queue-file15 test-queue-file15f.tmp
        chmod u+w test-queue-file15f.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in15f 2>cleanup_milter.tmp1
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in15f 2>cleanup_milter.tmp1
        diff cleanup_milter.ref15f1 cleanup_milter.tmp1
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file15f.tmp 2>/dev/null >cleanup_milter.tmp2
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file15f.tmp 2>/dev/null >cleanup_milter.tmp2
        diff cleanup_milter.ref15f2 cleanup_milter.tmp2
        rm -f test-queue-file15f.tmp cleanup_milter.tmp1 cleanup_milter.tmp2
 
@@ -551,9 +553,9 @@ cleanup_milter_test15g: cleanup_milter test-queue-file15 cleanup_milter.in15g \
        cleanup_milter.reg15g
        cp test-queue-file15 test-queue-file15g.tmp
        chmod u+w test-queue-file15g.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in15g 2>cleanup_milter.tmp1
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in15g 2>cleanup_milter.tmp1
        diff cleanup_milter.ref15g1 cleanup_milter.tmp1
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file15g.tmp 2>/dev/null >cleanup_milter.tmp2
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file15g.tmp 2>/dev/null >cleanup_milter.tmp2
        diff cleanup_milter.ref15g2 cleanup_milter.tmp2
        rm -f test-queue-file15g.tmp cleanup_milter.tmp1 cleanup_milter.tmp2
 
@@ -562,9 +564,9 @@ cleanup_milter_test15h: cleanup_milter test-queue-file15 cleanup_milter.in15h \
        cleanup_milter.reg15h
        cp test-queue-file15 test-queue-file15h.tmp
        chmod u+w test-queue-file15h.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in15h 2>cleanup_milter.tmp1
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in15h 2>cleanup_milter.tmp1
        diff cleanup_milter.ref15h1 cleanup_milter.tmp1
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file15h.tmp 2>/dev/null >cleanup_milter.tmp2
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file15h.tmp 2>/dev/null >cleanup_milter.tmp2
        diff cleanup_milter.ref15h2 cleanup_milter.tmp2
        rm -f test-queue-file15h.tmp cleanup_milter.tmp1 cleanup_milter.tmp2
 
@@ -573,9 +575,9 @@ cleanup_milter_test15i: cleanup_milter test-queue-file15 cleanup_milter.in15i \
        cleanup_milter.reg15i
        cp test-queue-file15 test-queue-file15i.tmp
        chmod u+w test-queue-file15i.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in15i 2>cleanup_milter.tmp1
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in15i 2>cleanup_milter.tmp1
        diff cleanup_milter.ref15i1 cleanup_milter.tmp1
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file15i.tmp 2>/dev/null >cleanup_milter.tmp2
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file15i.tmp 2>/dev/null >cleanup_milter.tmp2
        diff cleanup_milter.ref15i2 cleanup_milter.tmp2
        rm -f test-queue-file15i.tmp cleanup_milter.tmp1 cleanup_milter.tmp2
 
@@ -583,9 +585,9 @@ cleanup_milter_test16a: cleanup_milter test-queue-file16 cleanup_milter.in16a \
        cleanup_milter.ref16a1 ../postcat/postcat cleanup_milter.ref16a2
        cp test-queue-file16 test-queue-file16a.tmp
        chmod u+w test-queue-file16a.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in16a 2>cleanup_milter.tmp1
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in16a 2>cleanup_milter.tmp1
        diff cleanup_milter.ref16a1 cleanup_milter.tmp1
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file16a.tmp 2>/dev/null >cleanup_milter.tmp2
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file16a.tmp 2>/dev/null >cleanup_milter.tmp2
        diff cleanup_milter.ref16a2 cleanup_milter.tmp2
        rm -f test-queue-file16a.tmp cleanup_milter.tmp1 cleanup_milter.tmp2
 
@@ -593,12 +595,82 @@ cleanup_milter_test16b: cleanup_milter test-queue-file16 cleanup_milter.in16b \
        cleanup_milter.ref16b1 ../postcat/postcat cleanup_milter.ref16b2
        cp test-queue-file16 test-queue-file16b.tmp
        chmod u+w test-queue-file16b.tmp
-       $(SHLIB_ENV) ./cleanup_milter <cleanup_milter.in16b 2>cleanup_milter.tmp1
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in16b 2>cleanup_milter.tmp1
        diff cleanup_milter.ref16b1 cleanup_milter.tmp1
-       $(SHLIB_ENV) ../postcat/postcat -ov test-queue-file16b.tmp 2>/dev/null >cleanup_milter.tmp2
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file16b.tmp 2>/dev/null >cleanup_milter.tmp2
        diff cleanup_milter.ref16b2 cleanup_milter.tmp2
        rm -f test-queue-file16b.tmp cleanup_milter.tmp1 cleanup_milter.tmp2
 
+cleanup_milter_test17a: cleanup_milter test-queue-file17 cleanup_milter.in17a \
+       cleanup_milter.ref17a1 ../postcat/postcat cleanup_milter.ref17a2
+       cp test-queue-file17 test-queue-file17a.tmp
+       chmod u+w test-queue-file17a.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in17a 2>cleanup_milter.tmp1
+       diff cleanup_milter.ref17a1 cleanup_milter.tmp1
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file17a.tmp 2>/dev/null >cleanup_milter.tmp2
+       diff cleanup_milter.ref17a2 cleanup_milter.tmp2
+       rm -f test-queue-file17a.tmp cleanup_milter.tmp1 cleanup_milter.tmp2
+
+cleanup_milter_test17b: cleanup_milter test-queue-file17 cleanup_milter.in17b \
+       cleanup_milter.ref17b1 ../postcat/postcat cleanup_milter.ref17b2
+       cp test-queue-file17 test-queue-file17b.tmp
+       chmod u+w test-queue-file17b.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in17b 2>cleanup_milter.tmp1
+       diff cleanup_milter.ref17b1 cleanup_milter.tmp1
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file17b.tmp 2>/dev/null >cleanup_milter.tmp2
+       diff cleanup_milter.ref17b2 cleanup_milter.tmp2
+       rm -f test-queue-file17b.tmp cleanup_milter.tmp1 cleanup_milter.tmp2
+
+cleanup_milter_test17c: cleanup_milter test-queue-file17 cleanup_milter.in17c \
+       cleanup_milter.ref17c1 ../postcat/postcat cleanup_milter.ref17c2
+       cp test-queue-file17 test-queue-file17c.tmp
+       chmod u+w test-queue-file17c.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in17c 2>cleanup_milter.tmp1
+       diff cleanup_milter.ref17c1 cleanup_milter.tmp1
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file17c.tmp 2>/dev/null >cleanup_milter.tmp2
+       diff cleanup_milter.ref17c2 cleanup_milter.tmp2
+       rm -f test-queue-file17c.tmp cleanup_milter.tmp1 cleanup_milter.tmp2
+
+cleanup_milter_test17d: cleanup_milter test-queue-file17 cleanup_milter.in17d \
+       cleanup_milter.ref17d1 ../postcat/postcat cleanup_milter.ref17d2
+       cp test-queue-file17 test-queue-file17d.tmp
+       chmod u+w test-queue-file17d.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in17d 2>cleanup_milter.tmp1
+       diff cleanup_milter.ref17d1 cleanup_milter.tmp1
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file17d.tmp 2>/dev/null >cleanup_milter.tmp2
+       diff cleanup_milter.ref17d2 cleanup_milter.tmp2
+       rm -f test-queue-file17d.tmp cleanup_milter.tmp1 cleanup_milter.tmp2
+
+cleanup_milter_test17e: cleanup_milter test-queue-file17 cleanup_milter.in17e \
+       cleanup_milter.ref17e1 ../postcat/postcat cleanup_milter.ref17e2
+       cp test-queue-file17 test-queue-file17e.tmp
+       chmod u+w test-queue-file17e.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in17e 2>cleanup_milter.tmp1
+       diff cleanup_milter.ref17e1 cleanup_milter.tmp1
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file17e.tmp 2>/dev/null >cleanup_milter.tmp2
+       diff cleanup_milter.ref17e2 cleanup_milter.tmp2
+       rm -f test-queue-file17e.tmp cleanup_milter.tmp1 cleanup_milter.tmp2
+
+cleanup_milter_test17f: cleanup_milter test-queue-file17 cleanup_milter.in17f \
+       cleanup_milter.ref17f1 ../postcat/postcat cleanup_milter.ref17f2
+       cp test-queue-file17 test-queue-file17f.tmp
+       chmod u+w test-queue-file17f.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in17f 2>cleanup_milter.tmp1
+       diff cleanup_milter.ref17f1 cleanup_milter.tmp1
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file17f.tmp 2>/dev/null >cleanup_milter.tmp2
+       diff cleanup_milter.ref17f2 cleanup_milter.tmp2
+       rm -f test-queue-file17f.tmp cleanup_milter.tmp1 cleanup_milter.tmp2
+
+cleanup_milter_test17g: cleanup_milter test-queue-file17 cleanup_milter.in17g \
+       cleanup_milter.ref17g1 ../postcat/postcat cleanup_milter.ref17g2
+       cp test-queue-file17 test-queue-file17g.tmp
+       chmod u+w test-queue-file17g.tmp
+       $(SHLIB_ENV) $(VALGRIND) ./cleanup_milter <cleanup_milter.in17g 2>cleanup_milter.tmp1
+       diff cleanup_milter.ref17g1 cleanup_milter.tmp1
+       $(SHLIB_ENV) $(VALGRIND) ../postcat/postcat -ov test-queue-file17g.tmp 2>/dev/null >cleanup_milter.tmp2
+       diff cleanup_milter.ref17g2 cleanup_milter.tmp2
+       rm -f test-queue-file17g.tmp cleanup_milter.tmp1 cleanup_milter.tmp2
+
 depend: $(MAKES)
        (sed '1,/^# do not edit/!d' Makefile.in; \
        set -e; for i in [a-z][a-z0-9]*.c; do \
index fb0fdaf5a224b448bb60a97640cbc6b33ac4f709..556a508950a6b1b60a2990e3bbce9fd100d9a9f8 100644 (file)
@@ -1803,6 +1803,11 @@ static const char *cleanup_del_rcpt(void *context, const char *ext_rcpt)
                }
                count++;
            }
+           if (var_enable_orcpt)
+               /* Matches been_here() call in cleanup_out_recipient(). */
+               been_here_drop(state->dups, "%s\n%d\n%s\n%s",
+                              dsn_orcpt ? dsn_orcpt : "", dsn_notify,
+                            orig_rcpt ? orig_rcpt : "", STR(int_rcpt_buf));
            /* FALLTHROUGH */
        case REC_TYPE_DRCP:                     /* canceled recipient */
        case REC_TYPE_DONE:                     /* can't happen */
@@ -1818,6 +1823,9 @@ static const char *cleanup_del_rcpt(void *context, const char *ext_rcpt)
            break;
        }
     }
+    /* Matches been_here_fixed() call in cleanup_out_recipient(). */
+    if (var_enable_orcpt == 0 && count > 0)
+       been_here_drop_fixed(state->dups, STR(int_rcpt_buf));
 
     if (msg_verbose)
        msg_info("%s: deleted %d records for recipient \"%s\"",
@@ -2549,6 +2557,18 @@ int     main(int unused_argc, char **argv)
            } else {
                open_queue_file(state, argv->argv[1]);
            }
+       } else if (strcmp(argv->argv[0], "enable_original_recipient") == 0) {
+           if (argv->argc == 1) {
+               msg_info("enable_original_recipient: %d", var_enable_orcpt);
+           } else if (argv->argc != 2) {
+               msg_warn("bad enable_original_recipient argument count: %ld",
+                        (long) argv->argc);
+           } else if (!alldig(argv->argv[1])) {
+               msg_warn("non-numeric enable_original_recipient argument: %s",
+                        argv->argv[1]);
+           } else {
+               var_enable_orcpt = atoi(argv->argv[1]);
+           }
        } else if (state->dst == 0) {
            msg_warn("no open queue file");
        } else if (strcmp(argv->argv[0], "close") == 0) {
diff --git a/postfix/src/cleanup/cleanup_milter.in17a b/postfix/src/cleanup/cleanup_milter.in17a
new file mode 100644 (file)
index 0000000..c7eb361
--- /dev/null
@@ -0,0 +1,9 @@
+#verbose on
+open test-queue-file17a.tmp
+#
+# Delete a recipient. Then add the recipient back.
+
+del_rcpt user@example.com
+add_rcpt user@example.com
+
+close
diff --git a/postfix/src/cleanup/cleanup_milter.in17b b/postfix/src/cleanup/cleanup_milter.in17b
new file mode 100644 (file)
index 0000000..654f9f5
--- /dev/null
@@ -0,0 +1,10 @@
+#verbose on
+open test-queue-file17b.tmp
+#
+# Delete a recipient. Then add the recipient back, with a DSN NOTIFY
+# record instead of a DSN original recipient.
+
+del_rcpt user@example.com
+add_rcpt_par user@example.com NOTIFY=never
+
+close
diff --git a/postfix/src/cleanup/cleanup_milter.in17c b/postfix/src/cleanup/cleanup_milter.in17c
new file mode 100644 (file)
index 0000000..8c34db4
--- /dev/null
@@ -0,0 +1,12 @@
+#verbose on
+open test-queue-file17c.tmp
+#
+# Delete a recipient. Then add the recipient back, with a DSN NOTIFY
+# record instead of a DSN original recipient. Then add the same again.
+# The second command should be ignored as a duplicate.
+
+del_rcpt user@example.com
+add_rcpt_par user@example.com NOTIFY=never
+add_rcpt_par user@example.com NOTIFY=never
+
+close
diff --git a/postfix/src/cleanup/cleanup_milter.in17d b/postfix/src/cleanup/cleanup_milter.in17d
new file mode 100644 (file)
index 0000000..46ac8ff
--- /dev/null
@@ -0,0 +1,18 @@
+#verbose on
+open test-queue-file17d.tmp
+#
+# Delete a recipient. Then add the recipient back, with a DSN NOTIFY
+# record instead of a DSN original recipient. Then add the same again.
+# The second command should be ignored as a duplicate.
+
+del_rcpt user@example.com
+add_rcpt_par user@example.com NOTIFY=never
+add_rcpt_par user@example.com NOTIFY=never
+
+# The above has confirmed that recipient is in the duplicate filter.
+# Now verify that del_rcpt will delete it, and that a subsequent
+# add_rcpt_par will NOT be ignored.
+del_rcpt user@example.com
+add_rcpt_par user@example.com NOTIFY=never
+
+close
diff --git a/postfix/src/cleanup/cleanup_milter.in17e b/postfix/src/cleanup/cleanup_milter.in17e
new file mode 100644 (file)
index 0000000..e2e2546
--- /dev/null
@@ -0,0 +1,12 @@
+#verbose on
+open test-queue-file17e.tmp
+#
+# Delete a recipient. Then add the recipient back.
+
+enable_original_recipient 0
+enable_original_recipient
+
+del_rcpt user@example.com
+add_rcpt user@example.com
+
+close
diff --git a/postfix/src/cleanup/cleanup_milter.in17f b/postfix/src/cleanup/cleanup_milter.in17f
new file mode 100644 (file)
index 0000000..03d85c0
--- /dev/null
@@ -0,0 +1,15 @@
+#verbose on
+open test-queue-file17f.tmp
+#
+# Delete a recipient. Then add the recipient back.
+
+enable_original_recipient 0
+enable_original_recipient
+
+del_rcpt user@example.com
+add_rcpt user@example.com
+
+# Adding the recipient another time should be a NOOP.
+add_rcpt user@example.com
+
+close
diff --git a/postfix/src/cleanup/cleanup_milter.in17g b/postfix/src/cleanup/cleanup_milter.in17g
new file mode 100644 (file)
index 0000000..e7225ec
--- /dev/null
@@ -0,0 +1,23 @@
+#verbose on
+open test-queue-file17g.tmp
+#
+# Delete a recipient. This leaves a deleted recipient in the queue
+# file. Then add the recipient back.
+#
+enable_original_recipient 0
+enable_original_recipient
+
+del_rcpt user@example.com
+add_rcpt user@example.com
+
+# Adding the recipient another time should be a NOOP.
+add_rcpt user@example.com
+
+# Deleting the recipient should remove it from the duplicate filter.
+# This leaves a deleted recipient in the queue file.
+# Therefore adding the recipient will not be a NOOP.
+
+del_rcpt user@example.com
+add_rcpt user@example.com
+
+close
diff --git a/postfix/src/cleanup/cleanup_milter.ref17a1 b/postfix/src/cleanup/cleanup_milter.ref17a1
new file mode 100644 (file)
index 0000000..eab5a83
--- /dev/null
@@ -0,0 +1 @@
+./cleanup_milter: flags = enable_header_body_filter enable_milters
diff --git a/postfix/src/cleanup/cleanup_milter.ref17a2 b/postfix/src/cleanup/cleanup_milter.ref17a2
new file mode 100644 (file)
index 0000000..18037a8
--- /dev/null
@@ -0,0 +1,30 @@
+*** ENVELOPE RECORDS test-queue-file17a.tmp ***
+        0 message_size:             343             215               1               0             343               0
+       97 message_arrival_time: Tue Nov 18 16:43:29 2014
+      116 create_time: Tue Nov 18 16:43:29 2014
+      140 named_attribute: rewrite_context=local
+      163 sender_fullname: Wietse Venema
+      178 sender: user@example.com
+      196 pointer_record:             654
+      654 original_recipient: user@example.com
+      672 recipient: user@example.com
+      690 pointer_record:             213
+      213 *** MESSAGE CONTENTS test-queue-file17a.tmp ***
+      215 regular_text: Received: by host.example.com (Postfix, from userid 1001)
+      274 regular_text:        id 663E22172797; Tue, 18 Nov 2014 16:43:29 -0500 (EST)
+      331 regular_text: To: user@example.com
+      353 regular_text: Subject: test
+      368 padding: 0
+      371 regular_text: Message-Id: <20141118214329.663E22172797@host.example.com>
+      431 regular_text: Date: Tue, 18 Nov 2014 16:43:29 -0500 (EST)
+      476 regular_text: From: user@example.com (Wietse Venema)
+      516 pointer_record:               0
+      533 regular_text: 
+      535 regular_text: test
+      541 pointer_record:               0
+      558 *** HEADER EXTRACTED test-queue-file17a.tmp ***
+      560 pointer_record:               0
+      577 named_attribute: dsn_orig_rcpt=rfc822;user@example.com
+      616 original_recipient: user@example.com
+      634 canceled_recipient: user@example.com
+      652 *** MESSAGE FILE END test-queue-file17a.tmp ***
diff --git a/postfix/src/cleanup/cleanup_milter.ref17b1 b/postfix/src/cleanup/cleanup_milter.ref17b1
new file mode 100644 (file)
index 0000000..eab5a83
--- /dev/null
@@ -0,0 +1 @@
+./cleanup_milter: flags = enable_header_body_filter enable_milters
diff --git a/postfix/src/cleanup/cleanup_milter.ref17b2 b/postfix/src/cleanup/cleanup_milter.ref17b2
new file mode 100644 (file)
index 0000000..4df043d
--- /dev/null
@@ -0,0 +1,31 @@
+*** ENVELOPE RECORDS test-queue-file17b.tmp ***
+        0 message_size:             343             215               1               0             343               0
+       97 message_arrival_time: Tue Nov 18 16:43:29 2014
+      116 create_time: Tue Nov 18 16:43:29 2014
+      140 named_attribute: rewrite_context=local
+      163 sender_fullname: Wietse Venema
+      178 sender: user@example.com
+      196 pointer_record:             654
+      654 named_attribute: notify_flags=1
+      670 original_recipient: user@example.com
+      688 recipient: user@example.com
+      706 pointer_record:             213
+      213 *** MESSAGE CONTENTS test-queue-file17b.tmp ***
+      215 regular_text: Received: by host.example.com (Postfix, from userid 1001)
+      274 regular_text:        id 663E22172797; Tue, 18 Nov 2014 16:43:29 -0500 (EST)
+      331 regular_text: To: user@example.com
+      353 regular_text: Subject: test
+      368 padding: 0
+      371 regular_text: Message-Id: <20141118214329.663E22172797@host.example.com>
+      431 regular_text: Date: Tue, 18 Nov 2014 16:43:29 -0500 (EST)
+      476 regular_text: From: user@example.com (Wietse Venema)
+      516 pointer_record:               0
+      533 regular_text: 
+      535 regular_text: test
+      541 pointer_record:               0
+      558 *** HEADER EXTRACTED test-queue-file17b.tmp ***
+      560 pointer_record:               0
+      577 named_attribute: dsn_orig_rcpt=rfc822;user@example.com
+      616 original_recipient: user@example.com
+      634 canceled_recipient: user@example.com
+      652 *** MESSAGE FILE END test-queue-file17b.tmp ***
diff --git a/postfix/src/cleanup/cleanup_milter.ref17c1 b/postfix/src/cleanup/cleanup_milter.ref17c1
new file mode 100644 (file)
index 0000000..eab5a83
--- /dev/null
@@ -0,0 +1 @@
+./cleanup_milter: flags = enable_header_body_filter enable_milters
diff --git a/postfix/src/cleanup/cleanup_milter.ref17c2 b/postfix/src/cleanup/cleanup_milter.ref17c2
new file mode 100644 (file)
index 0000000..509af41
--- /dev/null
@@ -0,0 +1,31 @@
+*** ENVELOPE RECORDS test-queue-file17c.tmp ***
+        0 message_size:             343             215               1               0             343               0
+       97 message_arrival_time: Tue Nov 18 16:43:29 2014
+      116 create_time: Tue Nov 18 16:43:29 2014
+      140 named_attribute: rewrite_context=local
+      163 sender_fullname: Wietse Venema
+      178 sender: user@example.com
+      196 pointer_record:             654
+      654 named_attribute: notify_flags=1
+      670 original_recipient: user@example.com
+      688 recipient: user@example.com
+      706 pointer_record:             213
+      213 *** MESSAGE CONTENTS test-queue-file17c.tmp ***
+      215 regular_text: Received: by host.example.com (Postfix, from userid 1001)
+      274 regular_text:        id 663E22172797; Tue, 18 Nov 2014 16:43:29 -0500 (EST)
+      331 regular_text: To: user@example.com
+      353 regular_text: Subject: test
+      368 padding: 0
+      371 regular_text: Message-Id: <20141118214329.663E22172797@host.example.com>
+      431 regular_text: Date: Tue, 18 Nov 2014 16:43:29 -0500 (EST)
+      476 regular_text: From: user@example.com (Wietse Venema)
+      516 pointer_record:               0
+      533 regular_text: 
+      535 regular_text: test
+      541 pointer_record:               0
+      558 *** HEADER EXTRACTED test-queue-file17c.tmp ***
+      560 pointer_record:               0
+      577 named_attribute: dsn_orig_rcpt=rfc822;user@example.com
+      616 original_recipient: user@example.com
+      634 canceled_recipient: user@example.com
+      652 *** MESSAGE FILE END test-queue-file17c.tmp ***
diff --git a/postfix/src/cleanup/cleanup_milter.ref17d1 b/postfix/src/cleanup/cleanup_milter.ref17d1
new file mode 100644 (file)
index 0000000..eab5a83
--- /dev/null
@@ -0,0 +1 @@
+./cleanup_milter: flags = enable_header_body_filter enable_milters
diff --git a/postfix/src/cleanup/cleanup_milter.ref17d2 b/postfix/src/cleanup/cleanup_milter.ref17d2
new file mode 100644 (file)
index 0000000..846ac33
--- /dev/null
@@ -0,0 +1,35 @@
+*** ENVELOPE RECORDS test-queue-file17d.tmp ***
+        0 message_size:             343             215               1               0             343               0
+       97 message_arrival_time: Tue Nov 18 16:43:29 2014
+      116 create_time: Tue Nov 18 16:43:29 2014
+      140 named_attribute: rewrite_context=local
+      163 sender_fullname: Wietse Venema
+      178 sender: user@example.com
+      196 pointer_record:             654
+      654 named_attribute: notify_flags=1
+      670 original_recipient: user@example.com
+      688 canceled_recipient: user@example.com
+      706 pointer_record:             723
+      723 named_attribute: notify_flags=1
+      739 original_recipient: user@example.com
+      757 recipient: user@example.com
+      775 pointer_record:             213
+      213 *** MESSAGE CONTENTS test-queue-file17d.tmp ***
+      215 regular_text: Received: by host.example.com (Postfix, from userid 1001)
+      274 regular_text:        id 663E22172797; Tue, 18 Nov 2014 16:43:29 -0500 (EST)
+      331 regular_text: To: user@example.com
+      353 regular_text: Subject: test
+      368 padding: 0
+      371 regular_text: Message-Id: <20141118214329.663E22172797@host.example.com>
+      431 regular_text: Date: Tue, 18 Nov 2014 16:43:29 -0500 (EST)
+      476 regular_text: From: user@example.com (Wietse Venema)
+      516 pointer_record:               0
+      533 regular_text: 
+      535 regular_text: test
+      541 pointer_record:               0
+      558 *** HEADER EXTRACTED test-queue-file17d.tmp ***
+      560 pointer_record:               0
+      577 named_attribute: dsn_orig_rcpt=rfc822;user@example.com
+      616 original_recipient: user@example.com
+      634 canceled_recipient: user@example.com
+      652 *** MESSAGE FILE END test-queue-file17d.tmp ***
diff --git a/postfix/src/cleanup/cleanup_milter.ref17e1 b/postfix/src/cleanup/cleanup_milter.ref17e1
new file mode 100644 (file)
index 0000000..b78b1a2
--- /dev/null
@@ -0,0 +1,2 @@
+./cleanup_milter: enable_original_recipient: 0
+./cleanup_milter: flags = enable_header_body_filter enable_milters
diff --git a/postfix/src/cleanup/cleanup_milter.ref17e2 b/postfix/src/cleanup/cleanup_milter.ref17e2
new file mode 100644 (file)
index 0000000..7e523f6
--- /dev/null
@@ -0,0 +1,30 @@
+*** ENVELOPE RECORDS test-queue-file17e.tmp ***
+        0 message_size:             343             215               1               0             343               0
+       97 message_arrival_time: Tue Nov 18 16:43:29 2014
+      116 create_time: Tue Nov 18 16:43:29 2014
+      140 named_attribute: rewrite_context=local
+      163 sender_fullname: Wietse Venema
+      178 sender: user@example.com
+      196 pointer_record:             654
+      654 original_recipient: user@example.com
+      672 recipient: user@example.com
+      690 pointer_record:             213
+      213 *** MESSAGE CONTENTS test-queue-file17e.tmp ***
+      215 regular_text: Received: by host.example.com (Postfix, from userid 1001)
+      274 regular_text:        id 663E22172797; Tue, 18 Nov 2014 16:43:29 -0500 (EST)
+      331 regular_text: To: user@example.com
+      353 regular_text: Subject: test
+      368 padding: 0
+      371 regular_text: Message-Id: <20141118214329.663E22172797@host.example.com>
+      431 regular_text: Date: Tue, 18 Nov 2014 16:43:29 -0500 (EST)
+      476 regular_text: From: user@example.com (Wietse Venema)
+      516 pointer_record:               0
+      533 regular_text: 
+      535 regular_text: test
+      541 pointer_record:               0
+      558 *** HEADER EXTRACTED test-queue-file17e.tmp ***
+      560 pointer_record:               0
+      577 named_attribute: dsn_orig_rcpt=rfc822;user@example.com
+      616 original_recipient: user@example.com
+      634 canceled_recipient: user@example.com
+      652 *** MESSAGE FILE END test-queue-file17e.tmp ***
diff --git a/postfix/src/cleanup/cleanup_milter.ref17f1 b/postfix/src/cleanup/cleanup_milter.ref17f1
new file mode 100644 (file)
index 0000000..b78b1a2
--- /dev/null
@@ -0,0 +1,2 @@
+./cleanup_milter: enable_original_recipient: 0
+./cleanup_milter: flags = enable_header_body_filter enable_milters
diff --git a/postfix/src/cleanup/cleanup_milter.ref17f2 b/postfix/src/cleanup/cleanup_milter.ref17f2
new file mode 100644 (file)
index 0000000..ce18591
--- /dev/null
@@ -0,0 +1,30 @@
+*** ENVELOPE RECORDS test-queue-file17f.tmp ***
+        0 message_size:             343             215               1               0             343               0
+       97 message_arrival_time: Tue Nov 18 16:43:29 2014
+      116 create_time: Tue Nov 18 16:43:29 2014
+      140 named_attribute: rewrite_context=local
+      163 sender_fullname: Wietse Venema
+      178 sender: user@example.com
+      196 pointer_record:             654
+      654 original_recipient: user@example.com
+      672 recipient: user@example.com
+      690 pointer_record:             213
+      213 *** MESSAGE CONTENTS test-queue-file17f.tmp ***
+      215 regular_text: Received: by host.example.com (Postfix, from userid 1001)
+      274 regular_text:        id 663E22172797; Tue, 18 Nov 2014 16:43:29 -0500 (EST)
+      331 regular_text: To: user@example.com
+      353 regular_text: Subject: test
+      368 padding: 0
+      371 regular_text: Message-Id: <20141118214329.663E22172797@host.example.com>
+      431 regular_text: Date: Tue, 18 Nov 2014 16:43:29 -0500 (EST)
+      476 regular_text: From: user@example.com (Wietse Venema)
+      516 pointer_record:               0
+      533 regular_text: 
+      535 regular_text: test
+      541 pointer_record:               0
+      558 *** HEADER EXTRACTED test-queue-file17f.tmp ***
+      560 pointer_record:               0
+      577 named_attribute: dsn_orig_rcpt=rfc822;user@example.com
+      616 original_recipient: user@example.com
+      634 canceled_recipient: user@example.com
+      652 *** MESSAGE FILE END test-queue-file17f.tmp ***
diff --git a/postfix/src/cleanup/cleanup_milter.ref17g1 b/postfix/src/cleanup/cleanup_milter.ref17g1
new file mode 100644 (file)
index 0000000..b78b1a2
--- /dev/null
@@ -0,0 +1,2 @@
+./cleanup_milter: enable_original_recipient: 0
+./cleanup_milter: flags = enable_header_body_filter enable_milters
diff --git a/postfix/src/cleanup/cleanup_milter.ref17g2 b/postfix/src/cleanup/cleanup_milter.ref17g2
new file mode 100644 (file)
index 0000000..938eeed
--- /dev/null
@@ -0,0 +1,33 @@
+*** ENVELOPE RECORDS test-queue-file17g.tmp ***
+        0 message_size:             343             215               1               0             343               0
+       97 message_arrival_time: Tue Nov 18 16:43:29 2014
+      116 create_time: Tue Nov 18 16:43:29 2014
+      140 named_attribute: rewrite_context=local
+      163 sender_fullname: Wietse Venema
+      178 sender: user@example.com
+      196 pointer_record:             654
+      654 original_recipient: user@example.com
+      672 canceled_recipient: user@example.com
+      690 pointer_record:             707
+      707 original_recipient: user@example.com
+      725 recipient: user@example.com
+      743 pointer_record:             213
+      213 *** MESSAGE CONTENTS test-queue-file17g.tmp ***
+      215 regular_text: Received: by host.example.com (Postfix, from userid 1001)
+      274 regular_text:        id 663E22172797; Tue, 18 Nov 2014 16:43:29 -0500 (EST)
+      331 regular_text: To: user@example.com
+      353 regular_text: Subject: test
+      368 padding: 0
+      371 regular_text: Message-Id: <20141118214329.663E22172797@host.example.com>
+      431 regular_text: Date: Tue, 18 Nov 2014 16:43:29 -0500 (EST)
+      476 regular_text: From: user@example.com (Wietse Venema)
+      516 pointer_record:               0
+      533 regular_text: 
+      535 regular_text: test
+      541 pointer_record:               0
+      558 *** HEADER EXTRACTED test-queue-file17g.tmp ***
+      560 pointer_record:               0
+      577 named_attribute: dsn_orig_rcpt=rfc822;user@example.com
+      616 original_recipient: user@example.com
+      634 canceled_recipient: user@example.com
+      652 *** MESSAGE FILE END test-queue-file17g.tmp ***
index 40735e2c6790dadf74d0103b82d3137c2eaf07b6..5e965fa67134097b981a7e2531accb3fdf03b38d 100644 (file)
@@ -155,6 +155,7 @@ void    cleanup_out_recipient(CLEANUP_STATE *state,
 
     if ((state->flags & CLEANUP_FLAG_MAP_OK) == 0
        || cleanup_virt_alias_maps == 0) {
+       /* Matches been_here_drop{,_fixed}() calls cleanup_del_rcpt(). */
        if ((var_enable_orcpt ?
             been_here(state->dups, "%s\n%d\n%s\n%s",
                       dsn_orcpt, dsn_notify, orcpt, recip) :
diff --git a/postfix/src/cleanup/test-queue-file17 b/postfix/src/cleanup/test-queue-file17
new file mode 100644 (file)
index 0000000..3f7c5f3
Binary files /dev/null and b/postfix/src/cleanup/test-queue-file17 differ
index 44bb046fd0b919f616784e04546524b00d148652..db43f845bbe6f7635b9332c79d3b243861a5ea76 100644 (file)
@@ -125,7 +125,7 @@ TESTPROG= domain_list dot_lockfile mail_addr_crunch mail_addr_find \
        data_redirect addr_match_list safe_ultostr verify_sender_addr \
        mail_version mail_dict server_acl uxtext mail_parm_split \
        fold_addr smtp_reply_footer mail_addr_map normalize_mailhost_addr \
-       haproxy_srvr map_search
+       haproxy_srvr map_search delivered_hdr
 
 LIBS   = ../../lib/lib$(LIB_PREFIX)util$(LIB_SUFFIX)
 LIB_DIR        = ../../lib
@@ -393,6 +393,9 @@ haproxy_srvr: haproxy_srvr.c $(LIB) $(LIBS)
 map_search: map_search.c $(LIB) $(LIBS)
        $(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
 
+delivered_hdr: delivered_hdr.c $(LIB) $(LIBS)
+       $(CC) $(CFLAGS) -DTEST -o $@ $@.c $(LIB) $(LIBS) $(SYSLIBS)
+
 tests: tok822_test mime_tests strip_addr_test tok822_limit_test \
        xtext_test scache_multi_test ehlo_mask_test \
        namadr_list_test mail_conf_time_test header_body_checks_tests \
@@ -400,7 +403,8 @@ tests: tok822_test mime_tests strip_addr_test tok822_limit_test \
        safe_ultostr_test mail_parm_split_test fold_addr_test \
        smtp_reply_footer_test off_cvt_test mail_addr_crunch_test \
        mail_addr_find_test mail_addr_map_test quote_822_local_test \
-       normalize_mailhost_addr_test haproxy_srvr_test map_search_test
+       normalize_mailhost_addr_test haproxy_srvr_test map_search_test \
+       delivered_hdr_test
 
 mime_tests: mime_test mime_nest mime_8bit mime_dom mime_trunc mime_cvt \
        mime_cvt2 mime_cvt3 mime_garb1 mime_garb2 mime_garb3 mime_garb4
@@ -728,6 +732,11 @@ map_search_test: update map_search map_search.ref
        diff map_search.ref map_search.tmp
        rm -f map_search.tmp
 
+delivered_hdr_test: update delivered_hdr delivered_hdr.ref
+       -$(SHLIB_ENV) $(VALGRIND) ./delivered_hdr >delivered_hdr.tmp 2>&1
+       diff delivered_hdr.ref delivered_hdr.tmp
+       rm -f delivered_hdr.tmp
+
 printfck: $(OBJS) $(PROG)
        rm -rf printfck
        mkdir printfck
index 9390c8e854b7d4656b8cfc673cc733aea508c91f..8147829c485ea9c81470994391940b3329e8837f 100644 (file)
 /*     BH_TABLE *dup_filter;
 /*     char    *format;
 /*
+/*     int     been_here_drop_fixed(dup_filter, string)
+/*     BH_TABLE *dup_filter;
+/*     char    *string;
+/*
+/*     int     been_here_drop(dup_filter, format, ...)
+/*     BH_TABLE *dup_filter;
+/*     char    *format;
+/*
 /*     void    been_here_free(dup_filter)
 /*     BH_TABLE *dup_filter;
 /* DESCRIPTION
 /*     been_here_check_fixed() and been_here_check() are similar
 /*     but do not update the duplicate filter.
 /*
+/*     been_here_drop_fixed() looks up a fixed string in the given
+/*     table, and deletes the entry if the string was found. The
+/*     result is non-zero (true) if the string was found, zero
+/*     (false) otherwise.
+/*
+/*     been_here_drop() formats its arguments, looks up the result
+/*     in the given table, and removes the entry if the formatted
+/*     result was found. The result is non-zero (true) if the
+/*     formatted result was found, zero (false) otherwise.
+/*
 /*     been_here_free() releases storage for a duplicate filter.
 /*
 /*     Arguments:
@@ -249,3 +267,64 @@ int     been_here_check_fixed(BH_TABLE *dup_filter, const char *string)
 
     return (status);
 }
+
+/* been_here_drop - remove filter entry with finer control */
+
+int     been_here_drop(BH_TABLE *dup_filter, const char *fmt,...)
+{
+    VSTRING *buf = vstring_alloc(100);
+    int     status;
+    va_list ap;
+
+    /*
+     * Construct the string to be dropped.
+     */
+    va_start(ap, fmt);
+    vstring_vsprintf(buf, fmt, ap);
+    va_end(ap);
+
+    /*
+     * Drop the filter entry.
+     */
+    status = been_here_drop_fixed(dup_filter, vstring_str(buf));
+
+    /*
+     * Cleanup.
+     */
+    vstring_free(buf);
+    return (status);
+}
+
+/* been_here_drop_fixed - remove filter entry */
+
+int     been_here_drop_fixed(BH_TABLE *dup_filter, const char *string)
+{
+    VSTRING *folded_string;
+    const char *lookup_key;
+    int     status;
+
+    /*
+     * Special processing: case insensitive lookup.
+     */
+    if (dup_filter->flags & BH_FLAG_FOLD) {
+       folded_string = vstring_alloc(100);
+       lookup_key = casefold(folded_string, string);
+    } else {
+       folded_string = 0;
+       lookup_key = string;
+    }
+
+    /*
+     * Drop the filter entry.
+     */
+    if ((status = been_here_check_fixed(dup_filter, lookup_key)) != 0)
+       htable_delete(dup_filter->table, lookup_key, (void (*) (void *)) 0);
+
+    /*
+     * Cleanup.
+     */
+    if (folded_string)
+       vstring_free(folded_string);
+
+    return (status);
+}
index 2c13894f6498fc9420820c28c92de4bf6454baf5..460191389452762d885a5e8a42a88238abb19399 100644 (file)
@@ -35,6 +35,8 @@ extern int been_here_fixed(BH_TABLE *, const char *);
 extern int PRINTFLIKE(2, 3) been_here(BH_TABLE *, const char *,...);
 extern int been_here_check_fixed(BH_TABLE *, const char *);
 extern int PRINTFLIKE(2, 3) been_here_check(BH_TABLE *, const char *,...);
+extern int been_here_drop_fixed(BH_TABLE *, const char *);
+extern int PRINTFLIKE(2, 3) been_here_drop(BH_TABLE *, const char *,...);
 
 /* LICENSE
 /* .ad
index 5a0b6f2635abb7a44f3fdd7236fe6467bd77483e..d86c9e7c2f5f25d7122a5934b7af65bc95f2b948 100644 (file)
@@ -115,6 +115,8 @@ DELIVERED_HDR_INFO *delivered_hdr_init(VSTREAM *fp, off_t offset, int flags)
     char   *cp;
     DELIVERED_HDR_INFO *info;
     const HEADER_OPTS *hdr;
+    int     curr_type;
+    int     prev_type;
 
     /*
      * Sanity check.
@@ -130,15 +132,20 @@ DELIVERED_HDR_INFO *delivered_hdr_init(VSTREAM *fp, off_t offset, int flags)
 
     /*
      * XXX Assume that mail_copy() produces delivered-to headers that fit in
-     * a REC_TYPE_NORM record. Lowercase the delivered-to addresses for
-     * consistency.
+     * a REC_TYPE_NORM or REC_TYPE_CONT record. Lowercase the delivered-to
+     * addresses for consistency.
      * 
      * XXX Don't get bogged down by gazillions of delivered-to headers.
      */
 #define DELIVERED_HDR_LIMIT    1000
 
-    while (rec_get(fp, info->buf, 0) == REC_TYPE_NORM
-          && info->table->used < DELIVERED_HDR_LIMIT) {
+    for (prev_type = REC_TYPE_NORM;
+        info->table->used < DELIVERED_HDR_LIMIT
+        && ((curr_type = rec_get(fp, info->buf, 0)) == REC_TYPE_NORM
+            || curr_type == REC_TYPE_CONT);
+        prev_type = curr_type) {
+       if (prev_type != REC_TYPE_NORM)
+           continue;
        if (is_header(STR(info->buf))) {
            if ((hdr = header_opts_find(STR(info->buf))) != 0
                && hdr->type == HDR_DELIVERED_TO) {
@@ -186,3 +193,69 @@ void    delivered_hdr_free(DELIVERED_HDR_INFO *info)
     htable_free(info->table, (void (*) (void *)) 0);
     myfree((void *) info);
 }
+
+#ifdef TEST
+
+#include <msg_vstream.h>
+#include <mail_params.h>
+
+char   *var_drop_hdrs;
+
+int     main(int arc, char **argv)
+{
+
+    /*
+     * We write test records to a VSTRING, then read with delivered_hdr_init.
+     */
+    VSTRING *mem_bp;
+    VSTREAM *mem_fp;
+    DELIVERED_HDR_INFO *dp;
+    struct test_case {
+       int     rec_type;
+       const char *content;
+       int     expect_find;
+    };
+    const struct test_case test_cases[] = {
+       REC_TYPE_CONT, "Delivered-To: one", 1,
+       REC_TYPE_NORM, "Delivered-To: two", 0,
+       REC_TYPE_NORM, "Delivered-To: three", 1,
+       0,
+    };
+    const struct test_case *tp;
+    int     actual_find;
+    int     errors;
+
+    msg_vstream_init(argv[0], VSTREAM_ERR);
+
+    var_drop_hdrs = mystrdup(DEF_DROP_HDRS);
+
+    mem_bp = vstring_alloc(VSTREAM_BUFSIZE);
+    if ((mem_fp = vstream_memopen(mem_bp, O_WRONLY)) == 0)
+       msg_panic("vstream_memopen O_WRONLY failed: %m");
+
+#define REC_PUT_LIT(fp, type, lit) rec_put((fp), (type), (lit), strlen(lit))
+
+    for (tp = test_cases; tp->content != 0; tp++)
+       REC_PUT_LIT(mem_fp, tp->rec_type, tp->content);
+
+    if (vstream_fclose(mem_fp))
+       msg_panic("vstream_fclose fail: %m");
+
+    if ((mem_fp = vstream_memopen(mem_bp, O_RDONLY)) == 0)
+       msg_panic("vstream_memopen O_RDONLY failed: %m");
+
+    dp = delivered_hdr_init(mem_fp, 0, FOLD_ADDR_ALL);
+
+    for (errors = 0, tp = test_cases; tp->content != 0; tp++) {
+       actual_find =
+           delivered_hdr_find(dp, tp->content + sizeof("Delivered-To:"));
+       msg_info("test case: %c >%s<: %s (expected: %s)",
+                tp->rec_type, tp->content,
+                actual_find == tp->expect_find ? "PASS" : "FAIL",
+                tp->expect_find ? "MATCH" : "NO MATCH");
+       errors += (actual_find != tp->expect_find);;
+    }
+    exit(errors);
+}
+
+#endif
diff --git a/postfix/src/global/delivered_hdr.ref b/postfix/src/global/delivered_hdr.ref
new file mode 100644 (file)
index 0000000..1e71d57
--- /dev/null
@@ -0,0 +1,3 @@
+./delivered_hdr: test case: L >Delivered-To: one<: PASS (expected: MATCH)
+./delivered_hdr: test case: N >Delivered-To: two<: PASS (expected: NO MATCH)
+./delivered_hdr: test case: N >Delivered-To: three<: PASS (expected: MATCH)
index f6ce1d215f637c910ed31fa1006ff02e193470c2..129950725efb410b0050db70b05ffc4bda5534ee 100644 (file)
@@ -20,7 +20,7 @@
   * Patches change both the patchlevel and the release date. Snapshots have no
   * patchlevel; they change the release date only.
   */
-#define MAIL_RELEASE_DATE      "20200920"
+#define MAIL_RELEASE_DATE      "20200925"
 #define MAIL_VERSION_NUMBER    "3.6"
 
 #ifdef SNAPSHOT
index d2815bee76d9d0ca1c4baa1646c98d4e7ff7e40c..4a5bee332b9afd2af5a37c4b9abd22266bcc653e 100644 (file)
@@ -938,22 +938,22 @@ vbuf_print_test: vbuf_print vbuf_print_test.in vbuf_print_test.ref
        rm -f vbuf_print_test.tmp
 
 dict_union_test: dict_open dict_union_test.in dict_union_test.ref
-        $(SHLIB_ENV) sh -x dict_union_test.in >dict_union_test.tmp 2>&1
+       $(SHLIB_ENV) ${VALGRIND} sh -x dict_union_test.in >dict_union_test.tmp 2>&1
        diff dict_union_test.ref dict_union_test.tmp
        rm -f dict_union_test.tmp
 
 dict_pipe_test: dict_open dict_pipe_test.in dict_pipe_test.ref
-        $(SHLIB_ENV) sh -x dict_pipe_test.in >dict_pipe_test.tmp 2>&1
+       $(SHLIB_ENV) ${VALGRIND} sh -x dict_pipe_test.in >dict_pipe_test.tmp 2>&1
        diff dict_pipe_test.ref dict_pipe_test.tmp
        rm -f dict_pipe_test.tmp
 
 vstring_test: dict_open vstring vstring_test.ref
-        $(SHLIB_ENV) ./vstring one two three >vstring_test.tmp 2>&1
+       $(SHLIB_ENV) ${VALGRIND} ./vstring one two three >vstring_test.tmp 2>&1
        diff vstring_test.ref vstring_test.tmp
        rm -f vstring_test.tmp
 
-vstream_test: dict_open vstream vstream_test.in vstream_test.ref
-       $(SHLIB_ENV) ./vstream <vstream_test.in >vstream_test.tmp 2>&1
+vstream_test: vstream vstream_test.in vstream_test.ref
+       $(SHLIB_ENV) ${VALGRIND} ./vstream <vstream_test.in >vstream_test.tmp 2>&1
        diff vstream_test.ref vstream_test.tmp
        rm -f vstream_test.tmp
 
index d63489bacfaf5f6bbcd20a01d1c9322e82d6c2e2..2869b7e9f3fad2b328354b28c1e242f3e9bd64b9 100644 (file)
@@ -684,6 +684,8 @@ static void vstream_buf_alloc(VBUF *bp, ssize_t len)
      */
     bp->data = (unsigned char *)
        (bp->data ? myrealloc((void *) bp->data, len) : mymalloc(len));
+    if (bp->flags & VSTREAM_FLAG_MEMORY)
+       memset(bp->data + bp->len, 0, len - bp->len);
     bp->len = len;
     if (bp->flags & VSTREAM_FLAG_READ) {
        bp->ptr = bp->data + used;
@@ -1148,25 +1150,25 @@ off_t   vstream_fseek(VSTREAM *stream, off_t offset, int whence)
 
     /*
      * TODO: support data length (data length != buffer length). Without data
-     * length information, vstream_fseek() would break vstream_fflush() for
-     * memory streams.
+     * length information, Without explicit data length information,
+     * vstream_memopen(O_RDONLY) has to set the VSTREAM buffer length to the
+     * vstring payload length to avoid accessing unwritten data after
+     * vstream_fseek(), because for lseek() compatibility, vstream_fseek()
+     * must allow seeking past the end of a file.
      */
     if (stream->buf.flags & VSTREAM_FLAG_MEMORY) {
-#ifdef PENDING_VSTREAM_FSEEK_FOR_MEMORY
        if (whence == SEEK_CUR)
            offset += (bp->ptr - bp->data);
        else if (whence == SEEK_END)
            offset += bp->len;
-       if (offset < 0 || offset > bp->data_len) {
+       if (offset < 0) {
            errno = EINVAL;
            return (-1);
        }
+       if (offset > bp->len && (bp->flags & VSTREAM_FLAG_WRITE))
+           vstream_buf_space(bp, offset - bp->len);
        VSTREAM_BUF_AT_OFFSET(bp, offset);
        return (offset);
-#else
-       errno = EOPNOTSUPP;
-       return (-1);
-#endif
     }
 
     /*
@@ -1351,9 +1353,10 @@ int     vstream_fflush(VSTREAM *stream)
 
     /*
      * With VSTRING, the write pointer must be positioned behind the end of
-     * data. Without knowing the actual data length, VSTREAM can't support
-     * vstream_fseek() for memory streams, because vstream_fflush() would
-     * leave the VSTRING in a broken state.
+     * data. But vstream_fseek() changes the write position, and causes the
+     * data length to be forgotten. Before flushing to vstream, remember the
+     * current write position, move the write pointer and do what needs to be
+     * done, then move the write pointer back to the saved location.
      */
     if (stream->buf.flags & VSTREAM_FLAG_MEMORY) {
        if (stream->buf.flags & VSTREAM_FLAG_WRITE) {
@@ -1363,6 +1366,7 @@ int     vstream_fflush(VSTREAM *stream)
            VSTREAM_BUF_AT_OFFSET(&stream->buf, stream->buf.data_len);
 #endif
            memcpy(&string->vbuf, &stream->buf, sizeof(stream->buf));
+           string->vbuf.flags &= VSTRING_FLAG_MASK;
            VSTRING_TERMINATE(string);
        }
        return (0);
@@ -1770,6 +1774,7 @@ VSTREAM *vstream_memreopen(VSTREAM *stream, VSTRING *string, int flags)
     switch (VSTREAM_ACC_MASK(flags)) {
     case O_RDONLY:
        stream->buf.flags |= VSTREAM_FLAG_READ;
+       /* Prevent reading unwritten data after vstream_fseek(). */
        stream->buf.len = stream->buf.ptr - stream->buf.data;
        VSTREAM_BUF_AT_OFFSET(&stream->buf, 0);
        break;
@@ -1779,7 +1784,8 @@ VSTREAM *vstream_memreopen(VSTREAM *stream, VSTRING *string, int flags)
        break;
     case O_APPEND:
        stream->buf.flags |= VSTREAM_FLAG_WRITE;
-       VSTREAM_BUF_AT_END(&stream->buf);
+       VSTREAM_BUF_AT_OFFSET(&stream->buf,
+                             stream->buf.ptr - stream->buf.data);
        break;
     default:
        msg_panic("vstream_memopen: flags must be one of "
@@ -1794,6 +1800,14 @@ static void copy_line(ssize_t bufsize)
 {
     int     c;
 
+    /*
+     * Demonstrates that VSTREAM_CTL_BUFSIZE increases the buffer size, but
+     * does not decrease it. Uses VSTREAM_ERR for non-test output to avoid
+     * interfering with the test.
+     */
+    vstream_fprintf(VSTREAM_ERR, "buffer size test: copy text with %ld buffer size, ignore requests to shrink\n",
+                   (long) bufsize);
+    vstream_fflush(VSTREAM_ERR);
     vstream_control(VSTREAM_IN, CA_VSTREAM_CTL_BUFSIZE(bufsize), VSTREAM_CTL_END);
     vstream_control(VSTREAM_OUT, CA_VSTREAM_CTL_BUFSIZE(bufsize), VSTREAM_CTL_END);
     while ((c = VSTREAM_GETC(VSTREAM_IN)) != VSTREAM_EOF) {
@@ -1802,59 +1816,141 @@ static void copy_line(ssize_t bufsize)
            break;
     }
     vstream_fflush(VSTREAM_OUT);
+    vstream_fprintf(VSTREAM_ERR, "actual read/write buffer sizes: %ld/%ld\n\n",
+                   (long) VSTREAM_IN->buf.len, (long) VSTREAM_OUT->buf.len);
+    vstream_fflush(VSTREAM_ERR);
 }
 
 static void printf_number(void)
 {
-    vstream_printf("%d\n", 1234567890);
+
+    /*
+     * Demonstrates that vstream_printf() use vbuf_print().
+     */
+    vstream_printf("formatting test: print a number\n");
+    vstream_printf("%d\n\n", 1234567890);
     vstream_fflush(VSTREAM_OUT);
 }
 
 static void do_memory_stream(void)
 {
     VSTRING *buf = vstring_alloc(1);
-    VSTREAM *fp = vstream_memopen(buf, O_WRONLY);
-
-#ifdef PENDING_VSTREAM_FSEEK_FOR_MEMORY
+    VSTREAM *fp;
     off_t   offset;
-
-#endif
     int     ch;
 
-    vstream_fprintf(fp, "hallo world\n");
+    /*
+     * Preload the string.
+     */
+    vstream_printf("memory stream test prep: prefill the VSTRING\n");
+    vstring_strcpy(buf, "01234567");
+    vstream_printf("VSTRING content length: %ld/%ld, content: %s\n",
+                  (long) VSTRING_LEN(buf), (long) buf->vbuf.len,
+                  vstring_str(buf));
+    VSTREAM_PUTCHAR('\n');
+    vstream_fflush(VSTREAM_OUT);
+
+    /*
+     * Test: open the memory VSTREAM in write-only mode, and clobber it.
+     */
+    vstream_printf("memory stream test: open the VSTRING for writing, overwrite, close\n");
+    fp = vstream_memopen(buf, O_WRONLY);
+    vstream_printf("initial memory VSTREAM write offset: %ld/%ld\n",
+                  (long) vstream_ftell(fp), (long) fp->buf.len);
+    vstream_fprintf(fp, "hallo");
+    vstream_printf("final memory VSTREAM write offset: %ld/%ld\n",
+                  (long) vstream_ftell(fp), (long) fp->buf.len);
+    vstream_fclose(fp);
+    vstream_printf("VSTRING content length: %ld/%ld, content: %s\n",
+                  (long) VSTRING_LEN(buf), (long) buf->vbuf.len,
+                  vstring_str(buf));
+    VSTREAM_PUTCHAR('\n');
+    vstream_fflush(VSTREAM_OUT);
+
+    /*
+     * Test: open the memory VSTREAM for append. vstream_memopen() sets the
+     * buffer length to the VSTRING buffer length, and positions the write
+     * pointer at the VSTRING write position. Write some content, then
+     * overwrite one character.
+     */
+    vstream_printf("memory stream test: open the VSTRING for append, write multiple, then overwrite 1\n");
+    fp = vstream_memopen(buf, O_APPEND);
+    vstream_printf("initial memory VSTREAM write offset: %ld/%ld\n",
+                  (long) vstream_ftell(fp), (long) fp->buf.len);
+    vstream_fprintf(fp, " world");
+    vstream_printf("final memory VSTREAM write offset: %ld/%ld\n",
+                  (long) vstream_ftell(fp), (long) fp->buf.len);
     if (vstream_fflush(fp))
        msg_fatal("vstream_fflush: %m");
-    vstream_printf("final memory stream write offset: %ld\n",
-                  (long) vstream_ftell(fp));
-#ifdef PENDING_VSTREAM_FSEEK_FOR_MEMORY
-    vstream_fflush(fp);
-    vstream_printf("buffer size: %ld, content: %s",
-                  (long) VSTRING_LEN(buf), vstring_str(buf));
+    vstream_printf("VSTRING content length: %ld/%ld, content: %s\n",
+                  (long) VSTRING_LEN(buf), (long) buf->vbuf.len,
+                  vstring_str(buf));
+    VSTREAM_PUTCHAR('\n');
+
+    /*
+     * While the stream is still open, replace the second character.
+     */
+    vstream_printf("replace second character and close\n");
     if ((offset = vstream_fseek(fp, 1, SEEK_SET)) != 1)
        msg_panic("unexpected vstream_fseek return: %ld, expected: %ld",
                  (long) offset, (long) 1);
     VSTREAM_PUTC('e', fp);
-#endif
+
+    /*
+     * Skip to the end of the content, so that vstream_fflush() will update
+     * the VSTRING with the right content length.
+     */
+    if ((offset = vstream_fseek(fp, VSTRING_LEN(buf), SEEK_SET)) != VSTRING_LEN(buf))
+       msg_panic("unexpected vstream_fseek return: %ld, expected: %ld",
+                 (long) offset, (long) VSTRING_LEN(buf));
     vstream_fclose(fp);
 
-    vstream_printf("buffer size: %ld, content: %s",
-                  (long) VSTRING_LEN(buf), vstring_str(buf));
+    vstream_printf("VSTRING content length: %ld/%ld, content: %s\n",
+                  (long) VSTRING_LEN(buf), (long) buf->vbuf.len,
+                  vstring_str(buf));
+    VSTREAM_PUTCHAR('\n');
     vstream_fflush(VSTREAM_OUT);
 
+    /*
+     * TODO: test that in write/append mode, seek past the end of data will
+     * result in zero-filled space.
+     */
+
+    /*
+     * Test: Open the VSTRING for reading. This time, vstream_memopen() will
+     * set the VSTREAM buffer length to the content length of the VSTRING, so
+     * that it won't attempt to read past the end of the content.
+     */
+    vstream_printf("memory stream test: open VSTRING for reading, then read\n");
     fp = vstream_memopen(buf, O_RDONLY);
-    vstream_printf("reading memory stream: ");
+    vstream_printf("initial memory VSTREAM read offset: %ld/%ld\n",
+                  (long) vstream_ftell(fp), (long) fp->buf.len);
+    vstream_printf("reading memory VSTREAM: ");
     while ((ch = VSTREAM_GETC(fp)) != VSTREAM_EOF)
        VSTREAM_PUTCHAR(ch);
-#ifdef PENDING_VSTREAM_FSEEK_FOR_MEMORY
-    vstream_printf("reading memory stream from offset 6: ");
-    if ((offset = vstream_fseek(fp, 6, SEEK_SET)) != 6)
+    VSTREAM_PUTCHAR('\n');
+    vstream_printf("final memory VSTREAM read offset: %ld/%ld\n",
+                  (long) vstream_ftell(fp), (long) fp->buf.len);
+    vstream_printf("seeking to offset %ld should work: ",
+                  (long) fp->buf.len + 1);
+    vstream_fflush(VSTREAM_OUT);
+    if ((offset = vstream_fseek(fp, fp->buf.len + 1, SEEK_SET)) != fp->buf.len + 1)
        msg_panic("unexpected vstream_fseek return: %ld, expected: %ld",
-                 (long) offset, (long) 6);
-    while ((ch = VSTREAM_GETC(fp)) != VSTREAM_EOF)
-       VSTREAM_PUTCHAR(ch);
-#endif
-    vstream_printf("final memory stream read offset: %ld\n",
-                  (long) vstream_ftell(fp));
+                 (long) offset, (long) fp->buf.len + 1);
+    vstream_printf("PASS\n");
+    vstream_fflush(VSTREAM_OUT);
+    vstream_printf("VSTREAM_GETC should return VSTREAM_EOF\n");
+    ch = VSTREAM_GETC(fp);
+    if (ch != VSTREAM_EOF)
+       msg_panic("unexpected vstream_fseek VSTREAM_GETC return: %d, expected: %d",
+                 ch, VSTREAM_EOF);
+    vstream_printf("PASS\n");
+    vstream_printf("final memory VSTREAM read offset: %ld/%ld\n",
+                  (long) vstream_ftell(fp), (long) fp->buf.len);
+    vstream_printf("VSTRING content length: %ld/%ld, content: %s\n",
+                  (long) VSTRING_LEN(buf), (long) buf->vbuf.len,
+                  vstring_str(buf));
+    VSTREAM_PUTCHAR('\n');
     vstream_fflush(VSTREAM_OUT);
     vstream_fclose(fp);
     vstring_free(buf);
@@ -1863,14 +1959,18 @@ static void do_memory_stream(void)
  /*
   * Exercise some of the features.
   */
+
+#include <msg_vstream.h>
+
 int     main(int argc, char **argv)
 {
+    msg_vstream_init(argv[0], VSTREAM_ERR);
 
     /*
      * Test buffer expansion and shrinking. Formatted print may silently
      * expand the write buffer and cause multiple bytes to be written.
      */
-    copy_line(1);                      /* one-byte read/write */
+    copy_line(1);                              /* one-byte read/write */
     copy_line(2);                              /* two-byte read/write */
     copy_line(1);                              /* two-byte read/write */
     printf_number();                           /* multi-byte write */
index cf03053aee7af1cb7b92a9941c1b27b01a264118..eaa9952ba9dafb57bef0673284e57429b51cdc0c 100644 (file)
@@ -1,8 +1,41 @@
+buffer size test: copy text with 1 buffer size, ignore requests to shrink
 abcdef
+actual read/write buffer sizes: 1/1
+
+buffer size test: copy text with 2 buffer size, ignore requests to shrink
 ghijkl
+actual read/write buffer sizes: 2/2
+
+buffer size test: copy text with 1 buffer size, ignore requests to shrink
 mnopqr
+actual read/write buffer sizes: 2/2
+
+formatting test: print a number
 1234567890
-final memory stream write offset: 12
-buffer size: 12, content: hallo world
-reading memory stream: hallo world
-final memory stream read offset: 12
+
+memory stream test prep: prefill the VSTRING
+VSTRING content length: 8/8, content: 01234567
+
+memory stream test: open the VSTRING for writing, overwrite, close
+initial memory VSTREAM write offset: 0/8
+final memory VSTREAM write offset: 5/8
+VSTRING content length: 5/8, content: hallo
+
+memory stream test: open the VSTRING for append, write multiple, then overwrite 1
+initial memory VSTREAM write offset: 5/8
+final memory VSTREAM write offset: 11/16
+VSTRING content length: 11/16, content: hallo world
+
+replace second character and close
+VSTRING content length: 11/16, content: hello world
+
+memory stream test: open VSTRING for reading, then read
+initial memory VSTREAM read offset: 0/11
+reading memory VSTREAM: hello world
+final memory VSTREAM read offset: 11/11
+seeking to offset 12 should work: PASS
+VSTREAM_GETC should return VSTREAM_EOF
+PASS
+final memory VSTREAM read offset: 12/11
+VSTRING content length: 11/16, content: hello world
+
index 144e7455142986ef42b5ec985a515d0e4df7f542..49fd960aa4905f64137eb4243fed478b3031ad4d 100644 (file)
@@ -62,6 +62,7 @@ CHECK_VAL_HELPER_DCL(VSTRING_CTL, ssize_t);
 
 /* Flags 24..31 are reserved for VSTRING. */
 #define VSTRING_FLAG_EXACT     (1<<24) /* exact allocation for tests */
+#define VSTRING_FLAG_MASK      (255 << 24)
 
  /*
   * Macros. Unsafe macros have UPPERCASE names.