diff options
author | Linus Torvalds <torvalds@osdl.org> | 2005-09-30 23:25:23 -0700 |
---|---|---|
committer | Junio C Hamano <junkio@cox.net> | 2005-09-30 23:52:48 -0700 |
commit | 1fea629f794cda57cc161979dab903ec7460cc7c (patch) | |
tree | d2ceb2e65f686561ec679891cc82272e4cccfd2c /apply.c | |
parent | 88cd621deedd2aab8f0a4c6ea3afed7269e66d0c (diff) | |
download | git-1fea629f794cda57cc161979dab903ec7460cc7c.tar.gz git-1fea629f794cda57cc161979dab903ec7460cc7c.tar.xz |
[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>
Diffstat (limited to 'apply.c')
-rw-r--r-- | apply.c | 13 |
1 files changed, 13 insertions, 0 deletions
@@ -723,6 +723,16 @@ static int parse_single_patch(char *line, unsigned long size, struct patch *patc 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) { 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); + if (!patchsize && !metadata_changes(patch)) + die("patch with only garbage at line %d", linenr); + return offset + hdrsize + patchsize; } |