Wietse Venema: > Wietse Venema: > > > So it seems this issue occurs whenever the mail queue total recipient > > > count reaches 5000 > > > addresses. > > > > Thanks, that is very useful. This appears to be a corner-case error, > > and that would explain why the problem was difficult to reproduce. > > This reproduces 100% with the Postfix smtp-source test program and > a test system with empty Postfix queue.
Postfix 3.7 introduced special handling of the "start of message content" queue file record. That code could be skipped under sone conditions. The patch addresses the inconsistency. Wietse 20221006 Bugfix (introduced: Postfix 3.7). Messages could falsely be flagged as corrupt with "warning: Unexpected record type 'X'". These messages were moved to the "corrupt" queue directory, where they may still be found. This could happen for messages with 500 or more recipients, or with fewer recipients on a busy mail server. Problem reported by Frank Brendel, reproduced by John Alex. Files: qmgr/qmgr_message.c, oqmgr/qmgr_message.c. A file in the "corrupt" queue directory may be inspected with the command "postcat /var/spool/postfix/corrupt/<filename>. If delivery of the file is still desired, the file can be moved back to /var/spool/postfix/incoming. diff -ur /var/tmp/postfix-3.8-20220816/src/oqmgr/qmgr_message.c ./src/oqmgr/qmgr_message.c --- /var/tmp/postfix-3.8-20220816/src/oqmgr/qmgr_message.c 2021-11-13 09:56:41.000000000 -0500 +++ ./src/oqmgr/qmgr_message.c 2022-10-06 17:53:23.138241428 -0400 @@ -466,8 +466,8 @@ break; } /* Examine non-recipient records in extracted segment. */ - if (vstream_fseek(message->fp, message->data_offset - + message->data_size, SEEK_SET) < 0) + if (vstream_fseek(message->fp, message->data_offset, + SEEK_SET) < 0) msg_fatal("seek file %s: %m", VSTREAM_PATH(message->fp)); continue; } diff -ur /var/tmp/postfix-3.8-20220816/src/qmgr/qmgr_message.c ./src/qmgr/qmgr_message.c --- /var/tmp/postfix-3.8-20220816/src/qmgr/qmgr_message.c 2021-11-13 09:57:06.000000000 -0500 +++ ./src/qmgr/qmgr_message.c 2022-10-06 17:53:23.152241629 -0400 @@ -506,8 +506,8 @@ break; } /* Examine non-recipient records in extracted segment. */ - if (vstream_fseek(message->fp, message->data_offset - + message->data_size, SEEK_SET) < 0) + if (vstream_fseek(message->fp, message->data_offset, + SEEK_SET) < 0) msg_fatal("seek file %s: %m", VSTREAM_PATH(message->fp)); continue; }