зеркало из https://github.com/microsoft/git.git
[PATCH] Flag empty patches as errors
A patch that contains no actual diff, and that doesn't change any meta-data is bad. It shouldn't be a patch at all, and git-apply shouldn't just accept it. This caused a corrupted patch to be silently applied as an empty change in the kernel, because the corruption ended up making the patch look empty. An example of such a patch is one that contains the patch header, but where the initial fragment header (the "@@ -nr,.." line) is missing, causing us to not parse any fragments. The real "patch" program will also flag such patches as bad, with the message patch: **** Only garbage was found in the patch input. and we should do likewise. Signed-off-by: Linus Torvalds <torvalds@osdl.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
Родитель
88cd621dee
Коммит
1fea629f79
13
apply.c
13
apply.c
|
@ -723,6 +723,16 @@ static int parse_single_patch(char *line, unsigned long size, struct patch *patc
|
||||||
return offset;
|
return offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int metadata_changes(struct patch *patch)
|
||||||
|
{
|
||||||
|
return patch->is_rename > 0 ||
|
||||||
|
patch->is_copy > 0 ||
|
||||||
|
patch->is_new > 0 ||
|
||||||
|
patch->is_delete ||
|
||||||
|
(patch->old_mode && patch->new_mode &&
|
||||||
|
patch->old_mode != patch->new_mode);
|
||||||
|
}
|
||||||
|
|
||||||
static int parse_chunk(char *buffer, unsigned long size, struct patch *patch)
|
static int parse_chunk(char *buffer, unsigned long size, struct patch *patch)
|
||||||
{
|
{
|
||||||
int hdrsize, patchsize;
|
int hdrsize, patchsize;
|
||||||
|
@ -733,6 +743,9 @@ static int parse_chunk(char *buffer, unsigned long size, struct patch *patch)
|
||||||
|
|
||||||
patchsize = parse_single_patch(buffer + offset + hdrsize, size - offset - hdrsize, patch);
|
patchsize = parse_single_patch(buffer + offset + hdrsize, size - offset - hdrsize, patch);
|
||||||
|
|
||||||
|
if (!patchsize && !metadata_changes(patch))
|
||||||
|
die("patch with only garbage at line %d", linenr);
|
||||||
|
|
||||||
return offset + hdrsize + patchsize;
|
return offset + hdrsize + patchsize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче