summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2019-02-21 10:31:21 +0100
committerGitHub <noreply@github.com>2019-02-21 10:31:21 +0100
commit554b3b9aa594e5df6273115dbee8f6035837120b (patch)
treed31f64fae9f5668c4b8ff7efa05e507de187658a /tests
parent6eb4947d05ddb586cb89c38d3199daf6752c3c78 (diff)
parent966b944095edf9910a332bb73249b5d7d6ebeb2f (diff)
downloadlibgit2-554b3b9aa594e5df6273115dbee8f6035837120b.tar.gz
Merge pull request #4996 from eaigner/master
Prevent reading out of bounds memory
Diffstat (limited to 'tests')
-rw-r--r--tests/apply/fromdiff.c33
1 files changed, 33 insertions, 0 deletions
diff --git a/tests/apply/fromdiff.c b/tests/apply/fromdiff.c
index 8a6d8fa0a..832415d79 100644
--- a/tests/apply/fromdiff.c
+++ b/tests/apply/fromdiff.c
@@ -333,3 +333,36 @@ void test_apply_fromdiff__binary_delete(void)
NULL, NULL,
NULL, &binary_opts));
}
+
+void test_apply_fromdiff__patching_correctly_truncates_source(void)
+{
+ git_buf original = GIT_BUF_INIT, patched = GIT_BUF_INIT;
+ git_patch *patch;
+ unsigned int mode;
+ char *path;
+
+ cl_git_pass(git_patch_from_buffers(&patch,
+ "foo\nbar", 7, "file.txt",
+ "foo\nfoo", 7, "file.txt", NULL));
+
+ /*
+ * Previously, we would fail to correctly truncate the source buffer if
+ * the source has more than one line and ends with a non-newline
+ * character. In the following call, we thus truncate the source string
+ * in the middle of the second line. Without the bug fixed, we would
+ * successfully apply the patch to the source and return success. With
+ * the overflow being fixed, we should return an error.
+ */
+ cl_git_fail_with(GIT_EAPPLYFAIL,
+ git_apply__patch(&patched, &path, &mode,
+ "foo\nbar\n", 5, patch, NULL));
+
+ /* Verify that the patch succeeds if we do not truncate */
+ cl_git_pass(git_apply__patch(&patched, &path, &mode,
+ "foo\nbar\n", 7, patch, NULL));
+
+ git_buf_dispose(&original);
+ git_buf_dispose(&patched);
+ git_patch_free(patch);
+ git__free(path);
+}