2006-06-17 22:20:36 +00:00
|
|
|
#!/bin/sh
|
|
|
|
#
|
|
|
|
# Copyright (c) 2005 Junio C Hamano
|
|
|
|
#
|
|
|
|
|
2007-07-03 05:52:14 +00:00
|
|
|
test_description='git mailinfo and git mailsplit test'
|
2006-06-17 22:20:36 +00:00
|
|
|
|
|
|
|
. ./test-lib.sh
|
|
|
|
|
2016-09-28 19:52:31 +00:00
|
|
|
DATA="$TEST_DIRECTORY/t5100"
|
|
|
|
|
2006-06-17 22:20:36 +00:00
|
|
|
test_expect_success 'split sample box' \
|
2016-09-28 19:52:31 +00:00
|
|
|
'git mailsplit -o. "$DATA/sample.mbox" >last &&
|
2015-12-22 15:27:50 +00:00
|
|
|
last=$(cat last) &&
|
2006-06-17 22:20:36 +00:00
|
|
|
echo total is $last &&
|
2016-09-20 17:17:53 +00:00
|
|
|
test $(cat last) = 18'
|
2006-06-17 22:20:36 +00:00
|
|
|
|
2009-08-27 04:36:05 +00:00
|
|
|
check_mailinfo () {
|
|
|
|
mail=$1 opt=$2
|
|
|
|
mo="$mail$opt"
|
2016-09-28 19:52:31 +00:00
|
|
|
git mailinfo -u $opt "msg$mo" "patch$mo" <"$mail" >"info$mo" &&
|
|
|
|
test_cmp "$DATA/msg$mo" "msg$mo" &&
|
|
|
|
test_cmp "$DATA/patch$mo" "patch$mo" &&
|
|
|
|
test_cmp "$DATA/info$mo" "info$mo"
|
2009-08-27 04:36:05 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-12-22 18:35:16 +00:00
|
|
|
for mail in 00*
|
2006-06-17 22:20:36 +00:00
|
|
|
do
|
2008-08-08 09:26:28 +00:00
|
|
|
test_expect_success "mailinfo $mail" '
|
2016-09-28 19:52:31 +00:00
|
|
|
check_mailinfo "$mail" "" &&
|
|
|
|
if test -f "$DATA/msg$mail--scissors"
|
2009-08-27 04:36:05 +00:00
|
|
|
then
|
2016-09-28 19:52:31 +00:00
|
|
|
check_mailinfo "$mail" --scissors
|
2009-11-20 16:12:47 +00:00
|
|
|
fi &&
|
2016-09-28 19:52:31 +00:00
|
|
|
if test -f "$DATA/msg$mail--no-inbody-headers"
|
2009-11-20 16:12:47 +00:00
|
|
|
then
|
2016-09-28 19:52:31 +00:00
|
|
|
check_mailinfo "$mail" --no-inbody-headers
|
2015-03-20 10:06:15 +00:00
|
|
|
fi &&
|
2016-09-28 19:52:31 +00:00
|
|
|
if test -f "$DATA/msg$mail--message-id"
|
2014-11-25 14:00:55 +00:00
|
|
|
then
|
2016-09-28 19:52:31 +00:00
|
|
|
check_mailinfo "$mail" --message-id
|
2014-11-25 14:00:55 +00:00
|
|
|
fi
|
2008-08-08 09:26:28 +00:00
|
|
|
'
|
2006-06-17 22:20:36 +00:00
|
|
|
done
|
|
|
|
|
2009-01-12 22:21:04 +00:00
|
|
|
|
|
|
|
test_expect_success 'split box with rfc2047 samples' \
|
|
|
|
'mkdir rfc2047 &&
|
2016-09-28 19:52:31 +00:00
|
|
|
git mailsplit -orfc2047 "$DATA/rfc2047-samples.mbox" \
|
2009-01-12 22:21:04 +00:00
|
|
|
>rfc2047/last &&
|
2015-12-22 15:27:50 +00:00
|
|
|
last=$(cat rfc2047/last) &&
|
2009-01-12 22:21:04 +00:00
|
|
|
echo total is $last &&
|
2015-12-22 15:27:50 +00:00
|
|
|
test $(cat rfc2047/last) = 11'
|
2009-01-12 22:21:04 +00:00
|
|
|
|
2015-12-22 18:35:16 +00:00
|
|
|
for mail in rfc2047/00*
|
2009-01-12 22:21:04 +00:00
|
|
|
do
|
|
|
|
test_expect_success "mailinfo $mail" '
|
2016-09-28 19:52:31 +00:00
|
|
|
git mailinfo -u "$mail-msg" "$mail-patch" <"$mail" >"$mail-info" &&
|
2009-01-12 22:21:04 +00:00
|
|
|
echo msg &&
|
2016-09-28 19:52:31 +00:00
|
|
|
test_cmp "$DATA/empty" "$mail-msg" &&
|
2009-01-12 22:21:04 +00:00
|
|
|
echo patch &&
|
2016-09-28 19:52:31 +00:00
|
|
|
test_cmp "$DATA/empty" "$mail-patch" &&
|
2009-01-12 22:21:04 +00:00
|
|
|
echo info &&
|
2016-09-28 19:52:31 +00:00
|
|
|
test_cmp "$DATA/rfc2047-info-$(basename $mail)" "$mail-info"
|
2009-01-12 22:21:04 +00:00
|
|
|
'
|
|
|
|
done
|
|
|
|
|
2008-05-16 13:03:30 +00:00
|
|
|
test_expect_success 'respect NULs' '
|
|
|
|
|
2016-09-28 19:52:31 +00:00
|
|
|
git mailsplit -d3 -o. "$DATA/nul-plain" &&
|
|
|
|
test_cmp "$DATA/nul-plain" 001 &&
|
2024-03-15 19:46:07 +00:00
|
|
|
git mailinfo msg patch <001 &&
|
2012-04-11 11:24:01 +00:00
|
|
|
test_line_count = 4 patch
|
2008-05-16 13:03:30 +00:00
|
|
|
|
|
|
|
'
|
|
|
|
|
2008-05-25 08:16:05 +00:00
|
|
|
test_expect_success 'Preserve NULs out of MIME encoded message' '
|
|
|
|
|
2016-09-28 19:52:31 +00:00
|
|
|
git mailsplit -d5 -o. "$DATA/nul-b64.in" &&
|
|
|
|
test_cmp "$DATA/nul-b64.in" 00001 &&
|
2008-05-25 08:16:05 +00:00
|
|
|
git mailinfo msg patch <00001 &&
|
2016-09-28 19:52:31 +00:00
|
|
|
test_cmp "$DATA/nul-b64.expect" patch
|
2008-05-25 08:16:05 +00:00
|
|
|
|
|
|
|
'
|
|
|
|
|
mailinfo: avoid violating strbuf assertion
In handle_from, we calculate the end boundary of a section
to remove from a strbuf using strcspn like this:
el = strcspn(buf, set_of_end_boundaries);
strbuf_remove(&sb, start, el + 1);
This works fine if "el" is the offset of the boundary
character, meaning we remove up to and including that
character. But if the end boundary didn't match (that is, we
hit the end of the string as the boundary instead) then we
want just "el". Asking for "el+1" caught an out-of-bounds
assertion in the strbuf library.
This manifested itself when we got a 'From' header that had
just an email address with nothing else in it (the end of
the string was the end of the address, rather than, e.g., a
trailing '>' character), causing git-mailinfo to barf.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2008-08-19 17:28:24 +00:00
|
|
|
test_expect_success 'mailinfo on from header without name works' '
|
|
|
|
|
|
|
|
mkdir info-from &&
|
2016-09-28 19:52:31 +00:00
|
|
|
git mailsplit -oinfo-from "$DATA/info-from.in" &&
|
|
|
|
test_cmp "$DATA/info-from.in" info-from/0001 &&
|
mailinfo: avoid violating strbuf assertion
In handle_from, we calculate the end boundary of a section
to remove from a strbuf using strcspn like this:
el = strcspn(buf, set_of_end_boundaries);
strbuf_remove(&sb, start, el + 1);
This works fine if "el" is the offset of the boundary
character, meaning we remove up to and including that
character. But if the end boundary didn't match (that is, we
hit the end of the string as the boundary instead) then we
want just "el". Asking for "el+1" caught an out-of-bounds
assertion in the strbuf library.
This manifested itself when we got a 'From' header that had
just an email address with nothing else in it (the end of
the string was the end of the address, rather than, e.g., a
trailing '>' character), causing git-mailinfo to barf.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2008-08-19 17:28:24 +00:00
|
|
|
git mailinfo info-from/msg info-from/patch \
|
|
|
|
<info-from/0001 >info-from/out &&
|
2016-09-28 19:52:31 +00:00
|
|
|
test_cmp "$DATA/info-from.expect" info-from/out
|
mailinfo: avoid violating strbuf assertion
In handle_from, we calculate the end boundary of a section
to remove from a strbuf using strcspn like this:
el = strcspn(buf, set_of_end_boundaries);
strbuf_remove(&sb, start, el + 1);
This works fine if "el" is the offset of the boundary
character, meaning we remove up to and including that
character. But if the end boundary didn't match (that is, we
hit the end of the string as the boundary instead) then we
want just "el". Asking for "el+1" caught an out-of-bounds
assertion in the strbuf library.
This manifested itself when we got a 'From' header that had
just an email address with nothing else in it (the end of
the string was the end of the address, rather than, e.g., a
trailing '>' character), causing git-mailinfo to barf.
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2008-08-19 17:28:24 +00:00
|
|
|
|
|
|
|
'
|
|
|
|
|
2014-09-14 01:30:38 +00:00
|
|
|
test_expect_success 'mailinfo finds headers after embedded From line' '
|
|
|
|
mkdir embed-from &&
|
2016-09-28 19:52:31 +00:00
|
|
|
git mailsplit -oembed-from "$DATA/embed-from.in" &&
|
|
|
|
test_cmp "$DATA/embed-from.in" embed-from/0001 &&
|
2014-09-14 01:30:38 +00:00
|
|
|
git mailinfo embed-from/msg embed-from/patch \
|
|
|
|
<embed-from/0001 >embed-from/out &&
|
2016-09-28 19:52:31 +00:00
|
|
|
test_cmp "$DATA/embed-from.expect" embed-from/out
|
2014-09-14 01:30:38 +00:00
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'mailinfo on message with quoted >From' '
|
|
|
|
mkdir quoted-from &&
|
2016-09-28 19:52:31 +00:00
|
|
|
git mailsplit -oquoted-from "$DATA/quoted-from.in" &&
|
|
|
|
test_cmp "$DATA/quoted-from.in" quoted-from/0001 &&
|
2014-09-14 01:30:38 +00:00
|
|
|
git mailinfo quoted-from/msg quoted-from/patch \
|
|
|
|
<quoted-from/0001 >quoted-from/out &&
|
2016-09-28 19:52:31 +00:00
|
|
|
test_cmp "$DATA/quoted-from.expect" quoted-from/msg
|
2014-09-14 01:30:38 +00:00
|
|
|
'
|
|
|
|
|
2016-06-05 04:46:40 +00:00
|
|
|
test_expect_success 'mailinfo unescapes with --mboxrd' '
|
|
|
|
mkdir mboxrd &&
|
|
|
|
git mailsplit -omboxrd --mboxrd \
|
2016-09-28 19:52:31 +00:00
|
|
|
"$DATA/sample.mboxrd" >last &&
|
2016-06-05 04:46:40 +00:00
|
|
|
test x"$(cat last)" = x2 &&
|
|
|
|
for i in 0001 0002
|
|
|
|
do
|
|
|
|
git mailinfo mboxrd/msg mboxrd/patch \
|
|
|
|
<mboxrd/$i >mboxrd/out &&
|
2021-12-09 05:11:14 +00:00
|
|
|
test_cmp "$DATA/${i}mboxrd" mboxrd/msg || return 1
|
2016-06-05 04:46:40 +00:00
|
|
|
done &&
|
|
|
|
sp=" " &&
|
|
|
|
echo "From " >expect &&
|
|
|
|
echo "From " >>expect &&
|
|
|
|
echo >> expect &&
|
|
|
|
cat >sp <<-INPUT_END &&
|
|
|
|
From mboxrd Mon Sep 17 00:00:00 2001
|
|
|
|
From: trailing spacer <sp@example.com>
|
|
|
|
Subject: [PATCH] a commit with trailing space
|
|
|
|
|
|
|
|
From$sp
|
|
|
|
>From$sp
|
|
|
|
|
|
|
|
INPUT_END
|
|
|
|
|
|
|
|
git mailsplit -f2 -omboxrd --mboxrd <sp >last &&
|
|
|
|
test x"$(cat last)" = x1 &&
|
|
|
|
git mailinfo mboxrd/msg mboxrd/patch <mboxrd/0003 &&
|
|
|
|
test_cmp expect mboxrd/msg
|
|
|
|
'
|
|
|
|
|
2016-09-28 19:52:32 +00:00
|
|
|
test_expect_success 'mailinfo handles rfc2822 quoted-string' '
|
|
|
|
mkdir quoted-string &&
|
|
|
|
git mailinfo /dev/null /dev/null <"$DATA/quoted-string.in" \
|
|
|
|
>quoted-string/info &&
|
|
|
|
test_cmp "$DATA/quoted-string.expect" quoted-string/info
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'mailinfo handles rfc2822 comment' '
|
|
|
|
mkdir comment &&
|
|
|
|
git mailinfo /dev/null /dev/null <"$DATA/comment.in" \
|
|
|
|
>comment/info &&
|
|
|
|
test_cmp "$DATA/comment.expect" comment/info
|
|
|
|
'
|
|
|
|
|
2016-11-22 21:13:16 +00:00
|
|
|
test_expect_success 'mailinfo with mailinfo.scissors config' '
|
|
|
|
test_config mailinfo.scissors true &&
|
|
|
|
(
|
|
|
|
mkdir sub &&
|
|
|
|
cd sub &&
|
|
|
|
git mailinfo ../msg0014.sc ../patch0014.sc <../0014 >../info0014.sc
|
|
|
|
) &&
|
|
|
|
test_cmp "$DATA/msg0014--scissors" msg0014.sc &&
|
|
|
|
test_cmp "$DATA/patch0014--scissors" patch0014.sc &&
|
|
|
|
test_cmp "$DATA/info0014--scissors" info0014.sc
|
|
|
|
'
|
|
|
|
|
|
|
|
|
2017-05-31 10:26:10 +00:00
|
|
|
test_expect_success 'mailinfo no options' '
|
|
|
|
subj="$(echo "Subject: [PATCH] [other] [PATCH] message" |
|
|
|
|
git mailinfo /dev/null /dev/null)" &&
|
|
|
|
test z"$subj" = z"Subject: message"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'mailinfo -k' '
|
|
|
|
subj="$(echo "Subject: [PATCH] [other] [PATCH] message" |
|
|
|
|
git mailinfo -k /dev/null /dev/null)" &&
|
|
|
|
test z"$subj" = z"Subject: [PATCH] [other] [PATCH] message"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'mailinfo -b no [PATCH]' '
|
|
|
|
subj="$(echo "Subject: [other] message" |
|
|
|
|
git mailinfo -b /dev/null /dev/null)" &&
|
|
|
|
test z"$subj" = z"Subject: [other] message"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'mailinfo -b leading [PATCH]' '
|
|
|
|
subj="$(echo "Subject: [PATCH] [other] message" |
|
|
|
|
git mailinfo -b /dev/null /dev/null)" &&
|
|
|
|
test z"$subj" = z"Subject: [other] message"
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'mailinfo -b double [PATCH]' '
|
|
|
|
subj="$(echo "Subject: [PATCH] [PATCH] message" |
|
|
|
|
git mailinfo -b /dev/null /dev/null)" &&
|
|
|
|
test z"$subj" = z"Subject: message"
|
|
|
|
'
|
|
|
|
|
2022-10-03 09:23:30 +00:00
|
|
|
test_expect_success 'mailinfo -b trailing [PATCH]' '
|
2017-05-31 10:26:10 +00:00
|
|
|
subj="$(echo "Subject: [other] [PATCH] message" |
|
|
|
|
git mailinfo -b /dev/null /dev/null)" &&
|
|
|
|
test z"$subj" = z"Subject: [other] message"
|
|
|
|
'
|
|
|
|
|
2022-10-03 09:23:30 +00:00
|
|
|
test_expect_success 'mailinfo -b separated double [PATCH]' '
|
2017-05-31 10:26:10 +00:00
|
|
|
subj="$(echo "Subject: [PATCH] [other] [PATCH] message" |
|
|
|
|
git mailinfo -b /dev/null /dev/null)" &&
|
|
|
|
test z"$subj" = z"Subject: [other] message"
|
|
|
|
'
|
|
|
|
|
2020-02-11 17:19:53 +00:00
|
|
|
test_expect_success 'mailinfo handles unusual header whitespace' '
|
|
|
|
git mailinfo /dev/null /dev/null >actual <<-\EOF &&
|
|
|
|
From:Real Name <user@example.com>
|
|
|
|
Subject: extra spaces
|
|
|
|
EOF
|
|
|
|
|
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
Author: Real Name
|
|
|
|
Email: user@example.com
|
|
|
|
Subject: extra spaces
|
|
|
|
|
|
|
|
EOF
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2021-05-09 17:12:10 +00:00
|
|
|
check_quoted_cr_mail () {
|
|
|
|
mail="$1" && shift &&
|
|
|
|
git mailinfo -u "$@" "$mail.msg" "$mail.patch" \
|
|
|
|
<"$mail" >"$mail.info" 2>"$mail.err" &&
|
|
|
|
test_cmp "$mail-expected.msg" "$mail.msg" &&
|
|
|
|
test_cmp "$mail-expected.patch" "$mail.patch" &&
|
|
|
|
test_cmp "$DATA/quoted-cr-info" "$mail.info"
|
|
|
|
}
|
|
|
|
|
|
|
|
test_expect_success 'split base64 email with quoted-cr' '
|
|
|
|
mkdir quoted-cr &&
|
|
|
|
git mailsplit -oquoted-cr "$DATA/quoted-cr.mbox" >quoted-cr/last &&
|
|
|
|
test $(cat quoted-cr/last) = 2
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'mailinfo warn CR in base64 encoded email' '
|
|
|
|
sed -e "s/%%$//" -e "s/%%/$(printf \\015)/g" "$DATA/quoted-cr-msg" \
|
|
|
|
>quoted-cr/0001-expected.msg &&
|
|
|
|
sed "s/%%/$(printf \\015)/g" "$DATA/quoted-cr-msg" \
|
|
|
|
>quoted-cr/0002-expected.msg &&
|
|
|
|
sed -e "s/%%$//" -e "s/%%/$(printf \\015)/g" "$DATA/quoted-cr-patch" \
|
|
|
|
>quoted-cr/0001-expected.patch &&
|
|
|
|
sed "s/%%/$(printf \\015)/g" "$DATA/quoted-cr-patch" \
|
|
|
|
>quoted-cr/0002-expected.patch &&
|
|
|
|
check_quoted_cr_mail quoted-cr/0001 &&
|
|
|
|
test_must_be_empty quoted-cr/0001.err &&
|
|
|
|
check_quoted_cr_mail quoted-cr/0002 &&
|
2021-05-09 17:12:11 +00:00
|
|
|
grep "quoted CRLF detected" quoted-cr/0002.err &&
|
|
|
|
check_quoted_cr_mail quoted-cr/0001 --quoted-cr=nowarn &&
|
|
|
|
test_must_be_empty quoted-cr/0001.err &&
|
|
|
|
check_quoted_cr_mail quoted-cr/0002 --quoted-cr=nowarn &&
|
2021-05-09 17:12:12 +00:00
|
|
|
test_must_be_empty quoted-cr/0002.err &&
|
|
|
|
cp quoted-cr/0001-expected.msg quoted-cr/0002-expected.msg &&
|
|
|
|
cp quoted-cr/0001-expected.patch quoted-cr/0002-expected.patch &&
|
|
|
|
check_quoted_cr_mail quoted-cr/0001 --quoted-cr=strip &&
|
|
|
|
test_must_be_empty quoted-cr/0001.err &&
|
|
|
|
check_quoted_cr_mail quoted-cr/0002 --quoted-cr=strip &&
|
2021-05-09 17:12:11 +00:00
|
|
|
test_must_be_empty quoted-cr/0002.err
|
2021-05-09 17:12:10 +00:00
|
|
|
'
|
|
|
|
|
mailinfo: fix out-of-bounds memory reads in unquote_quoted_pair()
When processing a header like a "From" line, mailinfo uses
unquote_quoted_pair() to handle double-quotes and rfc822 parenthesized
comments. It takes a NUL-terminated string on input, and loops over the
"in" pointer until it sees the NUL. When it finds the start of an
interesting block, it delegates to helper functions which also increment
"in", and return the updated pointer.
But there's a bug here: the helpers find the NUL with a post-increment
in the loop condition, like:
while ((c = *in++) != 0)
So when they do see a NUL (rather than the correct termination of the
quote or comment section), they return "in" as one _past_ the NUL
terminator. And thus the outer loop in unquote_quoted_pair() does not
realize we hit the NUL, and keeps reading past the end of the buffer.
We should instead make sure to return "in" positioned at the NUL, so
that the caller knows to stop their loop, too. A hacky way to do this is
to return "in - 1" after leaving the inner loop. But a slightly cleaner
solution is to avoid incrementing "in" until we are sure it contained a
non-NUL byte (i.e., doing it inside the loop body).
The two tests here show off the problem. Since we check the output,
they'll _usually_ report a failure in a normal build, but it depends on
what garbage bytes are found after the heap buffer. Building with
SANITIZE=address reliably notices the problem. The outcome (both the
exit code and the exact bytes) are just what Git happens to produce for
these cases today, and shouldn't be taken as an endorsement. It might be
reasonable to abort on an unterminated string, for example. The priority
for this patch is fixing the out-of-bounds memory access.
Reported-by: Carlos Andrés Ramírez Cataño <antaigroupltda@gmail.com>
Signed-off-by: Jeff King <peff@peff.net>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
2023-12-12 22:12:43 +00:00
|
|
|
test_expect_success 'from line with unterminated quoted string' '
|
|
|
|
echo "From: bob \"unterminated string smith <bob@example.com>" >in &&
|
|
|
|
git mailinfo /dev/null /dev/null <in >actual &&
|
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
Author: bob unterminated string smith
|
|
|
|
Email: bob@example.com
|
|
|
|
|
|
|
|
EOF
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
|
|
|
test_expect_success 'from line with unterminated comment' '
|
|
|
|
echo "From: bob (unterminated comment smith <bob@example.com>" >in &&
|
|
|
|
git mailinfo /dev/null /dev/null <in >actual &&
|
|
|
|
cat >expect <<-\EOF &&
|
|
|
|
Author: bob (unterminated comment smith
|
|
|
|
Email: bob@example.com
|
|
|
|
|
|
|
|
EOF
|
|
|
|
test_cmp expect actual
|
|
|
|
'
|
|
|
|
|
2006-06-17 22:20:36 +00:00
|
|
|
test_done
|