Skip to content

Commit 3ef1494

Browse files
phillipwoodgitster
authored andcommitted
mailinfo -b: fix an out of bounds access
To remove bracketed strings containing "PATCH" from the subject line cleanup_subject() scans the subject for the opening bracket using an offset from the beginning of the line. It then searches for the closing bracket with strchr(). To calculate the length of the bracketed string it unfortunately adds rather than subtracts the offset from the result of strchr(). This leads to an out of bounds access in memmem() when looking to see if the brackets contain "PATCH". We have tests that trigger this bug that were added in ae52d57 (t5100: add some more mailinfo tests, 2017-05-31). The commit message mentions that they are marked test_expect_failure as they trigger an assertion in strbuf_splice(). While it is reassuring that strbuf_splice() detects the problem and dies in retrospect that should perhaps have warranted a little more investigation. The bug was introduced by 17635fc (mailinfo: -b option keeps [bracketed] strings that is not a [PATCH] marker, 2009-07-15). I think the reason it has survived so long is that '-b' is not a popular option and without it the offset is always zero. This was found by the address sanitizer while I was cleaning up the test_todo idea in [1]. [1] https://lore.kernel.org/git/[email protected]/ Signed-off-by: Phillip Wood <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent a0feb86 commit 3ef1494

File tree

2 files changed

+3
-3
lines changed

2 files changed

+3
-3
lines changed

mailinfo.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,7 @@ static void cleanup_subject(struct mailinfo *mi, struct strbuf *subject)
317317
pos = strchr(subject->buf + at, ']');
318318
if (!pos)
319319
break;
320-
remove = pos - subject->buf + at + 1;
320+
remove = pos - (subject->buf + at) + 1;
321321
if (!mi->keep_non_patch_brackets_in_subject ||
322322
(7 <= remove &&
323323
memmem(subject->buf + at, remove, "PATCH", 5)))

t/t5100-mailinfo.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -201,13 +201,13 @@ test_expect_success 'mailinfo -b double [PATCH]' '
201201
test z"$subj" = z"Subject: message"
202202
'
203203

204-
test_expect_failure 'mailinfo -b trailing [PATCH]' '
204+
test_expect_success 'mailinfo -b trailing [PATCH]' '
205205
subj="$(echo "Subject: [other] [PATCH] message" |
206206
git mailinfo -b /dev/null /dev/null)" &&
207207
test z"$subj" = z"Subject: [other] message"
208208
'
209209

210-
test_expect_failure 'mailinfo -b separated double [PATCH]' '
210+
test_expect_success 'mailinfo -b separated double [PATCH]' '
211211
subj="$(echo "Subject: [PATCH] [other] [PATCH] message" |
212212
git mailinfo -b /dev/null /dev/null)" &&
213213
test z"$subj" = z"Subject: [other] message"

0 commit comments

Comments
 (0)