diff --git a/postfix/HISTORY b/postfix/HISTORY
index f44567785..9794bb62d 100644
--- a/postfix/HISTORY
+++ b/postfix/HISTORY
@@ -7032,6 +7032,32 @@ Apologies for any names omitted.
result is dynamically allocated. Victor Duchovni. File:
smtpd/smtpd_check.c.
+20020929
+
+ Updated MacOSX support scripts from Gerben Wierda. Files:
+ auxiliary/MacOSX/*.
+
+20021009
+
+ Bugfix: SIZE errors should be reported at MAIL FROM time,
+ and should not be postponed (with smtpd_delay_reject = yes)
+ until RCPT TO time. Reported by Jeroen Scheerder, Utrecht
+ University. Files: smtpd/smtpd.c smtpd/smtpd_check.c.
+
+20021013
+
+ When Postfix development started, Linux mail delivery
+ software such as procmail did not use kernel locks, and
+ Postfix picked one that seemed plausible, namely, flock().
+ In the mean time, Linux mail delivery software seems to
+ have standardized on fcntl() locks. File: util/sys_defs.h.
+
+ Feature: body_checks_size_limit parameter to specify how much
+ of a message body segment (or attachment, if you prefer to
+ use that term) is subjected to body_checks inspection.
+ Default limit: 50 kbytes. Files: global/mime_state.c,
+ cleanup/cleanup_message.c.
+
Open problems:
Low: smtpd should log queue ID with reject/warn/hold/discard
diff --git a/postfix/RELEASE_NOTES b/postfix/RELEASE_NOTES
index d48b20094..5e0fbbdd3 100644
--- a/postfix/RELEASE_NOTES
+++ b/postfix/RELEASE_NOTES
@@ -12,6 +12,27 @@ snapshot release). Patches change the patchlevel and the release
date. Snapshots change only the release date, unless they include
the same bugfixes as a patch release.
+Incompatible changes with Postfix snapshot 1.1.11-20021013
+==========================================================
+
+The default Linux kernel lock style for mailbox delivery is changed
+from flock() to fcntl(). This has no impact if your system uses
+procmail for local delivery, if you use maildir-style mailboxes,
+or when mailbox access software locks mailboxes with username.lock
+files (which is usually the case with non-maildir mailboxes).
+
+Major changes with Postfix snapshot 1.1.11-20021013
+===================================================
+
+The body_checks_max_size parameter limits the amount of text per
+message body segment (or attachment, if you prefer to use that
+term) that is subjected to body_checks inspection. The default
+limit is 50 kbytes. This speeds up the processing of mail with
+large attachments.
+
+Updated MacOS X support by Gerben Wierda. See the auxiliary/MacOSX
+directory.
+
Incompatible changes with Postfix snapshot 1.1.11-20020923
==========================================================
diff --git a/postfix/auxiliary/MacOSX/Postfix.StartupItem/Postfix b/postfix/auxiliary/MacOSX/Postfix.StartupItem/Postfix
index 01bd81cad..5c6511426 100755
--- a/postfix/auxiliary/MacOSX/Postfix.StartupItem/Postfix
+++ b/postfix/auxiliary/MacOSX/Postfix.StartupItem/Postfix
@@ -3,15 +3,26 @@
# Gerben Wierda, Oct 2001. Adapted from an existing example. I waive every
# copyright on this and I also do not give any warranty.
+# Updated Sepember 29, 2002
+# To work properly, the POSTFIX variable needs to be set to -YES-
+# in /etc/hostconfig
+
. /etc/rc.common
+if [ "${POSTFIX:=-NO-}" = "-YES-" -a "${MAILSERVER:=-NO-}" = "-YES-" ]
+then
+ ConsoleMessage "Cannot run concurrent postfix and sendmail"
+ sleep 2
+ exit
+fi
+
##
# Start mail server
##
if [ "$1" == "start" ]
then
- if [ "${MAILSERVER:=-NO-}" = "-YES-" ]
+ if [ "${POSTFIX:=-NO-}" = "-YES-" ]
then
ConsoleMessage "Starting Postfix mail services"
/usr/sbin/postfix start
@@ -22,7 +33,7 @@ then
/usr/sbin/postfix stop
elif [ "$1" == "restart" ]
then
- if [ "${MAILSERVER:=-NO-}" = "-YES-" ]
+ if [ "${POSTFIX:=-NO-}" = "-YES-" ]
then
ConsoleMessage "Reloading Postfix configuration"
/usr/sbin/postfix reload
diff --git a/postfix/auxiliary/MacOSX/README-INSTALL.OSX b/postfix/auxiliary/MacOSX/README-INSTALL.OSX
index 32f1d9ef4..1a47721c4 100644
--- a/postfix/auxiliary/MacOSX/README-INSTALL.OSX
+++ b/postfix/auxiliary/MacOSX/README-INSTALL.OSX
@@ -5,6 +5,9 @@ Let's start with the important warning:
DO NOT USE THE MULTIPLE USERS APPLICATION TO CREATE THE POSTFIX USER!
+NOTE: As of 29 September 2002, these instructions and the scripts have changed
+to make the solution more robust for Apple updates.
+
Run the commands below in the order that they are presented
A. INSTALLING POSTFIX for the first time and selecting it as the active
@@ -12,52 +15,56 @@ A. INSTALLING POSTFIX for the first time and selecting it as the active
# All these commands are written to be run from this directory.
+ # This repairs the previous Oct 2001 setup if any
+ sudo ./repair-oldsetup
+
+ # Prepare for reactivating sendmail
+ sudo ./backup-sendmail-binaries
+
# this creates the necessary users & groups for proper operation
# of postfix:
sudo ./niscript
- # Prepare for reactivating sendmail if you want to
- sudo ./backup-sendmail-binaries
-
# Install postfix:
# When the script asks you for setgid (the default will be no) tell it
# maildrop
(cd ../..; sudo make install)
- # Prepare for reactivating postfix if you want to
+ # Prepare for reactivating postfix
sudo ./backup-postfix-binaries
# edit /etc/postfix/main.cf to suit your requirements
+ ### add your own commands here ###
- ### add your own command here ###
-
- # Install the startup item and move the existing sendmail startup item
- # out of the way
+ # Activate postfix startup at boot time. Deactivates sendmail.
sudo ./activate-postfix
- # Restart your computer
-
# Test. Read INSTALL for a series of suggested tests.
-B. RESTORING Sendmail as the MTA when Postfix is the active MTA
+B. DEACTIVATING POSTFIX
+
+ # Deactivate postfix startup at boot time
+ sudo ./deactivate-postfix
+
+C. RESTORING Sendmail as the MTA when Postfix is the active MTA
+
+ # This repairs the previous Oct 2001 setup if any
+ sudo ./repair-oldsetup
+
+ # Deactivate postfix startup at boot time
+ sudo ./deactivate-postfix
- # Stop postfix
- # Restore the sendmail binaries
- # Restore the Sendmail startup item and move the Postfix startup item
- # out of the way
sudo ./activate-sendmail
# Restart your computer
-C. RESTORING postfix as the MTA when Sendmail is the active MTA
+D. RESTORING postfix as the MTA when Sendmail is the active MTA
- # The first time you have to follow the steps of A.
+ # NOTE: The first time you activate postfix you have to follow
+ # the steps of A.
- # Kill the running sendmail daemon if you know how
+ # This repairs the previous Oct 2001 setup if any
+ sudo ./repair-oldsetup
- # Restore the postfix binaries
- # Restore the Postfix startup item and move the Sendmail startup item
- # out of the way
sudo ./activate-postfix
- # Restart your computer
diff --git a/postfix/auxiliary/MacOSX/activate-postfix b/postfix/auxiliary/MacOSX/activate-postfix
index 50d5b990a..9d7779e8d 100755
--- a/postfix/auxiliary/MacOSX/activate-postfix
+++ b/postfix/auxiliary/MacOSX/activate-postfix
@@ -5,6 +5,7 @@
. ./defines
+# Activate binaries
if [ ! -e ${POSTFIXBACKUPDIR}/sendmail ]
then
echo "Something is wrong: there is no existing postfix binary backup"
@@ -30,32 +31,13 @@ else
fi
fi
-if [ -e "${SSI}" ]
-then
- if [ ! -d "${SIDISABLEDDIR}" ]
- then
- mkdir -p "${SIDISABLEDDIR}"
- fi
- echo "Moving existing Sendmail StartupItem to ${SIDISABLEDDIR}..."
- if [ -e "${SSIDISABLED}" ]
- then
- echo "Something is wrong. A disabled Sendmail StartupItem already exists."
- DATETIME=`date +"%Y%b%e-%H%M%S"`
- echo "Moving Sendmail to Sendmail.${DATETIME}"
- mv "${SSI}" "${SSIDISABLED}.${DATETIME}"
- echo "You should have just one ${SSIDISABLED}"
- else
- mv "${SSI}" "${SSIDISABLED}"
- fi
-fi
-
-. /etc/hostconfig
-
-if [ "${MAILSERVER:=-NO-}" = "-YES-" ]
-then
- echo "Postfix will start on reboot"
+# De-activate sendmail in /etc/hostconfig
+/usr/bin/perl -pi -e 's/MAILSERVER=-YES-/MAILSERVER=-NO-/g' /etc/hostconfig
+# Activate postfix in /etc/hostconfig
+if /usr/bin/grep '^POSTFIX=-NO-' /etc/hostconfig >/dev/null 2>&1; then
+ /usr/bin/perl -pi -e 's/POSTFIX=-NO-/POSTFIX=-YES-/g' /etc/hostconfig
else
- echo "Note: Postfix needs MAILSERVER set to -YES- in /etc/hostconfig"
- echo "Postfix will NOT start on reboot"
+ echo "POSTFIX=-YES-" >>/etc/hostconfig
fi
+/usr/sbin/postfix start
diff --git a/postfix/auxiliary/MacOSX/activate-sendmail b/postfix/auxiliary/MacOSX/activate-sendmail
index 15f68eb78..72adf94fc 100755
--- a/postfix/auxiliary/MacOSX/activate-sendmail
+++ b/postfix/auxiliary/MacOSX/activate-sendmail
@@ -5,9 +5,12 @@
. ./defines
+. ./deactivate-postfix
+
+# Activate binaries
if [ ! -e ${SENDMAILBACKUPDIR}/sendmail ]
then
- echo "Something is wrong: there is no existing postfix binary backup"
+ echo "Something is wrong: there is no existing sendmail binary backup"
exit 1;
else
echo "Restoring sendmail versions of sendmail programs from backup..."
@@ -16,45 +19,6 @@ else
(cd ${SENDMAILBACKUPDIR}; tar cf - mailq) | (cd /usr/bin; tar xf -)
fi
-if [ -e "${SSI}" ]
-then
- echo "Sendmail StartupItem already exists."
-else
- if [ -e "${SSIDISABLED}" ]
- then
- echo "Reinstating disabled Sendmail StartupItem..."
- mv "${SSIDISABLED}" "${SSI}"
- else
- echo "Something is wrong. I cannot find ${SSIDISABLED}"
- echo "Postfix will be uninstalled, Sendmail not reinstalled."
- fi
-fi
+# Activate sendmail in /etc/hostconfig
+/usr/bin/perl -pi -e 's/MAILSERVER=-NO-/MAILSERVER=-YES-/g' /etc/hostconfig
-if [ -e "${PSI}" ]
-then
- if [ ! -d "${SIDISABLEDDIR}" ]
- then
- mkdir -p "${SIDISABLEDDIR}"
- fi
- echo "Moving existing Postfix StartupItem to ${SIDISABLEDDIR}..."
- if [ -e "${PSIDISABLED}" ]
- then
- echo "Something is wrong. A disabled Postfix StartupItem already exists."
- DATETIME=`date +"%Y%b%e-%H%M%S"`
- echo "Moving Postfix to Postfix.${DATETIME}"
- mv "${PSI}" "${PSIDISABLED}.${DATETIME}"
- echo "You should have just one ${PSIDISABLED}"
- else
- mv "${PSI}" "${PSIDISABLED}"
- fi
-fi
-
-. /etc/hostconfig
-
-if [ "${MAILSERVER:=-NO-}" = "-YES-" ]
-then
- echo "Sendmail will start on reboot"
-else
- echo "Note: Sendmail needs MAILSERVER set to -YES- in /etc/hostconfig"
- echo "Sendmail will NOT start on reboot"
-fi
diff --git a/postfix/auxiliary/MacOSX/deactivate-postfix b/postfix/auxiliary/MacOSX/deactivate-postfix
new file mode 100755
index 000000000..8b398b176
--- /dev/null
+++ b/postfix/auxiliary/MacOSX/deactivate-postfix
@@ -0,0 +1,16 @@
+#!/bin/sh
+
+# Written by Gerben Wierda, Sep 2002. I waive every copyright on this and
+# I also do not give any warranty.
+
+. ./defines
+
+if [ -e "${PSI}" ]
+then
+ mv "${PSI}" "${PSIDISABLED}"
+fi
+
+# De-activate postfix in /etc/hostconfig
+/usr/bin/perl -pi -e 's/POSTFIX=-YES-/POSTFIX=-NO-/g' /etc/hostconfig
+
+/usr/sbin/postfix stop >/dev/null 2>&1
diff --git a/postfix/auxiliary/MacOSX/defines b/postfix/auxiliary/MacOSX/defines
index 3aa667d7f..298a547e5 100644
--- a/postfix/auxiliary/MacOSX/defines
+++ b/postfix/auxiliary/MacOSX/defines
@@ -3,13 +3,10 @@
# Written by Gerben Wierda, Oct 2001. I waive every copyright on this and
# I also do not give any warranty.
-SIDIR="/System/Library/StartupItems"
-SIDISABLEDDIR="/System/Library/DisabledStartupItems"
+SIDIR="/Library/StartupItems"
PSI="${SIDIR}/Postfix"
-SSI="${SIDIR}/Sendmail"
-PSIDISABLED="${SIDISABLEDDIR}/Postfix"
-SSIDISABLED="${SIDISABLEDDIR}/Sendmail"
+PSIDISABLED="${PSI}.disabled"
POSTFIXBACKUPDIR=/usr/sbin/.postfixbackup
SENDMAILBACKUPDIR=/usr/sbin/.sendmailbackup
diff --git a/postfix/auxiliary/MacOSX/niscript b/postfix/auxiliary/MacOSX/niscript
old mode 100644
new mode 100755
diff --git a/postfix/auxiliary/MacOSX/repair-oldsetup b/postfix/auxiliary/MacOSX/repair-oldsetup
new file mode 100755
index 000000000..a8e1840c8
--- /dev/null
+++ b/postfix/auxiliary/MacOSX/repair-oldsetup
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+if [ -d /System/Library/DisabledStartupItems/Sendmail ]
+then
+ mv /System/Library/DisabledStartupItems/Sendmail /System/Library/StartupItems
+ rmdir /System/Library/DisabledStartupItems/Sendmail
+ rm -rf /System/Library/StartupItems/Postfix
+fi
diff --git a/postfix/conf/sample-filter.cf b/postfix/conf/sample-filter.cf
index 248c4e891..3ab0d02e4 100644
--- a/postfix/conf/sample-filter.cf
+++ b/postfix/conf/sample-filter.cf
@@ -144,3 +144,12 @@ nested_header_checks = $header_checks
# overrides the main.cf content_filter setting.
#
body_checks = regexp:/etc/postfix/body_checks
+
+# The body_checks_max_size parameter controls how much text in a
+# message body segment (or attachment, if you prefer to use that
+# term) is subjected to body_checks inspection.
+#
+# By default, only the first 50 kbytes of a message body segment are
+# inspected with body_checks patterns.
+#
+body_checks_max_size = 51200
diff --git a/postfix/html/cleanup.8.html b/postfix/html/cleanup.8.html
index 028b0e22a..e6452a999 100644
--- a/postfix/html/cleanup.8.html
+++ b/postfix/html/cleanup.8.html
@@ -77,56 +77,60 @@ CLEANUP(8) CLEANUP(8)
lines. These filters see physical lines one at a
time, in chunks of at most line_length_limit bytes.
+ body_checks_size_limit
+ The amount of content per message body segment that
+ is subjected to $body_checks filtering.
+
header_checks
mime_header_checks (default: $header_checks)
nested_header_checks (default: $header_checks)
- Lookup tables with content filters for message
- header lines: respectively, these are applied to
- the primary message headers (not including MIME
- headers), to the MIME headers anywhere in the mes-
- sage, and to the initial headers of attached mes-
- sages. These filters see logical headers one at a
+ Lookup tables with content filters for message
+ header lines: respectively, these are applied to
+ the primary message headers (not including MIME
+ headers), to the MIME headers anywhere in the mes-
+ sage, and to the initial headers of attached mes-
+ sages. These filters see logical headers one at a
time, including headers that span multiple lines.
MIME Processing
disable_mime_input_processing
- While receiving, give no special treatment to Con-
+ While receiving, give no special treatment to Con-
tent-Type: message headers; all text after the ini-
- tial message headers is considered to be part of
+ tial message headers is considered to be part of
the message body.
mime_boundary_length_limit
The amount of space that will be allocated for MIME
- multipart boundary strings. The MIME processor is
+ multipart boundary strings. The MIME processor is
unable to distinguish between boundary strings that
do not differ in the first $mime_bound-
ary_length_limit characters.
mime_nesting_limit
- The maximal nesting level of multipart mail that
- the MIME processor can handle. Refuse mail that is
+ The maximal nesting level of multipart mail that
+ the MIME processor can handle. Refuse mail that is
nested deeper.
strict_8bitmime
- Turn on both strict_7bit_headers and strict_8bit-
+ Turn on both strict_7bit_headers and strict_8bit-
mime_body.
strict_7bit_headers
- Reject mail with 8-bit text in message headers.
- This blocks mail from poorly written applications.
+ Reject mail with 8-bit text in message headers.
+ This blocks mail from poorly written applications.
strict_8bitmime_body
- Reject mail with 8-bit text in content that claims
- to be 7-bit, or in content that has no explicit
- content encoding information. This blocks mail
- mail poorly written mail software. Unfortunately,
- this also breaks majordomo approval requests when
- the included request contains valid 8-bit MIME
- mail, and it breaks bounces from mailers that do
- not properly encapsulate 8-bit content (for exam-
- ple, bounces from qmail or from old versions of
+ Reject mail with 8-bit text in content that claims
+ to be 7-bit, or in content that has no explicit
+ content encoding information. This blocks mail
+ mail poorly written mail software. Unfortunately,
+ this also breaks majordomo approval requests when
+ the included request contains valid 8-bit MIME
+ mail, and it breaks bounces from mailers that do
+ not properly encapsulate 8-bit content (for exam-
+ ple, bounces from qmail or from old versions of
Postfix).
strict_mime_domain_encoding
@@ -136,7 +140,7 @@ CLEANUP(8) CLEANUP(8)
Miscellaneous
always_bcc
- Address to send a copy of each message that enters
+ Address to send a copy of each message that enters
the system.
hopcount_limit
@@ -149,8 +153,8 @@ CLEANUP(8) CLEANUP(8)
Address transformations
empty_address_recipient
- The destination for undeliverable mail from <>.
- This substitution is done before all other address
+ The destination for undeliverable mail from <>.
+ This substitution is done before all other address
rewriting.
canonical_maps
@@ -166,16 +170,16 @@ CLEANUP(8) CLEANUP(8)
header sender addresses.
masquerade_classes
- List of address classes subject to masquerading:
- zero or more of envelope_sender, envelope_recipi-
+ List of address classes subject to masquerading:
+ zero or more of envelope_sender, envelope_recipi-
ent, header_sender, header_recipient.
masquerade_domains
- List of domains that hide their subdomain struc-
+ List of domains that hide their subdomain struc-
ture.
masquerade_exceptions
- List of user names that are not subject to address
+ List of user names that are not subject to address
masquerading.
virtual_maps
@@ -184,7 +188,7 @@ CLEANUP(8) CLEANUP(8)
Resource controls
duplicate_filter_limit
- Limit the number of envelope recipients that are
+ Limit the number of envelope recipients that are
remembered.
header_size_limit
@@ -193,11 +197,11 @@ CLEANUP(8) CLEANUP(8)
in_flow_delay
Amount of time to pause before accepting a message,
- when the message arrival rate exceeds the message
+ when the message arrival rate exceeds the message
delivery rate.
extract_recipient_limit
- Limit the amount of recipients extracted from mes-
+ Limit the amount of recipients extracted from mes-
sage headers.
SEE ALSO
@@ -212,7 +216,7 @@ CLEANUP(8) CLEANUP(8)
/etc/postfix/virtual*, virtual mapping table
LICENSE
- The Secure Mailer license must be distributed with this
+ The Secure Mailer license must be distributed with this
software.
AUTHOR(S)
diff --git a/postfix/man/man8/cleanup.8 b/postfix/man/man8/cleanup.8
index 9d556d20b..2eb98b2ea 100644
--- a/postfix/man/man8/cleanup.8
+++ b/postfix/man/man8/cleanup.8
@@ -81,6 +81,9 @@ a configuration change.
Lookup tables with content filters for message body lines.
These filters see physical lines one at a time, in chunks of
at most line_length_limit bytes.
+.IP \fBbody_checks_size_limit\fP
+The amount of content per message body segment that is
+subjected to \fB$body_checks\fR filtering.
.IP \fBheader_checks\fR
.IP "\fBmime_header_checks\fR (default: \fB$header_checks\fR)"
.IP "\fBnested_header_checks\fR (default: \fB$header_checks\fR)"
diff --git a/postfix/src/cleanup/cleanup.c b/postfix/src/cleanup/cleanup.c
index bde248749..5eba3cf49 100644
--- a/postfix/src/cleanup/cleanup.c
+++ b/postfix/src/cleanup/cleanup.c
@@ -67,6 +67,9 @@
/* Lookup tables with content filters for message body lines.
/* These filters see physical lines one at a time, in chunks of
/* at most line_length_limit bytes.
+/* .IP \fBbody_checks_size_limit\fP
+/* The amount of content per message body segment that is
+/* subjected to \fB$body_checks\fR filtering.
/* .IP \fBheader_checks\fR
/* .IP "\fBmime_header_checks\fR (default: \fB$header_checks\fR)"
/* .IP "\fBnested_header_checks\fR (default: \fB$header_checks\fR)"
diff --git a/postfix/src/cleanup/cleanup_init.c b/postfix/src/cleanup/cleanup_init.c
index d1699aebd..ad419cb19 100644
--- a/postfix/src/cleanup/cleanup_init.c
+++ b/postfix/src/cleanup/cleanup_init.c
@@ -110,12 +110,14 @@ int var_extra_rcpt_limit; /* recipient extract limit */
char *var_rcpt_witheld; /* recipients not disclosed */
char *var_masq_classes; /* what to masquerade */
int var_qattr_count_limit; /* named attribute limit */
+int var_body_check_len; /* when to stop body scan */
CONFIG_INT_TABLE cleanup_int_table[] = {
VAR_HOPCOUNT_LIMIT, DEF_HOPCOUNT_LIMIT, &var_hopcount_limit, 1, 0,
VAR_DUP_FILTER_LIMIT, DEF_DUP_FILTER_LIMIT, &var_dup_filter_limit, 0, 0,
VAR_EXTRA_RCPT_LIMIT, DEF_EXTRA_RCPT_LIMIT, &var_extra_rcpt_limit, 0, 0,
VAR_QATTR_COUNT_LIMIT, DEF_QATTR_COUNT_LIMIT, &var_qattr_count_limit, 1, 0,
+ VAR_BODY_CHECK_LEN, DEF_BODY_CHECK_LEN, &var_body_check_len, 0, 0,
0,
};
diff --git a/postfix/src/cleanup/cleanup_message.c b/postfix/src/cleanup/cleanup_message.c
index e1c9e5106..a683b5e57 100644
--- a/postfix/src/cleanup/cleanup_message.c
+++ b/postfix/src/cleanup/cleanup_message.c
@@ -344,7 +344,8 @@ static int cleanup_act(CLEANUP_STATE *state, char *context, const char *buf,
/* cleanup_header_callback - process one complete header line */
static void cleanup_header_callback(void *context, int header_class,
- HEADER_OPTS *hdr_opts, VSTRING *header_buf)
+ HEADER_OPTS *hdr_opts, VSTRING *header_buf,
+ off_t unused_offset)
{
CLEANUP_STATE *state = (CLEANUP_STATE *) context;
const char *myname = "cleanup_header_callback";
@@ -581,7 +582,9 @@ static void cleanup_header_done_callback(void *context)
/* cleanup_body_callback - output one body record */
-static void cleanup_body_callback(void *context, int type, const char *buf, int len)
+static void cleanup_body_callback(void *context, int type,
+ const char *buf, int len,
+ off_t offset)
{
CLEANUP_STATE *state = (CLEANUP_STATE *) context;
@@ -591,7 +594,9 @@ static void cleanup_body_callback(void *context, int type, const char *buf, int
* only in chunks of line_length_limit (2048) characters; it is easily
* bypassed with encodings and other tricks.
*/
- if ((state->flags & CLEANUP_FLAG_FILTER) && cleanup_body_checks) {
+ if ((state->flags & CLEANUP_FLAG_FILTER)
+ && cleanup_body_checks
+ && (var_body_check_len == 0 || offset < var_body_check_len)) {
const char *value;
if ((value = maps_find(cleanup_body_checks, buf, 0)) != 0) {
diff --git a/postfix/src/global/mail_params.h b/postfix/src/global/mail_params.h
index 934b103ca..558c44a44 100644
--- a/postfix/src/global/mail_params.h
+++ b/postfix/src/global/mail_params.h
@@ -1004,6 +1004,10 @@ extern char *var_nesthdr_checks;
#define DEF_BODY_CHECKS ""
extern char *var_body_checks;
+#define VAR_BODY_CHECK_LEN "body_checks_size_limit"
+#define DEF_BODY_CHECK_LEN (50*1024)
+extern int var_body_check_len;
+
/*
* Bounce service: truncate bounce message that exceed $bounce_size_limit.
*/
diff --git a/postfix/src/global/mail_version.h b/postfix/src/global/mail_version.h
index c5405dd5f..cf8746606 100644
--- a/postfix/src/global/mail_version.h
+++ b/postfix/src/global/mail_version.h
@@ -20,7 +20,7 @@
* Patches change the patchlevel and the release date. Snapshots change the
* release date only, unless they include the same bugfix as a patch release.
*/
-#define MAIL_RELEASE_DATE "20020928"
+#define MAIL_RELEASE_DATE "20021013"
#define VAR_MAIL_VERSION "mail_version"
#define DEF_MAIL_VERSION "1.1.11-" MAIL_RELEASE_DATE
diff --git a/postfix/src/global/mime_8bit.ref b/postfix/src/global/mime_8bit.ref
index e9d6eae09..2a287a389 100644
--- a/postfix/src/global/mime_8bit.ref
+++ b/postfix/src/global/mime_8bit.ref
@@ -1,9 +1,9 @@
mime_state: warning: improper use of 8-bit data in message header: Header: f??bar
-MAIN Header: f€€bar
+MAIN 0 Header: f€€bar
HEADER END
-BODY N
+BODY N 0
mime_state: warning: improper use of 8-bit data in message body: b?dy
-BODY N b€dy
+BODY N 1 b€dy
BODY END
mime_state: warning: improper use of 8-bit data in message header
mime_state: warning: improper use of 8-bit data in message body
diff --git a/postfix/src/global/mime_cvt.ref b/postfix/src/global/mime_cvt.ref
index a6e0227c2..c3b59adaf 100644
--- a/postfix/src/global/mime_cvt.ref
+++ b/postfix/src/global/mime_cvt.ref
@@ -1,93 +1,93 @@
-MAIN mime-version: 1.0
+MAIN 0 mime-version: 1.0
mime_state: header_token: text / plain
-MAIN content-type: text/plain
+MAIN 25 content-type: text/plain
mime_state: header_token: 8bit
-MAIN Content-Transfer-Encoding: quoted-printable
+MAIN 57 Content-Transfer-Encoding: quoted-printable
HEADER END
-BODY N
-BODY N =20
-BODY N x=20
-BODY N xx=20
-BODY N xxx=20
-BODY N xxxx=20
-BODY N xxxxx=20
-BODY N xxxxxx=20
-BODY N xxxxxxx=20
-BODY N xxxxxxxx=20
-BODY N xxxxxxxxx=20
-BODY N xxxxxxxxxx=20
-BODY N xxxxxxxxxxx=20
-BODY N xxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
-BODY N =20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
-BODY N x=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
-BODY N xx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
-BODY N xxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
-BODY N xxxx=20
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
-BODY N xxxxx=20
+BODY N 0
+BODY N 1 =20
+BODY N 5 x=20
+BODY N 10 xx=20
+BODY N 16 xxx=20
+BODY N 23 xxxx=20
+BODY N 31 xxxxx=20
+BODY N 40 xxxxxx=20
+BODY N 50 xxxxxxx=20
+BODY N 61 xxxxxxxx=20
+BODY N 73 xxxxxxxxx=20
+BODY N 86 xxxxxxxxxx=20
+BODY N 100 xxxxxxxxxxx=20
+BODY N 115 xxxxxxxxxxxx=20
+BODY N 131 xxxxxxxxxxxxx=20
+BODY N 148 xxxxxxxxxxxxxx=20
+BODY N 166 xxxxxxxxxxxxxxx=20
+BODY N 185 xxxxxxxxxxxxxxxx=20
+BODY N 205 xxxxxxxxxxxxxxxxx=20
+BODY N 226 xxxxxxxxxxxxxxxxxx=20
+BODY N 248 xxxxxxxxxxxxxxxxxxx=20
+BODY N 271 xxxxxxxxxxxxxxxxxxxx=20
+BODY N 295 xxxxxxxxxxxxxxxxxxxxx=20
+BODY N 320 xxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 346 xxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 373 xxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 401 xxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 430 xxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 460 xxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 491 xxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 523 xxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 556 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 590 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 625 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 661 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 698 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 736 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 775 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 815 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 856 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 898 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 941 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 985 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 1030 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 1076 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 1123 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 1171 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 1220 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 1270 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 1321 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 1373 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 1426 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 1480 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 1535 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 1591 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 1648 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 1706 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 1765 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 1825 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 1886 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 1948 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 2011 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 2075 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 2140 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 2206 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 2273 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 2341 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 2410 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 2480 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 2551 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 2623 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 2696 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 2770 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 2845 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=20
+BODY N 2921 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+BODY N 2996 =20
+BODY N 3000 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+BODY N 3075 x=20
+BODY N 3080 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+BODY N 3155 xx=20
+BODY N 3161 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+BODY N 3236 xxx=20
+BODY N 3243 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+BODY N 3318 xxxx=20
+BODY N 3326 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+BODY N 3401 xxxxx=20
BODY END
diff --git a/postfix/src/global/mime_cvt.ref2 b/postfix/src/global/mime_cvt.ref2
index fa0d00a43..2f8d8628c 100644
--- a/postfix/src/global/mime_cvt.ref2
+++ b/postfix/src/global/mime_cvt.ref2
@@ -1,93 +1,93 @@
-MAIN mime-version: 1.0
+MAIN 0 mime-version: 1.0
mime_state: header_token: text / plain
-MAIN content-type: text/plain
+MAIN 25 content-type: text/plain
mime_state: header_token: 8bit
-MAIN Content-Transfer-Encoding: quoted-printable
+MAIN 57 Content-Transfer-Encoding: quoted-printable
HEADER END
-BODY N
-BODY N =09
-BODY N x=09
-BODY N xx=09
-BODY N xxx=09
-BODY N xxxx=09
-BODY N xxxxx=09
-BODY N xxxxxx=09
-BODY N xxxxxxx=09
-BODY N xxxxxxxx=09
-BODY N xxxxxxxxx=09
-BODY N xxxxxxxxxx=09
-BODY N xxxxxxxxxxx=09
-BODY N xxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
-BODY N =09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
-BODY N x=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
-BODY N xx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
-BODY N xxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
-BODY N xxxx=09
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
-BODY N xxxxx=09
+BODY N 0
+BODY N 1 =09
+BODY N 5 x=09
+BODY N 10 xx=09
+BODY N 16 xxx=09
+BODY N 23 xxxx=09
+BODY N 31 xxxxx=09
+BODY N 40 xxxxxx=09
+BODY N 50 xxxxxxx=09
+BODY N 61 xxxxxxxx=09
+BODY N 73 xxxxxxxxx=09
+BODY N 86 xxxxxxxxxx=09
+BODY N 100 xxxxxxxxxxx=09
+BODY N 115 xxxxxxxxxxxx=09
+BODY N 131 xxxxxxxxxxxxx=09
+BODY N 148 xxxxxxxxxxxxxx=09
+BODY N 166 xxxxxxxxxxxxxxx=09
+BODY N 185 xxxxxxxxxxxxxxxx=09
+BODY N 205 xxxxxxxxxxxxxxxxx=09
+BODY N 226 xxxxxxxxxxxxxxxxxx=09
+BODY N 248 xxxxxxxxxxxxxxxxxxx=09
+BODY N 271 xxxxxxxxxxxxxxxxxxxx=09
+BODY N 295 xxxxxxxxxxxxxxxxxxxxx=09
+BODY N 320 xxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 346 xxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 373 xxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 401 xxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 430 xxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 460 xxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 491 xxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 523 xxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 556 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 590 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 625 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 661 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 698 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 736 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 775 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 815 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 856 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 898 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 941 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 985 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 1030 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 1076 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 1123 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 1171 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 1220 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 1270 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 1321 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 1373 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 1426 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 1480 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 1535 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 1591 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 1648 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 1706 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 1765 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 1825 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 1886 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 1948 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 2011 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 2075 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 2140 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 2206 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 2273 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 2341 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 2410 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 2480 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 2551 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 2623 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 2696 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 2770 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 2845 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=09
+BODY N 2921 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+BODY N 2996 =09
+BODY N 3000 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+BODY N 3075 x=09
+BODY N 3080 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+BODY N 3155 xx=09
+BODY N 3161 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+BODY N 3236 xxx=09
+BODY N 3243 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+BODY N 3318 xxxx=09
+BODY N 3326 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+BODY N 3401 xxxxx=09
BODY END
diff --git a/postfix/src/global/mime_cvt.ref3 b/postfix/src/global/mime_cvt.ref3
index a5b4f64d8..b36eb213f 100644
--- a/postfix/src/global/mime_cvt.ref3
+++ b/postfix/src/global/mime_cvt.ref3
@@ -1,93 +1,93 @@
-MAIN mime-version: 1.0
+MAIN 0 mime-version: 1.0
mime_state: header_token: text / plain
-MAIN content-type: text/plain
+MAIN 25 content-type: text/plain
mime_state: header_token: 8bit
-MAIN Content-Transfer-Encoding: quoted-printable
+MAIN 57 Content-Transfer-Encoding: quoted-printable
HEADER END
-BODY N
-BODY N =01
-BODY N x=01
-BODY N xx=01
-BODY N xxx=01
-BODY N xxxx=01
-BODY N xxxxx=01
-BODY N xxxxxx=01
-BODY N xxxxxxx=01
-BODY N xxxxxxxx=01
-BODY N xxxxxxxxx=01
-BODY N xxxxxxxxxx=01
-BODY N xxxxxxxxxxx=01
-BODY N xxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
-BODY N =01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
-BODY N x=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
-BODY N xx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
-BODY N xxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
-BODY N xxxx=01
-BODY N xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
-BODY N xxxxx=01
+BODY N 0
+BODY N 1 =01
+BODY N 5 x=01
+BODY N 10 xx=01
+BODY N 16 xxx=01
+BODY N 23 xxxx=01
+BODY N 31 xxxxx=01
+BODY N 40 xxxxxx=01
+BODY N 50 xxxxxxx=01
+BODY N 61 xxxxxxxx=01
+BODY N 73 xxxxxxxxx=01
+BODY N 86 xxxxxxxxxx=01
+BODY N 100 xxxxxxxxxxx=01
+BODY N 115 xxxxxxxxxxxx=01
+BODY N 131 xxxxxxxxxxxxx=01
+BODY N 148 xxxxxxxxxxxxxx=01
+BODY N 166 xxxxxxxxxxxxxxx=01
+BODY N 185 xxxxxxxxxxxxxxxx=01
+BODY N 205 xxxxxxxxxxxxxxxxx=01
+BODY N 226 xxxxxxxxxxxxxxxxxx=01
+BODY N 248 xxxxxxxxxxxxxxxxxxx=01
+BODY N 271 xxxxxxxxxxxxxxxxxxxx=01
+BODY N 295 xxxxxxxxxxxxxxxxxxxxx=01
+BODY N 320 xxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 346 xxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 373 xxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 401 xxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 430 xxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 460 xxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 491 xxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 523 xxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 556 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 590 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 625 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 661 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 698 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 736 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 775 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 815 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 856 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 898 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 941 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 985 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 1030 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 1076 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 1123 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 1171 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 1220 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 1270 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 1321 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 1373 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 1426 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 1480 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 1535 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 1591 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 1648 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 1706 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 1765 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 1825 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 1886 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 1948 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 2011 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 2075 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 2140 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 2206 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 2273 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 2341 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 2410 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 2480 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 2551 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 2623 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 2696 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 2770 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 2845 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=01
+BODY N 2921 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+BODY N 2996 =01
+BODY N 3000 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+BODY N 3075 x=01
+BODY N 3080 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+BODY N 3155 xx=01
+BODY N 3161 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+BODY N 3236 xxx=01
+BODY N 3243 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+BODY N 3318 xxxx=01
+BODY N 3326 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx=
+BODY N 3401 xxxxx=01
BODY END
diff --git a/postfix/src/global/mime_dom.ref b/postfix/src/global/mime_dom.ref
index 22ce81ad4..da730e61b 100644
--- a/postfix/src/global/mime_dom.ref
+++ b/postfix/src/global/mime_dom.ref
@@ -1,7 +1,7 @@
mime_state: header_token: message / rfc822
-MAIN content-type: message/rfc822
+MAIN 0 content-type: message/rfc822
mime_state: header_token: base64
-MAIN content-transfer-encoding: base64
+MAIN 34 content-transfer-encoding: base64
HEADER END
mime_state: warning: invalid message/* or multipart/* encoding domain: base64
BODY END
diff --git a/postfix/src/global/mime_nest.ref b/postfix/src/global/mime_nest.ref
index d1e32cb37..11bce36db 100644
--- a/postfix/src/global/mime_nest.ref
+++ b/postfix/src/global/mime_nest.ref
@@ -1,142 +1,142 @@
mime_state: header_token: multipart / mixed
mime_state: header_token: boundary = foobar
mime_state: PUSH boundary foobar
-MAIN content-type: multipart/mixed; boundary=foobar
+MAIN 0 content-type: multipart/mixed; boundary=foobar
HEADER END
-BODY N
-BODY N --foobar
+BODY N 0
+BODY N 1 --foobar
mime_state: header_token: multipart / mixed
mime_state: header_token: boundary = foobar
mime_state: PUSH boundary foobar
-MULT content-type: multipart/mixed; boundary=foobar
-BODY N
-BODY N --foobar
+MULT 0 content-type: multipart/mixed; boundary=foobar
+BODY N 0
+BODY N 1 --foobar
mime_state: header_token: multipart / mixed
mime_state: header_token: boundary = foobar
mime_state: PUSH boundary foobar
-MULT content-type: multipart/mixed; boundary=foobar
-BODY N
-BODY N --foobar
+MULT 0 content-type: multipart/mixed; boundary=foobar
+BODY N 0
+BODY N 1 --foobar
mime_state: header_token: multipart / mixed
mime_state: header_token: boundary = foobar
mime_state: PUSH boundary foobar
-MULT content-type: multipart/mixed; boundary=foobar
-BODY N
-BODY N --foobar
+MULT 0 content-type: multipart/mixed; boundary=foobar
+BODY N 0
+BODY N 1 --foobar
mime_state: header_token: multipart / mixed
mime_state: header_token: boundary = foobar
mime_state: PUSH boundary foobar
-MULT content-type: multipart/mixed; boundary=foobar
-BODY N
-BODY N --foobar
+MULT 0 content-type: multipart/mixed; boundary=foobar
+BODY N 0
+BODY N 1 --foobar
mime_state: header_token: multipart / mixed
mime_state: header_token: boundary = foobar
mime_state: PUSH boundary foobar
-MULT content-type: multipart/mixed; boundary=foobar
-BODY N
-BODY N --foobar
+MULT 0 content-type: multipart/mixed; boundary=foobar
+BODY N 0
+BODY N 1 --foobar
mime_state: header_token: multipart / mixed
mime_state: header_token: boundary = foobar
mime_state: PUSH boundary foobar
-MULT content-type: multipart/mixed; boundary=foobar
-BODY N
-BODY N --foobar
+MULT 0 content-type: multipart/mixed; boundary=foobar
+BODY N 0
+BODY N 1 --foobar
mime_state: header_token: multipart / mixed
mime_state: header_token: boundary = foobar
mime_state: PUSH boundary foobar
-MULT content-type: multipart/mixed; boundary=foobar
-BODY N
-BODY N --foobar
+MULT 0 content-type: multipart/mixed; boundary=foobar
+BODY N 0
+BODY N 1 --foobar
mime_state: header_token: multipart / mixed
mime_state: header_token: boundary = foobar
mime_state: PUSH boundary foobar
-MULT content-type: multipart/mixed; boundary=foobar
-BODY N
-BODY N --foobar
+MULT 0 content-type: multipart/mixed; boundary=foobar
+BODY N 0
+BODY N 1 --foobar
mime_state: header_token: multipart / mixed
mime_state: header_token: boundary = foobar
mime_state: PUSH boundary foobar
-MULT content-type: multipart/mixed; boundary=foobar
-BODY N
-BODY N --foobar
+MULT 0 content-type: multipart/mixed; boundary=foobar
+BODY N 0
+BODY N 1 --foobar
mime_state: header_token: multipart / mixed
mime_state: header_token: boundary = foobar
mime_state: PUSH boundary foobar
-MULT content-type: multipart/mixed; boundary=foobar
-BODY N
-BODY N --foobar
+MULT 0 content-type: multipart/mixed; boundary=foobar
+BODY N 0
+BODY N 1 --foobar
mime_state: header_token: multipart / mixed
mime_state: header_token: boundary = foobar
mime_state: PUSH boundary foobar
-MULT content-type: multipart/mixed; boundary=foobar
-BODY N
-BODY N --foobar
+MULT 0 content-type: multipart/mixed; boundary=foobar
+BODY N 0
+BODY N 1 --foobar
mime_state: header_token: multipart / mixed
mime_state: header_token: boundary = foobar
mime_state: PUSH boundary foobar
-MULT content-type: multipart/mixed; boundary=foobar
-BODY N
-BODY N --foobar
+MULT 0 content-type: multipart/mixed; boundary=foobar
+BODY N 0
+BODY N 1 --foobar
mime_state: header_token: multipart / mixed
mime_state: header_token: boundary = foobar
mime_state: PUSH boundary foobar
-MULT content-type: multipart/mixed; boundary=foobar
-BODY N
-BODY N --foobar
+MULT 0 content-type: multipart/mixed; boundary=foobar
+BODY N 0
+BODY N 1 --foobar
mime_state: header_token: multipart / mixed
mime_state: header_token: boundary = foobar
mime_state: PUSH boundary foobar
-MULT content-type: multipart/mixed; boundary=foobar
-BODY N
-BODY N --foobar
+MULT 0 content-type: multipart/mixed; boundary=foobar
+BODY N 0
+BODY N 1 --foobar
mime_state: header_token: multipart / mixed
mime_state: header_token: boundary = foobar
mime_state: PUSH boundary foobar
-MULT content-type: multipart/mixed; boundary=foobar
-BODY N
-BODY N --foobar
+MULT 0 content-type: multipart/mixed; boundary=foobar
+BODY N 0
+BODY N 1 --foobar
mime_state: header_token: multipart / mixed
mime_state: header_token: boundary = foobar
mime_state: PUSH boundary foobar
-MULT content-type: multipart/mixed; boundary=foobar
-BODY N
-BODY N --foobar
+MULT 0 content-type: multipart/mixed; boundary=foobar
+BODY N 0
+BODY N 1 --foobar
mime_state: header_token: multipart / mixed
mime_state: header_token: boundary = foobar
mime_state: PUSH boundary foobar
-MULT content-type: multipart/mixed; boundary=foobar
-BODY N
-BODY N --foobar
+MULT 0 content-type: multipart/mixed; boundary=foobar
+BODY N 0
+BODY N 1 --foobar
mime_state: header_token: multipart / mixed
mime_state: header_token: boundary = foobar
mime_state: PUSH boundary foobar
-MULT content-type: multipart/mixed; boundary=foobar
-BODY N
-BODY N --foobar
+MULT 0 content-type: multipart/mixed; boundary=foobar
+BODY N 0
+BODY N 1 --foobar
mime_state: header_token: multipart / mixed
mime_state: header_token: boundary = foobar
mime_state: PUSH boundary foobar
-MULT content-type: multipart/mixed; boundary=foobar
-BODY N
-BODY N --foobar
+MULT 0 content-type: multipart/mixed; boundary=foobar
+BODY N 0
+BODY N 1 --foobar
mime_state: header_token: multipart / mixed
mime_state: header_token: boundary = foobar
mime_state: PUSH boundary foobar
-MULT content-type: multipart/mixed; boundary=foobar
-BODY N
-BODY N --foobar
+MULT 0 content-type: multipart/mixed; boundary=foobar
+BODY N 0
+BODY N 1 --foobar
mime_state: header_token: multipart / mixed
mime_state: header_token: boundary = foobar
mime_state: PUSH boundary foobar
-MULT content-type: multipart/mixed; boundary=foobar
-BODY N
-BODY N --foobar
+MULT 0 content-type: multipart/mixed; boundary=foobar
+BODY N 0
+BODY N 1 --foobar
mime_state: header_token: multipart / mixed
mime_state: header_token: boundary = foobar
mime_state: warning: MIME nesting exceeds safety limit: content-type: multipart/mixed; boundary=foobar
-MULT content-type: multipart/mixed; boundary=foobar
-BODY N
-BODY N --foobar
+MULT 0 content-type: multipart/mixed; boundary=foobar
+BODY N 0
+BODY N 1 --foobar
BODY END
mime_state: warning: MIME nesting exceeds safety limit
mime_state: POP boundary foobar
diff --git a/postfix/src/global/mime_state.c b/postfix/src/global/mime_state.c
index b5cf003fa..5a3345fe3 100644
--- a/postfix/src/global/mime_state.c
+++ b/postfix/src/global/mime_state.c
@@ -11,12 +11,14 @@
/* err_print, context)
/* int flags;
/* void (*head_out)(void *ptr, int header_class,
-/* HEADER_OPTS *header_info, VSTRING *buf);
+/* HEADER_OPTS *header_info,
+/* VSTRING *buf, off_t offset);
/* void (*head_end)(void *ptr);
/* void (*body_out)(void *ptr, int rec_type,
-/* const char *buf, int len);
+/* const char *buf, int len,
+/* off_t offset);
/* void (*body_end)(void *ptr);
-/* void (*err_print(void *ptr, int err_flag, const char *text)
+/* void (*err_print)(void *ptr, int err_flag, const char *text)
/* void *context;
/*
/* int mime_state_update(state, rec_type, buf, len)
@@ -152,6 +154,9 @@
/* the last message header in the first header block is processed.
/* .IP len
/* Length of non-VSTRING input buffer.
+/* .IP offset
+/* The offset in bytes from the start of the current block of message
+/* headers or body lines. Line boundaries are counted as one byte.
/* .IP rec_type
/* The input record type as defined in rec_type(3h). State is
/* updated for text records (REC_TYPE_NORM or REC_TYPE_CONT).
@@ -274,6 +279,8 @@ struct MIME_STATE {
HEADER_TOKEN token[MIME_MAX_TOKEN]; /* header token array */
VSTRING *token_buffer; /* header parser scratch buffer */
int err_flags; /* processing errors */
+ off_t head_offset; /* offset in header block */
+ off_t body_offset; /* offset in body block */
/*
* Static members.
@@ -316,6 +323,18 @@ struct MIME_STATE {
(ptr)->curr_stype = (stype); \
(ptr)->curr_encoding = (encoding); \
(ptr)->curr_domain = (domain); \
+ if ((state) == MIME_STATE_BODY) \
+ (ptr)->body_offset = 0; \
+ else \
+ (ptr)->head_offset = 0; \
+ } while (0)
+
+#define SET_CURR_STATE(ptr, state) do { \
+ (ptr)->curr_state = (state); \
+ if ((state) == MIME_STATE_BODY) \
+ (ptr)->body_offset = 0; \
+ else \
+ (ptr)->head_offset = 0; \
} while (0)
/*
@@ -364,6 +383,22 @@ static MIME_ENCODING mime_encoding_map[] = { /* RFC 2045 */
} \
} while (0)
+ /*
+ * Outputs and state changes are interleaved, so we must maintain separate
+ * offsets for header and body segments.
+ */
+#define HEAD_OUT(ptr, info) do { \
+ (ptr)->head_out((ptr)->app_context, (ptr)->curr_state, \
+ (info), (ptr)->output_buffer, (ptr)->head_offset); \
+ (ptr)->head_offset += (len) + 1; \
+ } while(0)
+
+#define BODY_OUT(ptr, rec_type, text, len) do { \
+ (ptr)->body_out((ptr)->app_context, (rec_type), \
+ (text), (len), (ptr)->body_offset); \
+ (ptr)->body_offset += (len) + 1; \
+ } while(0)
+
/* mime_state_push - push boundary onto stack */
static void mime_state_push(MIME_STATE *state, int def_ctype, int def_stype,
@@ -635,9 +670,9 @@ static void mime_state_downgrade(MIME_STATE *state, int rec_type,
if (LEN(state->output_buffer) > 72) {
VSTRING_ADDCH(state->output_buffer, '=');
VSTRING_TERMINATE(state->output_buffer);
- state->body_out(state->app_context, REC_TYPE_NORM,
- STR(state->output_buffer),
- LEN(state->output_buffer));
+ BODY_OUT(state, REC_TYPE_NORM,
+ STR(state->output_buffer),
+ LEN(state->output_buffer));
VSTRING_RESET(state->output_buffer);
}
/* Append the next character. */
@@ -662,9 +697,9 @@ static void mime_state_downgrade(MIME_STATE *state, int rec_type,
QP_ENCODE(state->output_buffer, ch);
}
VSTRING_TERMINATE(state->output_buffer);
- state->body_out(state->app_context, REC_TYPE_NORM,
- STR(state->output_buffer),
- LEN(state->output_buffer));
+ BODY_OUT(state, REC_TYPE_NORM,
+ STR(state->output_buffer),
+ LEN(state->output_buffer));
VSTRING_RESET(state->output_buffer);
}
}
@@ -770,8 +805,7 @@ int mime_state_update(MIME_STATE *state, int rec_type,
|| header_info->type != HDR_CONTENT_TRANSFER_ENCODING
|| (state->static_flags & MIME_OPT_DOWNGRADE) == 0
|| state->curr_domain == MIME_ENC_7BIT)
- state->head_out(state->app_context, state->curr_state,
- header_info, state->output_buffer);
+ HEAD_OUT(state, header_info);
state->prev_rec_type = 0;
VSTRING_RESET(state->output_buffer);
}
@@ -821,8 +855,7 @@ int mime_state_update(MIME_STATE *state, int rec_type,
cp = CU_CHAR_PTR("quoted-printable");
vstring_sprintf(state->output_buffer,
"Content-Transfer-Encoding: %s", cp);
- state->head_out(state->app_context, state->curr_state,
- 0, state->output_buffer);
+ HEAD_OUT(state, (HEADER_OPTS *) 0);
VSTRING_RESET(state->output_buffer);
}
@@ -862,9 +895,13 @@ int mime_state_update(MIME_STATE *state, int rec_type,
* agressive mode, examine headers of partial and external-body
* messages. Otherwise, treat such headers as part of the "body". Set
* the proper encoding information for the multipart prolog.
+ *
+ * XXX This changes state to MIME_STATE_NESTED and then outputs a body
+ * line, so that the body offset is not properly reset.
*/
if (input_is_text) {
if (*text == 0) {
+ state->body_offset = 0; /* XXX */
if (state->curr_ctype == MIME_CTYPE_MESSAGE) {
if (state->curr_stype == MIME_STYPE_RFC822
|| (state->static_flags & MIME_OPT_RECURSE_ALL_MESSAGE))
@@ -872,13 +909,13 @@ int mime_state_update(MIME_STATE *state, int rec_type,
MIME_CTYPE_TEXT, MIME_STYPE_PLAIN,
MIME_ENC_7BIT, MIME_ENC_7BIT);
else
- state->curr_state = MIME_STATE_BODY;
+ SET_CURR_STATE(state, MIME_STATE_BODY);
} else if (state->curr_ctype == MIME_CTYPE_MULTIPART) {
SET_MIME_STATE(state, MIME_STATE_BODY,
MIME_CTYPE_OTHER, MIME_STYPE_OTHER,
MIME_ENC_7BIT, MIME_ENC_7BIT);
} else {
- state->curr_state = MIME_STATE_BODY;
+ SET_CURR_STATE(state, MIME_STATE_BODY);
}
}
@@ -887,8 +924,8 @@ int mime_state_update(MIME_STATE *state, int rec_type,
* body state, leaving all other state alone.
*/
else {
- state->body_out(state->app_context, REC_TYPE_NORM, "", 0);
- state->curr_state = MIME_STATE_BODY;
+ SET_CURR_STATE(state, MIME_STATE_BODY);
+ BODY_OUT(state, REC_TYPE_NORM, "", 0);
}
}
@@ -896,7 +933,7 @@ int mime_state_update(MIME_STATE *state, int rec_type,
* This input is not text. Go to body state, unconditionally.
*/
else {
- state->curr_state = MIME_STATE_BODY;
+ SET_CURR_STATE(state, MIME_STATE_BODY);
}
/* FALLTHROUGH */
@@ -957,7 +994,7 @@ int mime_state_update(MIME_STATE *state, int rec_type,
&& state->curr_domain != MIME_ENC_7BIT)
mime_state_downgrade(state, rec_type, text, len);
else
- state->body_out(state->app_context, rec_type, text, len);
+ BODY_OUT(state, rec_type, text, len);
}
/*
@@ -1013,15 +1050,15 @@ const char *mime_state_error(int error_code)
#define REC_LEN 1024
static void head_out(void *context, int class, HEADER_OPTS *unused_info,
- VSTRING *buf)
+ VSTRING *buf, off_t offset)
{
VSTREAM *stream = (VSTREAM *) context;
- vstream_fprintf(stream, "%s\t%s\n",
+ vstream_fprintf(stream, "%s %ld\t%s\n",
class == MIME_HDR_PRIMARY ? "MAIN" :
class == MIME_HDR_MULTIPART ? "MULT" :
class == MIME_HDR_NESTED ? "NEST" :
- "ERROR", STR(buf));
+ "ERROR", (long) offset, STR(buf));
}
static void head_end(void *context)
@@ -1031,11 +1068,12 @@ static void head_end(void *context)
vstream_fprintf(stream, "HEADER END\n");
}
-static void body_out(void *context, int rec_type, const char *buf, int len)
+static void body_out(void *context, int rec_type, const char *buf, int len,
+ off_t offset)
{
VSTREAM *stream = (VSTREAM *) context;
- vstream_fprintf(stream, "BODY %c\t", rec_type);
+ vstream_fprintf(stream, "BODY %c %ld\t", rec_type, (long) offset);
vstream_fwrite(stream, buf, len);
if (rec_type == REC_TYPE_NORM)
VSTREAM_PUTC('\n', stream);
diff --git a/postfix/src/global/mime_state.h b/postfix/src/global/mime_state.h
index 818bd66f1..a3318c881 100644
--- a/postfix/src/global/mime_state.h
+++ b/postfix/src/global/mime_state.h
@@ -25,8 +25,8 @@
* External interface. All MIME_STATE structure members are private.
*/
typedef struct MIME_STATE MIME_STATE;
-typedef void (*MIME_STATE_HEAD_OUT) (void *, int, HEADER_OPTS *, VSTRING *);
-typedef void (*MIME_STATE_BODY_OUT) (void *, int, const char *, int);
+typedef void (*MIME_STATE_HEAD_OUT) (void *, int, HEADER_OPTS *, VSTRING *, off_t);
+typedef void (*MIME_STATE_BODY_OUT) (void *, int, const char *, int, off_t);
typedef void (*MIME_STATE_ANY_END) (void *);
typedef void (*MIME_STATE_ERR_PRINT) (void *, int, const char *);
diff --git a/postfix/src/global/mime_test.ref b/postfix/src/global/mime_test.ref
index ef36f7810..bdae67f1e 100644
--- a/postfix/src/global/mime_test.ref
+++ b/postfix/src/global/mime_test.ref
@@ -1,52 +1,52 @@
-MAIN subject: primary subject
+MAIN 0 subject: primary subject
mime_state: header_token: multipart / mumble
mime_state: header_token: boundary = abcd ef
mime_state: PUSH boundary abcd ef
-MAIN content-type: multipart/(co\m\)ment)mumble mumble; boundary = "ab\cd
+MAIN 71 content-type: multipart/(co\m\)ment)mumble mumble; boundary = "ab\cd
ef" mumble
HEADER END
-BODY N
-BODY N abcdef prolog
-BODY N
-BODY N --abcd ef
+BODY N 0
+BODY N 1 abcdef prolog
+BODY N 15
+BODY N 16 --abcd ef
mime_state: header_token: message / rfc822
-MULT content-type: message/rfc822; mumble
-BODY N
-NEST subject: nested subject
+MULT 0 content-type: message/rfc822; mumble
+BODY N 0
+NEST 0 subject: nested subject
mime_state: header_token: multipart / mumble
mime_state: header_token: boundary = pqrs
mime_state: PUSH boundary pqrs
-NEST content-type: multipart/mumble; boundary(comment)="pqrs"
+NEST 57 content-type: multipart/mumble; boundary(comment)="pqrs"
mime_state: header_token: base64
-NEST content-transfer-encoding: base64
+NEST 91 content-transfer-encoding: base64
mime_state: warning: invalid message/* or multipart/* encoding domain: base64
-BODY N
-BODY N pqrs prolog
-BODY N
-BODY N --pqrs
-MULT header: pqrs part 01
-BODY N
-BODY N body pqrs part 01
-BODY N
-BODY N --pqrs
-MULT header: pqrs part 02
-BODY N
-BODY N body pqrs part 02
-BODY N
-BODY N --bogus-boundary
-BODY N header: wietse
-BODY N
-BODY N body asdasads
-BODY N
+BODY N 0
+BODY N 1 pqrs prolog
+BODY N 13
+BODY N 14 --pqrs
+MULT 0 header: pqrs part 01
+BODY N 0
+BODY N 1 body pqrs part 01
+BODY N 19
+BODY N 20 --pqrs
+MULT 0 header: pqrs part 02
+BODY N 0
+BODY N 1 body pqrs part 02
+BODY N 19
+BODY N 20 --bogus-boundary
+BODY N 37 header: wietse
+BODY N 52
+BODY N 53 body asdasads
+BODY N 67
mime_state: POP boundary pqrs
-BODY N --abcd ef
-MULT header: abcdef part 02
-BODY N
-BODY N body abcdef part 02
-BODY N
+BODY N 68 --abcd ef
+MULT 0 header: abcdef part 02
+BODY N 0
+BODY N 1 body abcdef part 02
+BODY N 21
mime_state: POP boundary abcd ef
-BODY N --abcd ef--
-BODY N
-BODY N epilog
+BODY N 0 --abcd ef--
+BODY N 12
+BODY N 13 epilog
BODY END
mime_state: warning: improper message/* or multipart/* encoding domain
diff --git a/postfix/src/global/mime_trunc.ref b/postfix/src/global/mime_trunc.ref
index c7f0c8eb3..7f38af405 100644
--- a/postfix/src/global/mime_trunc.ref
+++ b/postfix/src/global/mime_trunc.ref
@@ -1,5 +1,5 @@
mime_state: warning: message header length exceeds safety limit: Header: ??garbage garbage garbage garbage garbage garbage garbage garbage garbage ??garbage garbage
-MAIN Header:
+MAIN 0 Header:
garbage garbage garbage garbage garbage garbage garbage garbage garbage
garbage garbage garbage garbage garbage garbage garbage garbage garbage
garbage garbage garbage garbage garbage garbage garbage garbage garbage
diff --git a/postfix/src/smtp/smtp_proto.c b/postfix/src/smtp/smtp_proto.c
index 1b3215110..d13fe66cf 100644
--- a/postfix/src/smtp/smtp_proto.c
+++ b/postfix/src/smtp/smtp_proto.c
@@ -288,7 +288,8 @@ int smtp_helo(SMTP_STATE *state)
/* smtp_text_out - output one header/body record */
static void smtp_text_out(void *context, int rec_type,
- const char *text, int len)
+ const char *text, int len,
+ off_t unused_offset)
{
SMTP_STATE *state = (SMTP_STATE *) context;
SMTP_SESSION *session = state->session;
@@ -333,7 +334,8 @@ static void smtp_text_out(void *context, int rec_type,
/* smtp_header_out - output one message header */
static void smtp_header_out(void *context, int unused_header_class,
- HEADER_OPTS *unused_info, VSTRING *buf)
+ HEADER_OPTS *unused_info, VSTRING *buf,
+ off_t offset)
{
char *start = vstring_str(buf);
char *line;
@@ -342,7 +344,7 @@ static void smtp_header_out(void *context, int unused_header_class,
for (line = start; line; line = next_line) {
next_line = split_at(line, '\n');
smtp_text_out(context, REC_TYPE_NORM, line, next_line ?
- next_line - line - 1 : strlen(line));
+ next_line - line - 1 : strlen(line), offset);
}
}
@@ -799,7 +801,8 @@ int smtp_xfer(SMTP_STATE *state)
if (downgrading == 0) {
smtp_text_out((void *) state, rec_type,
vstring_str(state->scratch),
- VSTRING_LEN(state->scratch));
+ VSTRING_LEN(state->scratch),
+ (off_t) 0);
} else {
mime_errs =
mime_state_update(state->mime_state, rec_type,
diff --git a/postfix/src/smtpd/smtpd.c b/postfix/src/smtpd/smtpd.c
index 56e38bea8..b88803c9a 100644
--- a/postfix/src/smtpd/smtpd.c
+++ b/postfix/src/smtpd/smtpd.c
@@ -781,8 +781,7 @@ static int mail_cmd(SMTPD_STATE *state, int argc, SMTPD_TOKEN *argv)
smtpd_chat_reply(state, "%s", err);
return (-1);
}
- if ((SMTPD_STAND_ALONE(state) || var_smtpd_delay_reject == 0)
- && (err = smtpd_check_size(state, state->msg_size)) != 0) {
+ if ((err = smtpd_check_size(state, state->msg_size)) != 0) {
smtpd_chat_reply(state, "%s", err);
return (-1);
}
diff --git a/postfix/src/smtpd/smtpd_check.c b/postfix/src/smtpd/smtpd_check.c
index 9fe7cfed2..6bb1a2379 100644
--- a/postfix/src/smtpd/smtpd_check.c
+++ b/postfix/src/smtpd/smtpd_check.c
@@ -2983,8 +2983,7 @@ char *smtpd_check_rcpt(SMTPD_STATE *state, char *recipient)
if (var_smtpd_delay_reject)
if ((err = smtpd_check_client(state)) != 0
|| (err = smtpd_check_helo(state, state->helo_name)) != 0
- || (err = smtpd_check_mail(state, state->sender)) != 0
- || (err = smtpd_check_size(state, state->msg_size)) != 0)
+ || (err = smtpd_check_mail(state, state->sender)) != 0)
SMTPD_CHECK_RCPT_RETURN(err);
/*
@@ -3165,6 +3164,7 @@ char *smtpd_check_size(SMTPD_STATE *state, off_t size)
/*
* Return here in case of serious trouble.
*/
+ SMTPD_CHECK_RESET();
if ((status = setjmp(smtpd_check_buf)) != 0)
return (status == SMTPD_CHECK_REJECT ? STR(error_text) : 0);
diff --git a/postfix/src/util/sys_defs.h b/postfix/src/util/sys_defs.h
index b4076daea..d1735d9f8 100644
--- a/postfix/src/util/sys_defs.h
+++ b/postfix/src/util/sys_defs.h
@@ -484,7 +484,7 @@ extern int initgroups(const char *, int);
#define HAS_FLOCK_LOCK
#define HAS_FCNTL_LOCK
#define INTERNAL_LOCK MYFLOCK_STYLE_FLOCK
-#define DEF_MAILBOX_LOCK "flock, dotlock"
+#define DEF_MAILBOX_LOCK "fcntl, dotlock" /* RedHat >= 4.x */
#define HAS_FSYNC
#define HAS_DB
#define DEF_DB_TYPE "hash"
@@ -512,7 +512,7 @@ extern int initgroups(const char *, int);
#define HAS_FLOCK_LOCK
#define HAS_FCNTL_LOCK
#define INTERNAL_LOCK MYFLOCK_STYLE_FLOCK
-#define DEF_MAILBOX_LOCK "flock, dotlock" /* unverified */
+#define DEF_MAILBOX_LOCK "dotlock" /* verified RedHat 3.03 */
#define HAS_FSYNC
#define HAS_DB
#define DEF_DB_TYPE "hash"