Wietse Venema:
> [EMAIL PROTECTED]:
> > Any ideas what causes these?
> > 
> > Jul 21 23:14:43 kd1 postfix/qmgr[20699]: warning: F320A29569: rcpt count
> > mismatch (-2)
> ...
> > Version is postfix-2.3.r8,3 (FreeBSD port)
> 
> This problem was removed by a code reorganization in Postfix 2.4,
> when I added support for "message body" replacement.  

This patch fixes the Postfix 2.3 "rcpt count mismatch" warning
message that is logged after Milter applications add a recipient
to a queue file.

Postfix 2.3 is the oldest Postfix release that is still being
updated. The current patchlevel is 15.

        Wietse

diff -cr --new-file /var/tmp/postfix-2.3.8/src/cleanup/Makefile.in 
./src/cleanup/Makefile.in
*** /var/tmp/postfix-2.3.8/src/cleanup/Makefile.in      Thu Oct 19 11:16:17 2006
--- ./src/cleanup/Makefile.in   Mon Sep  8 08:46:28 2008
***************
*** 3,14 ****
        cleanup_extracted.c cleanup_state.c cleanup_rewrite.c \
        cleanup_map11.c cleanup_map1n.c cleanup_masquerade.c \
        cleanup_out_recipient.c cleanup_init.c cleanup_api.c \
!       cleanup_addr.c cleanup_bounce.c cleanup_milter.c
  OBJS  = cleanup.o cleanup_out.o cleanup_envelope.o cleanup_message.o \
        cleanup_extracted.o cleanup_state.o cleanup_rewrite.o \
        cleanup_map11.o cleanup_map1n.o cleanup_masquerade.o \
        cleanup_out_recipient.o cleanup_init.o cleanup_api.o \
!       cleanup_addr.o cleanup_bounce.o cleanup_milter.o
  HDRS  =
  TESTSRC       = 
  DEFS  = -I. -I$(INC_DIR) -D$(SYSTYPE)
--- 3,14 ----
        cleanup_extracted.c cleanup_state.c cleanup_rewrite.c \
        cleanup_map11.c cleanup_map1n.c cleanup_masquerade.c \
        cleanup_out_recipient.c cleanup_init.c cleanup_api.c \
!       cleanup_addr.c cleanup_bounce.c cleanup_milter.c cleanup_final.c
  OBJS  = cleanup.o cleanup_out.o cleanup_envelope.o cleanup_message.o \
        cleanup_extracted.o cleanup_state.o cleanup_rewrite.o \
        cleanup_map11.o cleanup_map1n.o cleanup_masquerade.o \
        cleanup_out_recipient.o cleanup_init.o cleanup_api.o \
!       cleanup_addr.o cleanup_bounce.o cleanup_milter.o cleanup_final.o
  HDRS  =
  TESTSRC       = 
  DEFS  = -I. -I$(INC_DIR) -D$(SYSTYPE)
***************
*** 321,326 ****
--- 321,352 ----
  cleanup_extracted.o: ../../include/vstring.h
  cleanup_extracted.o: cleanup.h
  cleanup_extracted.o: cleanup_extracted.c
+ cleanup_final.o: ../../include/argv.h
+ cleanup_final.o: ../../include/been_here.h
+ cleanup_final.o: ../../include/cleanup_user.h
+ cleanup_final.o: ../../include/dict.h
+ cleanup_final.o: ../../include/header_opts.h
+ cleanup_final.o: ../../include/htable.h
+ cleanup_final.o: ../../include/mail_conf.h
+ cleanup_final.o: ../../include/mail_stream.h
+ cleanup_final.o: ../../include/maps.h
+ cleanup_final.o: ../../include/match_list.h
+ cleanup_final.o: ../../include/match_ops.h
+ cleanup_final.o: ../../include/milter.h
+ cleanup_final.o: ../../include/mime_state.h
+ cleanup_final.o: ../../include/msg.h
+ cleanup_final.o: ../../include/mymalloc.h
+ cleanup_final.o: ../../include/nvtable.h
+ cleanup_final.o: ../../include/rec_type.h
+ cleanup_final.o: ../../include/resolve_clnt.h
+ cleanup_final.o: ../../include/string_list.h
+ cleanup_final.o: ../../include/sys_defs.h
+ cleanup_final.o: ../../include/tok822.h
+ cleanup_final.o: ../../include/vbuf.h
+ cleanup_final.o: ../../include/vstream.h
+ cleanup_final.o: ../../include/vstring.h
+ cleanup_final.o: cleanup.h
+ cleanup_final.o: cleanup_final.c
  cleanup_init.o: ../../include/argv.h
  cleanup_init.o: ../../include/been_here.h
  cleanup_init.o: ../../include/dict.h
diff -cr --new-file /var/tmp/postfix-2.3.8/src/cleanup/cleanup.h 
./src/cleanup/cleanup.h
*** /var/tmp/postfix-2.3.8/src/cleanup/cleanup.h        Thu Oct 19 11:16:17 2006
--- ./src/cleanup/cleanup.h     Mon Sep  8 08:45:45 2008
***************
*** 220,225 ****
--- 220,230 ----
  extern void cleanup_extracted(CLEANUP_STATE *, int, const char *, ssize_t);
  
   /*
+   * cleanup_final.c
+   */
+ extern void cleanup_final(CLEANUP_STATE *);
+ 
+  /*
    * cleanup_rewrite.c
    */
  extern int cleanup_rewrite_external(const char *, VSTRING *, const char *);
