diff options
author | Edward Thomson <ethomson@edwardthomson.com> | 2022-04-10 09:44:41 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-10 09:44:41 -0400 |
commit | 606afeda5a0ff4d7ccb1476428682e078364c24d (patch) | |
tree | f0ef597e2e292b69863796fc74dfac6384e883a0 | |
parent | 2fc0fcb5d6827c4107c571a7a076d029f7d3c442 (diff) | |
parent | 71bb92b565c2e55265c65c02be38909e829cef65 (diff) | |
download | libgit2-606afeda5a0ff4d7ccb1476428682e078364c24d.tar.gz |
Merge pull request #6244 from jorio/fix-diff_delta_format_path-crash
Fix crash when regenerating a patch with unquoted spaces in filename
-rw-r--r-- | src/libgit2/diff_print.c | 5 | ||||
-rw-r--r-- | tests/libgit2/diff/parse.c | 26 | ||||
-rw-r--r-- | tests/libgit2/patch/patch_common.h | 9 |
3 files changed, 40 insertions, 0 deletions
diff --git a/src/libgit2/diff_print.c b/src/libgit2/diff_print.c index 03d25b087..6c5a2cdc8 100644 --- a/src/libgit2/diff_print.c +++ b/src/libgit2/diff_print.c @@ -316,6 +316,11 @@ static int diff_print_oid_range( static int diff_delta_format_path( git_str *out, const char *prefix, const char *filename) { + if (!filename) { + /* don't prefix "/dev/null" */ + return git_str_puts(out, "/dev/null"); + } + if (git_str_joinpath(out, prefix, filename) < 0) return -1; diff --git a/tests/libgit2/diff/parse.c b/tests/libgit2/diff/parse.c index d3a0c8de6..9c3f798e4 100644 --- a/tests/libgit2/diff/parse.c +++ b/tests/libgit2/diff/parse.c @@ -431,6 +431,32 @@ void test_diff_parse__new_file_with_space(void) git_diff_free(diff); } +void test_diff_parse__new_file_with_space_and_regenerate_patch(void) +{ + const char *content = PATCH_ORIGINAL_NEW_FILE_WITH_SPACE; + git_diff *diff = NULL; + git_buf buf = GIT_BUF_INIT; + + cl_git_pass(git_diff_from_buffer(&diff, content, strlen(content))); + cl_git_pass(git_diff_to_buf(&buf, diff, GIT_DIFF_FORMAT_PATCH)); + + git_buf_dispose(&buf); + git_diff_free(diff); +} + +void test_diff_parse__delete_file_with_space_and_regenerate_patch(void) +{ + const char *content = PATCH_DELETE_FILE_WITH_SPACE; + git_diff *diff = NULL; + git_buf buf = GIT_BUF_INIT; + + cl_git_pass(git_diff_from_buffer(&diff, content, strlen(content))); + cl_git_pass(git_diff_to_buf(&buf, diff, GIT_DIFF_FORMAT_PATCH)); + + git_buf_dispose(&buf); + git_diff_free(diff); +} + void test_diff_parse__crlf(void) { const char *text = PATCH_CRLF; diff --git a/tests/libgit2/patch/patch_common.h b/tests/libgit2/patch/patch_common.h index 1e03889fc..7e2cb6a58 100644 --- a/tests/libgit2/patch/patch_common.h +++ b/tests/libgit2/patch/patch_common.h @@ -933,6 +933,15 @@ "@@ -0,0 +1 @@\n" \ "+a\n" +#define PATCH_DELETE_FILE_WITH_SPACE \ + "diff --git a/sp ace.txt b/sp ace.txt\n" \ + "deleted file mode 100644\n" \ + "index 789819226..000000000\n" \ + "--- a/sp ace.txt\n" \ + "+++ /dev/null\n" \ + "@@ -1 +0,0 @@\n" \ + "-a\n" + #define PATCH_CRLF \ "diff --git a/test-file b/test-file\r\n" \ "new file mode 100644\r\n" \ |