]> Sergey Matveev's repositories - public-inbox.git/commitdiff
Import: Don't copy nulls from emails into git
authorEric W. Biederman <ebiederm@xmission.com>
Sat, 7 Jul 2018 18:22:28 +0000 (13:22 -0500)
committerEric Wong <e@80x24.org>
Sat, 7 Jul 2018 23:02:13 +0000 (23:02 +0000)
Recently I ran git --git-dir=lkml/git/1.git fsck
and it reported:
> warning in commit 299dbd50b6995c6debe2275f0df984ce697fb4cc: nulInCommit: NULL byte inthe commit object body

Which I found quite scary.  Nulls in the wrong place have a bad tendency
to make programs misbehave.

It turns out someone had placed "=?iso-8859-1?q?=00?=" at the end of
their subject line.  Which is the mime encoding for NULL.  Email::Mime
had correctly decoded the header, and then public-inbox had simply
copied the contents of the header into the subject line of the git
commit.

To prevent that from causing problems replace nulls in such subject
lines with spaces.

Signed-off-by: Eric Biederman <ebiederm@xmission.com>
MANIFEST
lib/PublicInbox/Import.pm
t/nulsubject.t [new file with mode: 0644]

index 6d2aecee23c6e6dac765c481c5efff8b24b7aef4..a2fcae9f4a21a646c554e2749cd503952eabc5ce 100644 (file)
--- a/MANIFEST
+++ b/MANIFEST
@@ -177,6 +177,7 @@ t/msgmap.t
 t/msgtime.t
 t/nntp.t
 t/nntpd.t
+t/nulsubject.t
 t/over.t
 t/perf-nntpd.t
 t/perf-threading.t
index 250a2db31e979054c94df5a0e1dd6ca2d8a5f883..f320c58c6b575023ec94dfcd12e8cbd6910f7af4 100644 (file)
@@ -405,6 +405,8 @@ sub add {
                print $w "reset $ref\n" or wfail;
        }
 
+       # Mime decoding can create nulls replace them with spaces to protect git
+       $subject =~ tr/\0/ /;
        utf8::encode($subject);
        print $w "commit $ref\nmark :$commit\n",
                "author $name <$email> $author_time_raw\n",
diff --git a/t/nulsubject.t b/t/nulsubject.t
new file mode 100644 (file)
index 0000000..bb05be8
--- /dev/null
@@ -0,0 +1,33 @@
+# Copyright (C) 2016-2018 all contributors <meta@public-inbox.org>
+# License: AGPL-3.0+ <https://www.gnu.org/licenses/agpl-3.0.txt>
+use strict;
+use warnings;
+use Test::More;
+use File::Temp qw/tempdir/;
+
+use_ok 'PublicInbox::Import';
+use_ok 'PublicInbox::Git';
+my $tmpdir = tempdir('pi-nulsubject-XXXXXX', TMPDIR => 1, CLEANUP => 1);
+my $git_dir = "$tmpdir/a.git";
+
+{
+       is(system(qw(git init -q --bare), $git_dir), 0, 'git init ok');
+       my $git = PublicInbox::Git->new($git_dir);
+       my $im = PublicInbox::Import->new($git, 'testbox', 'test@example');
+       $im->add(Email::MIME->create(
+               header => [
+                       From => 'a@example.com',
+                       To => 'b@example.com',
+                       'Content-Type' => 'text/plain',
+                       Subject => ' A subject line with a null =?iso-8859-1?q?=00?= see!',
+                       'Message-ID' => '<null-test.a@example.com>',
+               ],
+               body => "hello world\n",
+       ));
+       $im->done;
+       is(system(qw(git --git-dir), $git_dir, 'fsck', '--strict'), 0, 'git fsck ok');
+}
+
+done_testing();
+
+1;