diff -cr --new-file /var/tmp/postfix-2.3.8/src/cleanup/cleanup_api.c 
./src/cleanup/cleanup_api.c
*** /var/tmp/postfix-2.3.8/src/cleanup/cleanup_api.c    Thu Jun 15 14:07:15 2006
--- ./src/cleanup/cleanup_api.c Mon Sep  8 08:47:12 2008
***************
*** 235,240 ****
--- 235,247 ----
      }
  
      /*
+      * Update the preliminary message size and count fields with the actual
+      * values.
+      */
+     if (CLEANUP_OUT_OK(state))
+       cleanup_final(state);
+ 
+     /*
       * If there was an error that requires us to generate a bounce message
       * (mail submitted with the Postfix sendmail command, mail forwarded by
       * the local(8) delivery agent, or mail re-queued with "postsuper -r"),
diff -cr --new-file /var/tmp/postfix-2.3.8/src/cleanup/cleanup_extracted.c 
./src/cleanup/cleanup_extracted.c
*** /var/tmp/postfix-2.3.8/src/cleanup/cleanup_extracted.c      Tue Jun 13 
17:59:07 2006
--- ./src/cleanup/cleanup_extracted.c   Mon Sep  8 08:43:28 2008
***************
*** 300,331 ****
       * Terminate the extracted segment.
       */
      cleanup_out_string(state, REC_TYPE_END, "");
- 
-     /*
-      * vstream_fseek() would flush the buffer anyway, but the code just reads
-      * better if we flush first, because it makes seek error handling more
-      * straightforward.
-      */
-     if (vstream_fflush(state->dst)) {
-       if (errno == EFBIG) {
-           msg_warn("%s: queue file size limit exceeded", state->queue_id);
-           state->errs |= CLEANUP_STAT_SIZE;
-       } else {
-           msg_warn("%s: write queue file: %m", state->queue_id);
-           state->errs |= CLEANUP_STAT_WRITE;
-       }
-       return;
-     }
- 
-     /*
-      * Update the preliminary message size and count fields with the actual
-      * values.
-      */
-     if (vstream_fseek(state->dst, 0L, SEEK_SET) < 0)
-       msg_fatal("%s: vstream_fseek %s: %m", myname, cleanup_path);
-     cleanup_out_format(state, REC_TYPE_SIZE, REC_TYPE_SIZE_FORMAT,
-           (REC_TYPE_SIZE_CAST1) (state->xtra_offset - state->data_offset),
-                      (REC_TYPE_SIZE_CAST2) state->data_offset,
-                      (REC_TYPE_SIZE_CAST3) state->rcpt_count,
-                      (REC_TYPE_SIZE_CAST4) state->qmgr_opts);
  }
--- 300,303 ----
diff -cr --new-file /var/tmp/postfix-2.3.8/src/cleanup/cleanup_final.c 
./src/cleanup/cleanup_final.c
*** /var/tmp/postfix-2.3.8/src/cleanup/cleanup_final.c  Wed Dec 31 19:00:00 1969
--- ./src/cleanup/cleanup_final.c       Mon Sep  8 08:45:13 2008
***************
*** 0 ****
--- 1,76 ----
+ /*++
+ /* NAME
+ /*    cleanup_final 3
+ /* SUMMARY
+ /*    finalize queue file
+ /* SYNOPSIS
+ /*    #include "cleanup.h"
+ /*
+ /*    void    cleanup_final(state)
+ /*    CLEANUP_STATE *state;
+ /* DESCRIPTION
+ /*    cleanup_final() performs final queue file content (not
+ /*    attribute) updates so that the file is ready to be closed.
+ /* LICENSE
+ /* .ad
+ /* .fi
+ /*    The Secure Mailer license must be distributed with this software.
+ /* AUTHOR(S)
+ /*    Wietse Venema
+ /*    IBM T.J. Watson Research
+ /*    P.O. Box 704
+ /*    Yorktown Heights, NY 10598, USA
+ /*--*/
+ 
+ /* System library. */
+ 
+ #include <sys_defs.h>
+ #include <errno.h>
+ 
+ /* Utility library. */
+ 
+ #include <msg.h>
+ 
+ /* Global library. */
+ 
+ #include <cleanup_user.h>
+ #include <rec_type.h>
+ 
+ /* Application-specific. */
+ 
+ #include "cleanup.h"
+ 
+ /* cleanup_final - final queue file content updates */
+ 
+ void    cleanup_final(CLEANUP_STATE *state)
+ {
+     const char *myname = "cleanup_final";
+ 
+     /*
+      * vstream_fseek() would flush the buffer anyway, but the code just reads
+      * better if we flush first, because it makes seek error handling more
+      * straightforward.
+      */
+     if (vstream_fflush(state->dst)) {
+       if (errno == EFBIG) {
+           msg_warn("%s: queue file size limit exceeded", state->queue_id);
+           state->errs |= CLEANUP_STAT_SIZE;
+       } else {
+           msg_warn("%s: write queue file: %m", state->queue_id);
+           state->errs |= CLEANUP_STAT_WRITE;
+       }
+       return;
+     }
+ 
+     /*
+      * Update the preliminary message size and count fields with the actual
+      * values.
+      */
+     if (vstream_fseek(state->dst, 0L, SEEK_SET) < 0)
+       msg_fatal("%s: vstream_fseek %s: %m", myname, cleanup_path);
+     cleanup_out_format(state, REC_TYPE_SIZE, REC_TYPE_SIZE_FORMAT,
+           (REC_TYPE_SIZE_CAST1) (state->xtra_offset - state->data_offset),
+                      (REC_TYPE_SIZE_CAST2) state->data_offset,
+                      (REC_TYPE_SIZE_CAST3) state->rcpt_count,
+                      (REC_TYPE_SIZE_CAST4) state->qmgr_opts);
+ }

Reply via email to