Commit 630127e318663a0d48a73cdf20f5aae662500f86

Max Kostyukevich 2019-08-20T03:08:32

apply: Fix a patch corruption related to EOFNL handling Use of apply's API can lead to an improper patch application and a corruption of the modified file. The issue is caused by mishandling of the end of file changes if there are several hunks to apply. The new line character is added to a line from a wrong hunk. The solution is to modify apply_hunk() to add the newline character at the end of a line from a right hunk.

1
2
3
4
5
6
7
8
9
10
11
12
13
diff --git a/src/apply.c b/src/apply.c
index 1ee9291..8891188 100644
--- a/src/apply.c
+++ b/src/apply.c
@@ -219,7 +219,7 @@ static int apply_hunk(
 			case GIT_DIFF_LINE_CONTEXT_EOFNL:
 			case GIT_DIFF_LINE_DEL_EOFNL:
 			case GIT_DIFF_LINE_ADD_EOFNL:
-				prev = i ? git_array_get(patch->lines, i - 1) : NULL;
+				prev = i ? git_array_get(patch->lines, linenum - 1) : NULL;
 				if (prev && prev->content[prev->content_len - 1] == '\n')
 					prev->content_len -= 1;
 				break;