summaryrefslogtreecommitdiff
path: root/src/patch_parse.c
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2017-03-14 09:39:37 +0100
committerPatrick Steinhardt <ps@pks.im>2017-03-14 13:09:13 +0100
commitad5a909cfbb07541e3e2548313043cc3f3a0918a (patch)
tree659db141dcef85313203fe491e810e8baab160a4 /src/patch_parse.c
parent62a2fc06d4af781c456bf753d6ada16df682df55 (diff)
downloadlibgit2-ad5a909cfbb07541e3e2548313043cc3f3a0918a.tar.gz
patch_parse: fix parsing minimal trailing diff line
In a diff, the shortest possible hunk with a modification (that is, no deletion) results from a file with only one line with a single character which is removed. Thus the following hunk @@ -1 +1 @@ -a + is the shortest valid hunk modifying a line. The function parsing the hunk body though assumes that there must always be at least 4 bytes present to make up a valid hunk, which is obviously wrong in this case. The absolute minimum number of bytes required for a modification is actually 2 bytes, that is the "+" and the following newline. Note: if there is no trailing newline, the assumption will not be offended as the diff will have a line "\ No trailing newline" at its end. This patch fixes the issue by lowering the amount of bytes required.
Diffstat (limited to 'src/patch_parse.c')
-rw-r--r--src/patch_parse.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/src/patch_parse.c b/src/patch_parse.c
index f5275947d..d993c0311 100644
--- a/src/patch_parse.c
+++ b/src/patch_parse.c
@@ -562,8 +562,9 @@ static int parse_hunk_body(
int newlines = hunk->hunk.new_lines;
for (;
- ctx->remain_len > 4 && (oldlines || newlines) &&
- memcmp(ctx->line, "@@ -", 4) != 0;
+ ctx->remain_len > 1 &&
+ (oldlines || newlines) &&
+ (ctx->remain_len <= 4 || memcmp(ctx->line, "@@ -", 4) != 0);
parse_advance_line(ctx)) {
int origin;