Skip to content

Commit 63a4d8d

Browse files
committed
Merge branch 'js/rerere-forget-protect-against-NUL' into maint
* js/rerere-forget-protect-against-NUL: rerere forget: do not segfault if not all stages are present rerere forget: grok files containing NUL
2 parents 2124745 + b9e31f5 commit 63a4d8d

File tree

2 files changed

+36
-10
lines changed

2 files changed

+36
-10
lines changed

rerere.c

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -284,8 +284,10 @@ static int rerere_mem_getline(struct strbuf *sb, struct rerere_io *io_)
284284
strbuf_release(sb);
285285
if (!io->input.len)
286286
return -1;
287-
ep = strchrnul(io->input.buf, '\n');
288-
if (*ep == '\n')
287+
ep = memchr(io->input.buf, '\n', io->input.len);
288+
if (!ep)
289+
ep = io->input.buf + io->input.len;
290+
else if (*ep == '\n')
289291
ep++;
290292
len = ep - io->input.buf;
291293
strbuf_add(sb, io->input.buf, len);
@@ -295,7 +297,7 @@ static int rerere_mem_getline(struct strbuf *sb, struct rerere_io *io_)
295297

296298
static int handle_cache(const char *path, unsigned char *sha1, const char *output)
297299
{
298-
mmfile_t mmfile[3];
300+
mmfile_t mmfile[3] = {{NULL}};
299301
mmbuffer_t result = {NULL, 0};
300302
struct cache_entry *ce;
301303
int pos, len, i, hunk_no;
@@ -314,17 +316,16 @@ static int handle_cache(const char *path, unsigned char *sha1, const char *outpu
314316
for (i = 0; i < 3; i++) {
315317
enum object_type type;
316318
unsigned long size;
319+
int j;
317320

318-
mmfile[i].size = 0;
319-
mmfile[i].ptr = NULL;
320321
if (active_nr <= pos)
321322
break;
322323
ce = active_cache[pos++];
323-
if (ce_namelen(ce) != len || memcmp(ce->name, path, len)
324-
|| ce_stage(ce) != i + 1)
325-
break;
326-
mmfile[i].ptr = read_sha1_file(ce->sha1, &type, &size);
327-
mmfile[i].size = size;
324+
if (ce_namelen(ce) != len || memcmp(ce->name, path, len))
325+
continue;
326+
j = ce_stage(ce) - 1;
327+
mmfile[j].ptr = read_sha1_file(ce->sha1, &type, &size);
328+
mmfile[j].size = size;
328329
}
329330
for (i = 0; i < 3; i++) {
330331
if (!mmfile[i].ptr && !mmfile[i].size)

t/t2030-unresolve-info.sh

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,14 +44,21 @@ prime_resolve_undo () {
4444

4545
test_expect_success setup '
4646
mkdir fi &&
47+
printf "a\0a" >binary &&
48+
git add binary &&
4749
test_commit initial fi/le first &&
4850
git branch side &&
4951
git branch another &&
52+
printf "a\0b" >binary &&
53+
git add binary &&
5054
test_commit second fi/le second &&
5155
git checkout side &&
5256
test_commit third fi/le third &&
57+
git branch add-add &&
5358
git checkout another &&
5459
test_commit fourth fi/le fourth &&
60+
git checkout add-add &&
61+
test_commit fifth add-differently &&
5562
git checkout master
5663
'
5764

@@ -167,4 +174,22 @@ test_expect_success 'rerere and rerere forget (subdirectory)' '
167174
test_cmp expect actual
168175
'
169176

177+
test_expect_success 'rerere forget (binary)' '
178+
git checkout -f side &&
179+
printf "a\0c" >binary &&
180+
git commit -a -m binary &&
181+
test_must_fail git merge second &&
182+
git rerere forget binary
183+
'
184+
185+
test_expect_success 'rerere forget (add-add conflict)' '
186+
git checkout -f master &&
187+
echo master >add-differently &&
188+
git add add-differently &&
189+
git commit -m "add differently" &&
190+
test_must_fail git merge fifth &&
191+
git rerere forget add-differently 2>actual &&
192+
test_i18ngrep "no remembered" actual
193+
'
194+
170195
test_done

0 commit comments

Comments
 (0)