Script 'mail_helper' called by obssrc
Hello community,
here is the log from the commit of package perl-MIME-tools for openSUSE:Factory
checked in at 2026-09-08 16:58:10
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/perl-MIME-tools (Old)
and /work/SRC/openSUSE:Factory/.perl-MIME-tools.new.1265 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "perl-MIME-tools"
Tue Sep 8 16:58:10 2026 rev:42 rq:1376319 version:5.518.0
Changes:
--------
--- /work/SRC/openSUSE:Factory/perl-MIME-tools/perl-MIME-tools.changes
2026-03-11 20:53:00.468228160 +0100
+++
/work/SRC/openSUSE:Factory/.perl-MIME-tools.new.1265/perl-MIME-tools.changes
2026-09-08 17:01:40.145877049 +0200
@@ -1,0 +2,20 @@
+Thu Aug 27 16:34:46 UTC 2026 - Tina Müller <[email protected]>
+
+- updated to 5.518.0 (5.518)
+ see /usr/share/doc/packages/perl-MIME-tools/ChangeLog
+
+ 5.518 2026-08-26 Dianne Skoll <[email protected]>
+ * VERSION 5.518 RELEASED
+ * Add tests for encoded "boundary=XXX" parameters and set
+ the ambiguous-parse flag if any are found. Patch courtesy
+ of Dominik Csapak <[email protected]>
+ MIME::tools chooses to decode encoded boundary parameters.
+ MUA behaviors differ; Claws-Mail decodes them while Thunderbird
+ does not.
+ * Don't ignore invalid whitespace after "boundary=XXX" parameter.
+ Patch courtesy of Dominik Csapak <[email protected]>
+ * Ignore comments between tokens. A header parameter can be
+ written foo(comment)=bar and it's the same as foo=bar.
+ Patch courtesy of Dominik Csapak <[email protected]>
+
+-------------------------------------------------------------------
Old:
----
MIME-tools-5.517.tar.gz
New:
----
MIME-tools-5.518.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ perl-MIME-tools.spec ++++++
--- /var/tmp/diff_new_pack.2u3MoY/_old 2026-09-08 17:01:41.096916802 +0200
+++ /var/tmp/diff_new_pack.2u3MoY/_new 2026-09-08 17:01:41.100916969 +0200
@@ -18,10 +18,10 @@
%define cpan_name MIME-tools
Name: perl-MIME-tools
-Version: 5.517.0
+Version: 5.518.0
Release: 0
-# 5.517 -> normalize -> 5.517.0
-%define cpan_version 5.517
+# 5.518 -> normalize -> 5.518.0
+%define cpan_version 5.518
License: Artistic-1.0 OR GPL-1.0-or-later
Summary: Tools to manipulate MIME messages
URL: https://metacpan.org/release/%{cpan_name}
++++++ MIME-tools-5.517.tar.gz -> MIME-tools-5.518.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/MIME-tools-5.517/ChangeLog
new/MIME-tools-5.518/ChangeLog
--- old/MIME-tools-5.517/ChangeLog 2026-02-11 03:51:22.000000000 +0100
+++ new/MIME-tools-5.518/ChangeLog 2026-08-26 18:30:59.000000000 +0200
@@ -1,3 +1,22 @@
+5.518 2026-08-26 Dianne Skoll <[email protected]>
+
+ * VERSION 5.518 RELEASED
+
+ * Add tests for encoded "boundary=XXX" parameters and set
+ the ambiguous-parse flag if any are found. Patch courtesy
+ of Dominik Csapak <[email protected]>
+
+ MIME::tools chooses to decode encoded boundary parameters.
+ MUA behaviors differ; Claws-Mail decodes them while Thunderbird
+ does not.
+
+ * Don't ignore invalid whitespace after "boundary=XXX" parameter.
+ Patch courtesy of Dominik Csapak <[email protected]>
+
+ * Ignore comments between tokens. A header parameter can be
+ written foo(comment)=bar and it's the same as foo=bar.
+ Patch courtesy of Dominik Csapak <[email protected]>
+
5.517 2026-02-10 Dianne Skoll <[email protected]>
* VERSION 5.517 RELEASED
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/MIME-tools-5.517/MANIFEST
new/MIME-tools-5.518/MANIFEST
--- old/MIME-tools-5.517/MANIFEST 2026-02-11 03:48:51.000000000 +0100
+++ new/MIME-tools-5.518/MANIFEST 2026-08-26 18:32:22.000000000 +0200
@@ -150,6 +150,7 @@
testmsgs/bluedot-postcard.ref
testmsgs/bluedot-simple.msg
testmsgs/bluedot-simple.ref
+testmsgs/double-boundary-with-comment.msg
testmsgs/double-boundary.msg
testmsgs/double-content-disposition-param.msg
testmsgs/double-content-disposition.msg
@@ -161,8 +162,8 @@
testmsgs/dup-names.msg
testmsgs/dup-names.ref
testmsgs/empty-boundary.msg
-testmsgs/empty-quoted-boundary.msg
testmsgs/empty-preamble.msg
+testmsgs/empty-quoted-boundary.msg
testmsgs/frag.msg
testmsgs/german-qp.msg
testmsgs/german.msg
@@ -170,6 +171,8 @@
testmsgs/hdr-fakeout-newmailtools-ref
testmsgs/hdr-fakeout.msg
testmsgs/hdr-fakeout.ref
+testmsgs/invalid-boundary.msg
+testmsgs/invalid-quoted-boundary.msg
testmsgs/malformed-content-type-zip.msg
testmsgs/multi-2evil.msg
testmsgs/multi-2evil.ref
@@ -194,14 +197,17 @@
testmsgs/multi-simple.ref
testmsgs/multi-weirdspace.msg
testmsgs/multi-weirdspace.ref
+testmsgs/qpboundary.msg
testmsgs/re-fwd.msg
testmsgs/re-fwd.ref
+testmsgs/rfc2231boundary.msg
testmsgs/russian.msg
testmsgs/russian.ref
testmsgs/simple.msg
testmsgs/simple.ref
testmsgs/ticket-60931.msg
testmsgs/triple-boundary-one-empty.msg
+testmsgs/unusual-space-in-boundary.msg
testmsgs/utf8-bom-at-start.msg
testmsgs/uu-junk-extracted.ref
testmsgs/uu-junk-target.msg
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/MIME-tools-5.517/META.yml
new/MIME-tools-5.518/META.yml
--- old/MIME-tools-5.517/META.yml 2026-02-11 03:51:36.000000000 +0100
+++ new/MIME-tools-5.518/META.yml 2026-08-26 18:25:15.000000000 +0200
@@ -37,4 +37,4 @@
perl: 5.8.0
resources:
license: http://dev.perl.org/licenses/
-version: 5.517
+version: 5.518
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/MIME-tools-5.517/MYMETA.json
new/MIME-tools-5.518/MYMETA.json
--- old/MIME-tools-5.517/MYMETA.json 2026-02-11 03:52:31.000000000 +0100
+++ new/MIME-tools-5.518/MYMETA.json 2026-08-26 18:32:41.000000000 +0200
@@ -58,7 +58,7 @@
"http://dev.perl.org/licenses/"
]
},
- "version" : "5.517",
+ "version" : "5.518",
"x_module_name" : "MIME::Tools",
"x_serialization_backend" : "JSON::PP version 4.16"
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/MIME-tools-5.517/MYMETA.yml
new/MIME-tools-5.518/MYMETA.yml
--- old/MIME-tools-5.517/MYMETA.yml 2026-02-11 03:52:31.000000000 +0100
+++ new/MIME-tools-5.518/MYMETA.yml 2026-08-26 18:32:41.000000000 +0200
@@ -36,6 +36,6 @@
perl: '5.008'
resources:
license: http://dev.perl.org/licenses/
-version: '5.517'
+version: '5.518'
x_module_name: MIME::Tools
x_serialization_backend: 'CPAN::Meta::YAML version 0.018'
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/MIME-tools-5.517/lib/MIME/Body.pm
new/MIME-tools-5.518/lib/MIME/Body.pm
--- old/MIME-tools-5.517/lib/MIME/Body.pm 2026-02-11 03:51:36.000000000
+0100
+++ new/MIME-tools-5.518/lib/MIME/Body.pm 2026-08-26 18:25:15.000000000
+0200
@@ -141,7 +141,7 @@
use IO::File;
### The package version, both in 1.23 style *and* usable by MakeMaker:
-$VERSION = "5.517";
+$VERSION = "5.518";
#------------------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/MIME-tools-5.517/lib/MIME/Decoder/Base64.pm
new/MIME-tools-5.518/lib/MIME/Decoder/Base64.pm
--- old/MIME-tools-5.517/lib/MIME/Decoder/Base64.pm 2026-02-11
03:51:36.000000000 +0100
+++ new/MIME-tools-5.518/lib/MIME/Decoder/Base64.pm 2026-08-26
18:25:15.000000000 +0200
@@ -57,7 +57,7 @@
@ISA = qw(MIME::Decoder);
### The package version, both in 1.23 style *and* usable by MakeMaker:
-$VERSION = "5.517";
+$VERSION = "5.518";
### How many bytes to encode at a time (must be a multiple of 3)
my $EncodeChunkLength = 120 * 57;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/MIME-tools-5.517/lib/MIME/Decoder/BinHex.pm
new/MIME-tools-5.518/lib/MIME/Decoder/BinHex.pm
--- old/MIME-tools-5.517/lib/MIME/Decoder/BinHex.pm 2026-02-11
03:51:36.000000000 +0100
+++ new/MIME-tools-5.518/lib/MIME/Decoder/BinHex.pm 2026-08-26
18:25:15.000000000 +0200
@@ -47,7 +47,7 @@
@ISA = qw(MIME::Decoder);
# The package version, both in 1.23 style *and* usable by MakeMaker:
-$VERSION = "5.517";
+$VERSION = "5.518";
#------------------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/MIME-tools-5.517/lib/MIME/Decoder/Binary.pm
new/MIME-tools-5.518/lib/MIME/Decoder/Binary.pm
--- old/MIME-tools-5.517/lib/MIME/Decoder/Binary.pm 2026-02-11
03:51:36.000000000 +0100
+++ new/MIME-tools-5.518/lib/MIME/Decoder/Binary.pm 2026-08-26
18:25:15.000000000 +0200
@@ -47,7 +47,7 @@
@ISA = qw(MIME::Decoder);
### The package version, both in 1.23 style *and* usable by MakeMaker:
-$VERSION = "5.517";
+$VERSION = "5.518";
### Buffer length:
my $BUFLEN = 8192;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/MIME-tools-5.517/lib/MIME/Decoder/Gzip64.pm
new/MIME-tools-5.518/lib/MIME/Decoder/Gzip64.pm
--- old/MIME-tools-5.517/lib/MIME/Decoder/Gzip64.pm 2026-02-11
03:51:36.000000000 +0100
+++ new/MIME-tools-5.518/lib/MIME/Decoder/Gzip64.pm 2026-08-26
18:25:15.000000000 +0200
@@ -61,7 +61,7 @@
@ISA = qw(MIME::Decoder::Base64);
# The package version, both in 1.23 style *and* usable by MakeMaker:
-$VERSION = "5.517";
+$VERSION = "5.518";
# How to compress stdin to stdout:
$GZIP = "gzip -c";
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/MIME-tools-5.517/lib/MIME/Decoder/NBit.pm
new/MIME-tools-5.518/lib/MIME/Decoder/NBit.pm
--- old/MIME-tools-5.517/lib/MIME/Decoder/NBit.pm 2026-02-11
03:51:36.000000000 +0100
+++ new/MIME-tools-5.518/lib/MIME/Decoder/NBit.pm 2026-08-26
18:25:15.000000000 +0200
@@ -98,7 +98,7 @@
@ISA = qw(MIME::Decoder);
### The package version, both in 1.23 style *and* usable by MakeMaker:
-$VERSION = "5.517";
+$VERSION = "5.518";
### How many bytes to decode at a time?
my $DecodeChunkLength = 8 * 1024;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/MIME-tools-5.517/lib/MIME/Decoder/QuotedPrint.pm
new/MIME-tools-5.518/lib/MIME/Decoder/QuotedPrint.pm
--- old/MIME-tools-5.517/lib/MIME/Decoder/QuotedPrint.pm 2026-02-11
03:51:36.000000000 +0100
+++ new/MIME-tools-5.518/lib/MIME/Decoder/QuotedPrint.pm 2026-08-26
18:25:15.000000000 +0200
@@ -58,7 +58,7 @@
@ISA = qw(MIME::Decoder);
# The package version, both in 1.23 style *and* usable by MakeMaker:
-$VERSION = "5.517";
+$VERSION = "5.518";
#------------------------------
# If we have MIME::QuotedPrint 3.03 or later, use the three-argument
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/MIME-tools-5.517/lib/MIME/Decoder/UU.pm
new/MIME-tools-5.518/lib/MIME/Decoder/UU.pm
--- old/MIME-tools-5.517/lib/MIME/Decoder/UU.pm 2026-02-11 03:51:36.000000000
+0100
+++ new/MIME-tools-5.518/lib/MIME/Decoder/UU.pm 2026-08-26 18:25:15.000000000
+0200
@@ -48,7 +48,7 @@
@ISA = qw(MIME::Decoder);
# The package version, both in 1.23 style *and* usable by MakeMaker:
-$VERSION = "5.517";
+$VERSION = "5.518";
#------------------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/MIME-tools-5.517/lib/MIME/Decoder.pm
new/MIME-tools-5.518/lib/MIME/Decoder.pm
--- old/MIME-tools-5.517/lib/MIME/Decoder.pm 2026-02-11 03:51:36.000000000
+0100
+++ new/MIME-tools-5.518/lib/MIME/Decoder.pm 2026-08-26 18:25:15.000000000
+0200
@@ -126,7 +126,7 @@
);
### The package version, both in 1.23 style *and* usable by MakeMaker:
-$VERSION = "5.517";
+$VERSION = "5.518";
### Me:
my $ME = 'MIME::Decoder';
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/MIME-tools-5.517/lib/MIME/Entity.pm
new/MIME-tools-5.518/lib/MIME/Entity.pm
--- old/MIME-tools-5.517/lib/MIME/Entity.pm 2026-02-11 03:51:36.000000000
+0100
+++ new/MIME-tools-5.518/lib/MIME/Entity.pm 2026-08-26 18:25:15.000000000
+0200
@@ -255,7 +255,7 @@
#------------------------------
### The package version, both in 1.23 style *and* usable by MakeMaker:
-$VERSION = "5.517";
+$VERSION = "5.518";
### Boundary counter:
my $BCount = 0;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/MIME-tools-5.517/lib/MIME/Field/ConTraEnc.pm
new/MIME-tools-5.518/lib/MIME/Field/ConTraEnc.pm
--- old/MIME-tools-5.517/lib/MIME/Field/ConTraEnc.pm 2026-02-11
03:51:36.000000000 +0100
+++ new/MIME-tools-5.518/lib/MIME/Field/ConTraEnc.pm 2026-08-26
18:25:15.000000000 +0200
@@ -47,7 +47,7 @@
@ISA = qw(MIME::Field::ParamVal);
# The package version, both in 1.23 style *and* usable by MakeMaker:
-$VERSION = "5.517";
+$VERSION = "5.518";
# Install it:
bless([])->register('Content-transfer-encoding');
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/MIME-tools-5.517/lib/MIME/Field/ContDisp.pm
new/MIME-tools-5.518/lib/MIME/Field/ContDisp.pm
--- old/MIME-tools-5.517/lib/MIME/Field/ContDisp.pm 2026-02-11
03:51:36.000000000 +0100
+++ new/MIME-tools-5.518/lib/MIME/Field/ContDisp.pm 2026-08-26
18:25:15.000000000 +0200
@@ -48,7 +48,7 @@
@ISA = qw(MIME::Field::ParamVal);
# The package version, both in 1.23 style *and* usable by MakeMaker:
-$VERSION = "5.517";
+$VERSION = "5.518";
# Install it:
bless([])->register('Content-disposition');
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/MIME-tools-5.517/lib/MIME/Field/ContType.pm
new/MIME-tools-5.518/lib/MIME/Field/ContType.pm
--- old/MIME-tools-5.517/lib/MIME/Field/ContType.pm 2026-02-11
03:51:36.000000000 +0100
+++ new/MIME-tools-5.518/lib/MIME/Field/ContType.pm 2026-08-26
18:25:15.000000000 +0200
@@ -58,12 +58,13 @@
require 5.001;
use strict;
use MIME::Field::ParamVal;
+use MIME::Words qw(decode_mimewords);
use vars qw($VERSION @ISA);
@ISA = qw(MIME::Field::ParamVal);
# The package version, both in 1.23 style *and* usable by MakeMaker:
-$VERSION = "5.517";
+$VERSION = "5.518";
# Install it:
bless([])->register('Content-type');
@@ -113,8 +114,9 @@
sub boundary {
my $value = shift->param('boundary', @_);
defined($value) || return '';
- $value =~ s/\s+$//; # kill trailing white, per RFC 2046
- $value;
+ $value = decode_mimewords($value);
+ $value =~ s/\s+$//; # kill trailing whitespace, per RFC
2046
+ return $value;
}
#------------------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/MIME-tools-5.517/lib/MIME/Field/ParamVal.pm
new/MIME-tools-5.518/lib/MIME/Field/ParamVal.pm
--- old/MIME-tools-5.517/lib/MIME/Field/ParamVal.pm 2026-02-11
03:51:36.000000000 +0100
+++ new/MIME-tools-5.518/lib/MIME/Field/ParamVal.pm 2026-08-26
18:25:15.000000000 +0200
@@ -80,7 +80,7 @@
#------------------------------
# The package version, both in 1.23 style *and* usable by MakeMaker:
-$VERSION = "5.517";
+$VERSION = "5.518";
#------------------------------
@@ -90,7 +90,7 @@
#------------------------------
# Pattern to match parameter names (like fieldnames, but = not allowed):
-my $PARAMNAME = '[^\x00-\x1f\x80-\xff :=]+';
+my $PARAMNAME = '[^\x00-\x1f\x80-\xff :=]+?';
# Pattern to match the first value on the line:
my $FIRST = '[^\s\;\x00-\x1f\x80-\xff]*';
@@ -110,13 +110,19 @@
# Encoded token:
my $ENCTOKEN = "=\\?[^?]*\\?[A-Za-z]\\?[^?]+\\?=";
+# pattern to match comments
+my $COMMENT = '\([^\)]*\)';
+
# Pattern to match spaces or comments:
-my $SPCZ = '(?:\s|\([^\)]*\))*';
+my $SPCZ = '(?:\s|' . $COMMENT . ')*';
# Pattern to match non-semicolon as fallback for broken MIME
# produced by some viruses
my $BADTOKEN = '[^;]+';
+# Pattern to match whitespace allowed in header
+my $WSP = '[\t\ ]';
+
#------------------------------
#
# Class init...
@@ -237,13 +243,25 @@
$raw =~ m/\A$SPCZ($FIRST)$SPCZ/og or return {}; # nada!
$params{'_'} = $1;
+ my $boundary_leftover = 0;
+ my $saw_semicolon= 0;
+
# Extract subsequent parameters.
# No, we can't just "split" on semicolons: they're legal in quoted strings!
while (1) { # keep chopping away until done...
- $raw =~ m/\G[^;]*(\;$SPCZ)+/og or last; # skip leading
separator
- $raw =~ m/\G($PARAMNAME)\s*=\s*/og or last; # give up if not a
param
+ $saw_semicolon = 0;
+ $raw =~ m/\G([^;]*)(\;$SPCZ)+/ogc or last; # skip leading
separator
+ my $leftover = $1;
+ $saw_semicolon = 1;
+
+ # the previous param was 'boundary' and we had leftover data
+ if (defined($leftover) && length($leftover) > 0 && defined($param) &&
$param eq 'boundary') {
+ $boundary_leftover = 1;
+ }
+
+ $raw =~ m/\G($PARAMNAME)($COMMENT|$WSP)*=($COMMENT|$WSP)*/ogc or last;
# give up if not a param
$param = lc($1);
- $raw =~ m/\G(?:$QUOTED_STRING|($ENCTOKEN)|($TOKEN)|($BADTOKEN)|())/g or
last;
+ $raw =~ m/\G(?:$QUOTED_STRING|($ENCTOKEN)|($TOKEN)|($BADTOKEN)|())/gc
or last;
my ($qstr, $enctoken, $token, $badtoken, $empty_value) = ($1, $2, $3,
$4, $5);
if (defined($qstr)) {
# unescape
@@ -251,23 +269,36 @@
}
if (defined($badtoken)) {
# Strip leading/trailing whitespace from badtoken
- $badtoken =~ s/^\s+//;
- $badtoken =~ s/\s+\z//;
+ $badtoken =~ s/^$WSP+//;
+ $badtoken =~ s/$WSP+\z//;
# Only keep token parameters in badtoken;
# cut it off at the first non-token char. CPAN RT #105455
+ my $old_badtoken = $badtoken;
$badtoken =~ /^($TOKEN)*/;
$badtoken = $1;
if (defined($badtoken)) {
# Cut it off at first whitespace too
$badtoken =~ s/\s.*//;
}
+
+ # there was a leftover after the last valid token
+ if ($param eq 'boundary') {
+ $boundary_leftover = 1 if defined($badtoken) && $badtoken ne
$old_badtoken;
+ $boundary_leftover = 1 if !defined($badtoken) &&
length($old_badtoken) > 0;
+ }
}
$val = defined($qstr) ? $qstr :
(defined($enctoken) ? $enctoken :
(defined($badtoken) ? $badtoken :
(defined($token) ? $token : $empty_value)));
+ # Mark parse ambiguous if boundary parameter is encoded
+ if ($param eq 'boundary') {
+ if (defined($val) && $val =~ /^=\?.*\?[A-Z]\?.*\?=$/i) {
+ $params{'@boundary_ambiguous'} = 1;
+ }
+ }
# Do RFC 2231 processing
# Pick out the parts of the parameter
if ($param =~ /\*/ &&
@@ -298,6 +329,14 @@
}
}
+ # the last field was 'boundary' and there were non separator characters
left
+ my $pos = pos($raw);
+ if (($param // '') eq 'boundary' && defined($pos) && $pos < length($raw)
&& !$saw_semicolon) {
+ $boundary_leftover = 1;
+ }
+
+ my $boundary_is_rfc2231 = 0;
+
# Extract reconstructed parameters
foreach $param (keys %rfc2231params) {
# If we got any rfc-2231 parameters, then
@@ -310,6 +349,9 @@
$params{$param} .= $rfc2231params{$param}{$part};
}
if ($rfc2231encoding_is_used{$param}) {
+ # there is no reason for the boundary to be encoded this way, since
+ # non-ascii characters are not allowed later anyway, so mark this
+ $boundary_is_rfc2231 = 1 if $param eq 'boundary';
my($enc, $lang, $val) = rfc2231decode($params{$param});
if (defined $enc) {
# re-encode as QP, preserving charset and language info
@@ -340,6 +382,11 @@
if (%empty_params) {
$params{'@empty_parameters'} = [ sort(keys(%empty_params)) ];
}
+
+ if ($boundary_is_rfc2231 || $boundary_leftover) {
+ $params{'@boundary_ambiguous'} = 1;
+ }
+
# Done:
\%params;
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/MIME-tools-5.517/lib/MIME/Head.pm
new/MIME-tools-5.518/lib/MIME/Head.pm
--- old/MIME-tools-5.517/lib/MIME/Head.pm 2026-02-11 03:51:36.000000000
+0100
+++ new/MIME-tools-5.518/lib/MIME/Head.pm 2026-08-26 18:25:15.000000000
+0200
@@ -159,7 +159,7 @@
#------------------------------
### The package version, both in 1.23 style *and* usable by MakeMaker:
-$VERSION = "5.517";
+$VERSION = "5.518";
### Sanity (we put this test after our own version, for CPAN::):
use Mail::Header 1.06 ();
@@ -205,6 +205,8 @@
A Content-Type or Content-Disposition header contains a repeated
parameter.
+A Content-Type header contains a boundary that is ambiguous.
+
=back
Messages with ambiguous content should be treated as a security risk.
@@ -229,6 +231,11 @@
return 1;
}
}
+
+ if ($self->mime_attr('content-type.@boundary_ambiguous')) {
+ return 1;
+ }
+
return 0;
}
#------------------------------
@@ -869,7 +876,10 @@
sub multipart_boundary {
my $self = shift;
my $value = $self->mime_attr('content-type.boundary');
- (!defined($value)) ? undef : $value;
+ return undef unless defined($value);
+ $value = decode_mimewords($value);
+ $value =~ s/\s+$//; # kill trailing whitespace, per RFC
2046
+ return $value;
}
#------------------------------
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/MIME-tools-5.517/lib/MIME/Parser.pm
new/MIME-tools-5.518/lib/MIME/Parser.pm
--- old/MIME-tools-5.517/lib/MIME/Parser.pm 2026-02-11 03:51:36.000000000
+0100
+++ new/MIME-tools-5.518/lib/MIME/Parser.pm 2026-08-26 18:25:15.000000000
+0200
@@ -153,7 +153,7 @@
#------------------------------
### The package version, both in 1.23 style *and* usable by MakeMaker:
-$VERSION = "5.517";
+$VERSION = "5.518";
### How to catenate:
$CAT = '/bin/cat';
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/MIME-tools-5.517/lib/MIME/Tools.pm
new/MIME-tools-5.518/lib/MIME/Tools.pm
--- old/MIME-tools-5.517/lib/MIME/Tools.pm 2026-02-11 03:51:33.000000000
+0100
+++ new/MIME-tools-5.518/lib/MIME/Tools.pm 2026-08-26 18:25:13.000000000
+0200
@@ -28,7 +28,7 @@
Exporter::export_ok_tags('config', 'msgs', 'msgtypes', 'utils');
# The TOOLKIT version, both in 1.23 style *and* usable by MakeMaker:
-$VERSION = "5.517";
+$VERSION = "5.518";
# Configuration (do NOT alter this directly)...
# All legal CONFIG vars *must* be in here, even if only to be set to undef:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/MIME-tools-5.517/lib/MIME/Words.pm
new/MIME-tools-5.518/lib/MIME/Words.pm
--- old/MIME-tools-5.517/lib/MIME/Words.pm 2026-02-11 03:51:36.000000000
+0100
+++ new/MIME-tools-5.518/lib/MIME/Words.pm 2026-08-26 18:25:15.000000000
+0200
@@ -94,7 +94,7 @@
#------------------------------
### The package version, both in 1.23 style *and* usable by MakeMaker:
-$VERSION = "5.517";
+$VERSION = "5.518";
### Nonprintables (controls + x7F + 8bit):
my $NONPRINT = "\\x00-\\x1F\\x7F-\\xFF";
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/MIME-tools-5.517/t/ambiguous-parse.t
new/MIME-tools-5.518/t/ambiguous-parse.t
--- old/MIME-tools-5.517/t/ambiguous-parse.t 2026-02-09 17:07:40.000000000
+0100
+++ new/MIME-tools-5.518/t/ambiguous-parse.t 2026-08-25 16:16:44.000000000
+0200
@@ -2,7 +2,7 @@
use strict;
use warnings;
use Test::Deep;
-use Test::More tests => 32;
+use Test::More tests => 53;
use MIME::Entity;
use MIME::Parser;
@@ -76,3 +76,49 @@
ok($parser->ambiguous_content(), 'Ambiguous content was detected in message
with "" boundary parameter');
ok($entity->ambiguous_content(), 'Entity method matches parser method');
+$entity = $parser->parse_open('testmsgs/rfc2231boundary.msg');
+$ans = $entity->head->mime_attr('content-type.@boundary_ambiguous');
+ok(defined($ans), 'No ambiguous boundary found');
+ok($parser->ambiguous_content(), 'Ambiguous content was detected in message
with rfc2231 boundary parameter');
+# Ensure that we actually decoded the boundary
+is ($entity->head->multipart_boundary, 'X', 'Boundary parameter was decoded');
+
+# And ensure we parsed the message using the decoded boundary
+my @parts = $entity->parts;
+is (scalar(@parts), 2, 'Got two parts');
+is ($parts[0]->head->mime_type, 'text/plain', 'First part is text/plain');
+is ($parts[1]->head->mime_type, 'application/octet-stream', 'Second part is
application/octet-stream');
+
+$entity = $parser->parse_open('testmsgs/qpboundary.msg');
+$ans = $entity->head->mime_attr('content-type.@boundary_ambiguous');
+ok(defined($ans), 'No ambiguous boundary found');
+ok($parser->ambiguous_content(), 'Ambiguous content was detected in message
with quoted-printable encoded boundary parameter');
+# Ensure that we actually decoded the boundary
+is ($entity->head->multipart_boundary, 'X', 'Boundary parameter was decoded');
+
+# And ensure we parsed the message using the decoded boundary
+@parts = $entity->parts;
+is (scalar(@parts), 2, 'Got two parts');
+is ($parts[0]->head->mime_type, 'text/plain', 'First part is text/plain');
+is ($parts[1]->head->mime_type, 'application/octet-stream', 'Second part is
application/octet-stream');
+
+$entity = $parser->parse_open('testmsgs/invalid-boundary.msg');
+$ans = $entity->head->mime_attr('content-type.@boundary_ambiguous');
+ok(defined($ans), 'No ambiguous boundary found');
+ok($parser->ambiguous_content(), 'Ambiguous content was detected in message
with non rfc 2045 conform boundary parameter');
+
+$entity = $parser->parse_open('testmsgs/invalid-quoted-boundary.msg');
+$ans = $entity->head->mime_attr('content-type.@boundary_ambiguous');
+ok(defined($ans), 'No ambiguous boundary found');
+ok($parser->ambiguous_content(), 'Ambiguous content was detected in message
with non rfc 2045 conform boundary parameter');
+
+$entity = $parser->parse_open('testmsgs/unusual-space-in-boundary.msg');
+$ans = $entity->head->mime_attr('content-type.@boundary_ambiguous');
+ok(defined($ans), 'No ambiguous boundary found');
+ok($parser->ambiguous_content(), 'Ambiguous content was detected in message
with unusual white space in boundary parameter');
+
+$entity = $parser->parse_open('testmsgs/double-boundary-with-comment.msg');
+$ans = $entity->head->mime_attr('content-type.@duplicate_parameters');
+ok(defined($ans), 'No duplicate parameters');
+cmp_deeply($ans, ['boundary'], 'Duplicate "boundary" parameter was detected in
bad message');
+ok($parser->ambiguous_content(), 'Ambiguous content was detected in message
with duplicate boundary parameters, one of them with comment');
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/MIME-tools-5.517/t/ticket-119568.t
new/MIME-tools-5.518/t/ticket-119568.t
--- old/MIME-tools-5.517/t/ticket-119568.t 2026-02-11 03:52:04.000000000
+0100
+++ new/MIME-tools-5.518/t/ticket-119568.t 2026-08-26 18:26:19.000000000
+0200
@@ -13,7 +13,7 @@
Data => ["Line 1\n", "Line 2\n"],);
my $str = $e->as_string();
-is ($str, "Content-Type: text/plain\nContent-Disposition:
inline\nContent-Transfer-Encoding: binary\nMIME-Version: 1.0\nX-Mailer:
MIME-tools 5.517 (Entity 5.517)\nFrom: dianne\@skoll.ca\nTo:
dfs2\@roaringpenguin.com\nSubject: End-of-line test\n\nLine 1\nLine 2\n", 'Got
expected line endings');
+is ($str, "Content-Type: text/plain\nContent-Disposition:
inline\nContent-Transfer-Encoding: binary\nMIME-Version: 1.0\nX-Mailer:
MIME-tools 5.518 (Entity 5.518)\nFrom: dianne\@skoll.ca\nTo:
dfs2\@roaringpenguin.com\nSubject: End-of-line test\n\nLine 1\nLine 2\n", 'Got
expected line endings');
my $delim = "\r\n";
$MIME::Entity::BOUNDARY_DELIMITER = $delim;
@@ -24,7 +24,7 @@
$str = $e->as_string();
-is ($str, "Content-Type: text/plain${delim}Content-Disposition:
inline${delim}Content-Transfer-Encoding: binary${delim}MIME-Version:
1.0${delim}X-Mailer: MIME-tools 5.517 (Entity 5.517)${delim}From:
dianne\@skoll.ca${delim}To: dfs2\@roaringpenguin.com${delim}Subject:
End-of-line test${delim}${delim}Line 1${delim}Line 2${delim}", 'Got expected
line endings');
+is ($str, "Content-Type: text/plain${delim}Content-Disposition:
inline${delim}Content-Transfer-Encoding: binary${delim}MIME-Version:
1.0${delim}X-Mailer: MIME-tools 5.518 (Entity 5.518)${delim}From:
dianne\@skoll.ca${delim}To: dfs2\@roaringpenguin.com${delim}Subject:
End-of-line test${delim}${delim}Line 1${delim}Line 2${delim}", 'Got expected
line endings');
$e->attach(Data => ["More Text$delim"], Type => "text/plain");
@@ -35,7 +35,7 @@
$e->attach(Data => ["Text$delim"], Type => "text/plain");
$e->attach(Data => ["More Text$delim"], Type => "text/plain");
$str = $e->as_string();
-is ($str, "Content-Type: multipart/mixed;
boundary=\"foo\"${delim}Content-Transfer-Encoding: binary${delim}MIME-Version:
1.0${delim}X-Mailer: MIME-tools 5.517 (Entity 5.517)${delim}From:
dianne\@skoll.ca${delim}To: dfs2\@roaringpenguin.com${delim}Subject:
End-of-line test${delim}${delim}This is a multi-part message in MIME
format...${delim}${delim}--foo${delim}Content-Type:
text/plain${delim}Content-Disposition: inline${delim}Content-Transfer-Encoding:
binary${delim}${delim}Text${delim}${delim}--foo${delim}Content-Type:
text/plain${delim}Content-Disposition: inline${delim}Content-Transfer-Encoding:
binary${delim}${delim}More Text${delim}${delim}--foo--${delim}", 'Got expected
line endings');
+is ($str, "Content-Type: multipart/mixed;
boundary=\"foo\"${delim}Content-Transfer-Encoding: binary${delim}MIME-Version:
1.0${delim}X-Mailer: MIME-tools 5.518 (Entity 5.518)${delim}From:
dianne\@skoll.ca${delim}To: dfs2\@roaringpenguin.com${delim}Subject:
End-of-line test${delim}${delim}This is a multi-part message in MIME
format...${delim}${delim}--foo${delim}Content-Type:
text/plain${delim}Content-Disposition: inline${delim}Content-Transfer-Encoding:
binary${delim}${delim}Text${delim}${delim}--foo${delim}Content-Type:
text/plain${delim}Content-Disposition: inline${delim}Content-Transfer-Encoding:
binary${delim}${delim}More Text${delim}${delim}--foo--${delim}", 'Got expected
line endings');
$e = MIME::Entity->build(From => '[email protected]',
To => '[email protected]',
@@ -45,5 +45,5 @@
$e->attach(Data => ["More Text\n", 'LongLine' x 120], Type => "text/plain",
Encoding => 'Base64');
$str = $e->as_string();
-is ($str, "Content-Type: multipart/mixed;
boundary=\"foo\"${delim}Content-Transfer-Encoding: binary${delim}MIME-Version:
1.0${delim}X-Mailer: MIME-tools 5.517 (Entity 5.517)${delim}From:
dianne\@skoll.ca${delim}To: dfs2\@roaringpenguin.com${delim}Subject:
End-of-line test${delim}${delim}This is a multi-part message in MIME
format...${delim}${delim}--foo${delim}Content-Type:
text/plain${delim}Content-Disposition: inline${delim}Content-Transfer-Encoding:
Base64${delim}${delim}VGV4dAo=${delim}${delim}--foo${delim}Content-Type:
text/plain${delim}Content-Disposition: inline${delim}Content-Transfer-Encoding:
Base64${delim}${delim}TW9yZSBUZXh0CkxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGlu${delim}ZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5l${delim}TG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVM${delim}b25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxv${delim}bmdMaW5lTG9uZ0xpbmVMb25nTGluZ
UxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9u${delim}Z0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25n${delim}TGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdM${delim}aW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xp${delim}bmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGlu${delim}ZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5l${delim}TG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVM${delim}b25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxv${delim}bmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9u${delim}Z0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25n${delim}TGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdM${delim}aW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xp${delim}bmVMb25nTGluZUxvbm
dMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGlu${delim}ZQ==${delim}${delim}--foo--${delim}",
'Got expected line endings for Base64 encoding');
+is ($str, "Content-Type: multipart/mixed;
boundary=\"foo\"${delim}Content-Transfer-Encoding: binary${delim}MIME-Version:
1.0${delim}X-Mailer: MIME-tools 5.518 (Entity 5.518)${delim}From:
dianne\@skoll.ca${delim}To: dfs2\@roaringpenguin.com${delim}Subject:
End-of-line test${delim}${delim}This is a multi-part message in MIME
format...${delim}${delim}--foo${delim}Content-Type:
text/plain${delim}Content-Disposition: inline${delim}Content-Transfer-Encoding:
Base64${delim}${delim}VGV4dAo=${delim}${delim}--foo${delim}Content-Type:
text/plain${delim}Content-Disposition: inline${delim}Content-Transfer-Encoding:
Base64${delim}${delim}TW9yZSBUZXh0CkxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGlu${delim}ZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5l${delim}TG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVM${delim}b25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxv${delim}bmdMaW5lTG9uZ0xpbmVMb25nTGluZ
UxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9u${delim}Z0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25n${delim}TGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdM${delim}aW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xp${delim}bmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGlu${delim}ZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5l${delim}TG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVM${delim}b25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxv${delim}bmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9u${delim}Z0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25n${delim}TGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdM${delim}aW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xp${delim}bmVMb25nTGluZUxvbm
dMaW5lTG9uZ0xpbmVMb25nTGluZUxvbmdMaW5lTG9uZ0xpbmVMb25nTGlu${delim}ZQ==${delim}${delim}--foo--${delim}",
'Got expected line endings for Base64 encoding');
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/MIME-tools-5.517/testmsgs/double-boundary-with-comment.msg
new/MIME-tools-5.518/testmsgs/double-boundary-with-comment.msg
--- old/MIME-tools-5.517/testmsgs/double-boundary-with-comment.msg
1970-01-01 01:00:00.000000000 +0100
+++ new/MIME-tools-5.518/testmsgs/double-boundary-with-comment.msg
2026-08-26 15:59:13.000000000 +0200
@@ -0,0 +1,19 @@
+From: Test <[email protected]>
+To: Test <[email protected]>
+Subject: Double boundary with comment
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary(comment)=X; boundary=XY
+
+--XY
+Content-Type: text/plain
+
+Whatever
+
+--XY
+Content-Type: application/octet-stream
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment; name="wookie.exe"
+
+Z290Y2hhCg==
+
+--XY=--
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/MIME-tools-5.517/testmsgs/invalid-boundary.msg
new/MIME-tools-5.518/testmsgs/invalid-boundary.msg
--- old/MIME-tools-5.517/testmsgs/invalid-boundary.msg 1970-01-01
01:00:00.000000000 +0100
+++ new/MIME-tools-5.518/testmsgs/invalid-boundary.msg 2026-08-26
15:59:39.000000000 +0200
@@ -0,0 +1,19 @@
+From: Test <[email protected]>
+To: Test <[email protected]>
+Subject: Invalid boundary
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary=FOO=
+
+--FOO=
+Content-Type: text/plain
+
+Whatever
+
+--FOO=
+Content-Type: application/octet-stream
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment; name="wookie.exe"
+
+Z290Y2hhCg==
+
+--FOO=--
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/MIME-tools-5.517/testmsgs/invalid-quoted-boundary.msg
new/MIME-tools-5.518/testmsgs/invalid-quoted-boundary.msg
--- old/MIME-tools-5.517/testmsgs/invalid-quoted-boundary.msg 1970-01-01
01:00:00.000000000 +0100
+++ new/MIME-tools-5.518/testmsgs/invalid-quoted-boundary.msg 2026-08-26
15:59:54.000000000 +0200
@@ -0,0 +1,19 @@
+From: Test <[email protected]>
+To: Test <[email protected]>
+Subject: Invalid quoted boundary
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary=A"B
+
+--B
+Content-Type: text/plain
+
+Whatever
+
+--B
+Content-Type: application/octet-stream
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment; name="wookie.exe"
+
+Z290Y2hhCg==
+
+--B--
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/MIME-tools-5.517/testmsgs/qpboundary.msg
new/MIME-tools-5.518/testmsgs/qpboundary.msg
--- old/MIME-tools-5.517/testmsgs/qpboundary.msg 1970-01-01
01:00:00.000000000 +0100
+++ new/MIME-tools-5.518/testmsgs/qpboundary.msg 2026-08-26
15:58:58.000000000 +0200
@@ -0,0 +1,19 @@
+From: Test <[email protected]>
+To: Test <[email protected]>
+Subject: Quoted-Printable encoded boundary.
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary="=?US-ASCII?Q?X?="
+
+--X
+Content-Type: text/plain
+
+Whatever
+
+--X
+Content-Type: application/octet-stream
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment; name="wookie.exe"
+
+Z290Y2hhCg==
+
+--X--
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/MIME-tools-5.517/testmsgs/rfc2231boundary.msg
new/MIME-tools-5.518/testmsgs/rfc2231boundary.msg
--- old/MIME-tools-5.517/testmsgs/rfc2231boundary.msg 1970-01-01
01:00:00.000000000 +0100
+++ new/MIME-tools-5.518/testmsgs/rfc2231boundary.msg 2026-08-26
16:00:05.000000000 +0200
@@ -0,0 +1,19 @@
+From: Test <[email protected]>
+To: Test <[email protected]>
+Subject: RFC2231-encoded boundary
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary*=us-ascii'en-us'X;
+
+--X
+Content-Type: text/plain
+
+Whatever
+
+--X
+Content-Type: application/octet-stream
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment; name="wookie.exe"
+
+Z290Y2hhCg==
+
+--X--
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/MIME-tools-5.517/testmsgs/unusual-space-in-boundary.msg
new/MIME-tools-5.518/testmsgs/unusual-space-in-boundary.msg
--- old/MIME-tools-5.517/testmsgs/unusual-space-in-boundary.msg 1970-01-01
01:00:00.000000000 +0100
+++ new/MIME-tools-5.518/testmsgs/unusual-space-in-boundary.msg 2026-08-26
15:59:26.000000000 +0200
@@ -0,0 +1,19 @@
+From: Test <[email protected]>
+To: Test <[email protected]>
+Subject: Unusual space in boundary
+MIME-Version: 1.0
+Content-Type: multipart/mixed; boundary=FOO
+
+--FOO
+Content-Type: text/plain
+
+Whatever
+
+--FOO
+Content-Type: application/octet-stream
+Content-Transfer-Encoding: base64
+Content-Disposition: attachment; name="wookie.exe"
+
+Z290Y2hhCg==
+
+--FOO=--
++++++ _scmsync.obsinfo ++++++
--- /var/tmp/diff_new_pack.2u3MoY/_old 2026-09-08 17:01:41.447931474 +0200
+++ /var/tmp/diff_new_pack.2u3MoY/_new 2026-09-08 17:01:41.459931975 +0200
@@ -1,6 +1,6 @@
-mtime: 1770790868
-commit: 6ac59af313a37f1716fb79b52300c00a7eeeeec751ec156999efadf286485620
-url: https://src.opensuse.org/perl/perl-MIME-tools.git
-revision: 6ac59af313a37f1716fb79b52300c00a7eeeeec751ec156999efadf286485620
+mtime: 1787848486
+commit: 034418b05d900282925cb365c8fe30849b46fb7f8575507457ad261129549567
+url: https://src.opensuse.org/perl/perl-MIME-tools
+revision: 034418b05d900282925cb365c8fe30849b46fb7f8575507457ad261129549567
projectscmsync: https://src.opensuse.org/perl/_ObsPrj
++++++ build.specials.obscpio ++++++
++++++ build.specials.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore' old/.gitignore new/.gitignore
--- old/.gitignore 1970-01-01 01:00:00.000000000 +0100
+++ new/.gitignore 2026-08-27 18:34:46.000000000 +0200
@@ -0,0 +1 @@
+.osc