Merge branch 'jk/read-commit-buffer-data-after-free'
"git log --grep=<pattern>" used to look for the pattern in literal bytes of the commit log message and ignored the log-output encoding. * jk/read-commit-buffer-data-after-free: log: re-encode commit messages before greppingmaint
commit
d04f998b12
27
revision.c
27
revision.c
|
|
@ -2268,7 +2268,10 @@ static int commit_rewrite_person(struct strbuf *buf, const char *what, struct st
|
||||||
static int commit_match(struct commit *commit, struct rev_info *opt)
|
static int commit_match(struct commit *commit, struct rev_info *opt)
|
||||||
{
|
{
|
||||||
int retval;
|
int retval;
|
||||||
|
const char *encoding;
|
||||||
|
char *message;
|
||||||
struct strbuf buf = STRBUF_INIT;
|
struct strbuf buf = STRBUF_INIT;
|
||||||
|
|
||||||
if (!opt->grep_filter.pattern_list && !opt->grep_filter.header_list)
|
if (!opt->grep_filter.pattern_list && !opt->grep_filter.header_list)
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
|
|
@ -2279,13 +2282,23 @@ static int commit_match(struct commit *commit, struct rev_info *opt)
|
||||||
strbuf_addch(&buf, '\n');
|
strbuf_addch(&buf, '\n');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We grep in the user's output encoding, under the assumption that it
|
||||||
|
* is the encoding they are most likely to write their grep pattern
|
||||||
|
* for. In addition, it means we will match the "notes" encoding below,
|
||||||
|
* so we will not end up with a buffer that has two different encodings
|
||||||
|
* in it.
|
||||||
|
*/
|
||||||
|
encoding = get_log_output_encoding();
|
||||||
|
message = logmsg_reencode(commit, encoding);
|
||||||
|
|
||||||
/* Copy the commit to temporary if we are using "fake" headers */
|
/* Copy the commit to temporary if we are using "fake" headers */
|
||||||
if (buf.len)
|
if (buf.len)
|
||||||
strbuf_addstr(&buf, commit->buffer);
|
strbuf_addstr(&buf, message);
|
||||||
|
|
||||||
if (opt->grep_filter.header_list && opt->mailmap) {
|
if (opt->grep_filter.header_list && opt->mailmap) {
|
||||||
if (!buf.len)
|
if (!buf.len)
|
||||||
strbuf_addstr(&buf, commit->buffer);
|
strbuf_addstr(&buf, message);
|
||||||
|
|
||||||
commit_rewrite_person(&buf, "\nauthor ", opt->mailmap);
|
commit_rewrite_person(&buf, "\nauthor ", opt->mailmap);
|
||||||
commit_rewrite_person(&buf, "\ncommitter ", opt->mailmap);
|
commit_rewrite_person(&buf, "\ncommitter ", opt->mailmap);
|
||||||
|
|
@ -2294,18 +2307,18 @@ static int commit_match(struct commit *commit, struct rev_info *opt)
|
||||||
/* Append "fake" message parts as needed */
|
/* Append "fake" message parts as needed */
|
||||||
if (opt->show_notes) {
|
if (opt->show_notes) {
|
||||||
if (!buf.len)
|
if (!buf.len)
|
||||||
strbuf_addstr(&buf, commit->buffer);
|
strbuf_addstr(&buf, message);
|
||||||
format_display_notes(commit->object.sha1, &buf,
|
format_display_notes(commit->object.sha1, &buf, encoding, 1);
|
||||||
get_log_output_encoding(), 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Find either in the commit object, or in the temporary */
|
/* Find either in the original commit message, or in the temporary */
|
||||||
if (buf.len)
|
if (buf.len)
|
||||||
retval = grep_buffer(&opt->grep_filter, buf.buf, buf.len);
|
retval = grep_buffer(&opt->grep_filter, buf.buf, buf.len);
|
||||||
else
|
else
|
||||||
retval = grep_buffer(&opt->grep_filter,
|
retval = grep_buffer(&opt->grep_filter,
|
||||||
commit->buffer, strlen(commit->buffer));
|
message, strlen(message));
|
||||||
strbuf_release(&buf);
|
strbuf_release(&buf);
|
||||||
|
logmsg_free(message, commit);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,58 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
test_description='test log with i18n features'
|
||||||
|
. ./test-lib.sh
|
||||||
|
|
||||||
|
# two forms of é
|
||||||
|
utf8_e=$(printf '\303\251')
|
||||||
|
latin1_e=$(printf '\351')
|
||||||
|
|
||||||
|
test_expect_success 'create commits in different encodings' '
|
||||||
|
test_tick &&
|
||||||
|
cat >msg <<-EOF &&
|
||||||
|
utf8
|
||||||
|
|
||||||
|
t${utf8_e}st
|
||||||
|
EOF
|
||||||
|
git add msg &&
|
||||||
|
git -c i18n.commitencoding=utf8 commit -F msg &&
|
||||||
|
cat >msg <<-EOF &&
|
||||||
|
latin1
|
||||||
|
|
||||||
|
t${latin1_e}st
|
||||||
|
EOF
|
||||||
|
git add msg &&
|
||||||
|
git -c i18n.commitencoding=ISO-8859-1 commit -F msg
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'log --grep searches in log output encoding (utf8)' '
|
||||||
|
cat >expect <<-\EOF &&
|
||||||
|
latin1
|
||||||
|
utf8
|
||||||
|
EOF
|
||||||
|
git log --encoding=utf8 --format=%s --grep=$utf8_e >actual &&
|
||||||
|
test_cmp expect actual
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'log --grep searches in log output encoding (latin1)' '
|
||||||
|
cat >expect <<-\EOF &&
|
||||||
|
latin1
|
||||||
|
utf8
|
||||||
|
EOF
|
||||||
|
git log --encoding=ISO-8859-1 --format=%s --grep=$latin1_e >actual &&
|
||||||
|
test_cmp expect actual
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'log --grep does not find non-reencoded values (utf8)' '
|
||||||
|
>expect &&
|
||||||
|
git log --encoding=utf8 --format=%s --grep=$latin1_e >actual &&
|
||||||
|
test_cmp expect actual
|
||||||
|
'
|
||||||
|
|
||||||
|
test_expect_success 'log --grep does not find non-reencoded values (latin1)' '
|
||||||
|
>expect &&
|
||||||
|
git log --encoding=ISO-8859-1 --format=%s --grep=$utf8_e >actual &&
|
||||||
|
test_cmp expect actual
|
||||||
|
'
|
||||||
|
|
||||||
|
test_done
|
||||||
Loading…
Reference in New Issue