diff options
author | Edward Thomson <ethomson@edwardthomson.com> | 2015-09-24 10:32:15 -0400 |
---|---|---|
committer | Edward Thomson <ethomson@github.com> | 2016-05-26 13:01:07 -0500 |
commit | 4117a2350f87456d76659d9327193bb708187ba9 (patch) | |
tree | cd15f610dda604355ec3755a2ffb0c95cc545a8d | |
parent | 6278fbc5dd5467e3f66f31dc9c4bb4a1a3519ba5 (diff) | |
download | libgit2-4117a2350f87456d76659d9327193bb708187ba9.tar.gz |
patch parse: dup the patch from the callers
-rw-r--r-- | src/patch.c | 6 | ||||
-rw-r--r-- | src/patch_diff.c | 6 | ||||
-rw-r--r-- | src/patch_parse.c | 27 |
3 files changed, 28 insertions, 11 deletions
diff --git a/src/patch.c b/src/patch.c index f05cfb21a..e14ffa9c0 100644 --- a/src/patch.c +++ b/src/patch.c @@ -196,12 +196,6 @@ int git_patch_get_line_in_hunk( static void git_patch__free(git_patch *patch) { - git_array_clear(patch->lines); - git_array_clear(patch->hunks); - - git__free((char *)patch->binary.old_file.data); - git__free((char *)patch->binary.new_file.data); - if (patch->free_fn) patch->free_fn(patch); } diff --git a/src/patch_diff.c b/src/patch_diff.c index 1a3aeda5e..b8adcf3e1 100644 --- a/src/patch_diff.c +++ b/src/patch_diff.c @@ -25,6 +25,12 @@ static void patch_diff_free(git_patch *p) { git_patch_diff *patch = (git_patch_diff *)p; + git_array_clear(patch->base.lines); + git_array_clear(patch->base.hunks); + + git__free((char *)patch->base.binary.old_file.data); + git__free((char *)patch->base.binary.new_file.data); + git_diff_file_content__clear(&patch->ofile); git_diff_file_content__clear(&patch->nfile); diff --git a/src/patch_parse.c b/src/patch_parse.c index 418ed1e0c..4e4e0a68a 100644 --- a/src/patch_parse.c +++ b/src/patch_parse.c @@ -10,6 +10,10 @@ typedef struct { git_patch_options opts; + /* the patch contents, which lines will point into. */ + /* TODO: allow us to point somewhere refcounted. */ + char *content; + /* the paths from the `diff --git` header, these will be used if this is not * a rename (and rename paths are specified) or if no `+++`/`---` line specify * the paths. @@ -523,7 +527,7 @@ static int parse_hunk_body( int newlines = hunk->hunk.new_lines; for (; - ctx->remain > 4 && (oldlines || newlines) && + ctx->remain > 4 && (oldlines || newlines) && memcmp(ctx->line, "@@ -", 4) != 0; parse_advance_line(ctx)) { @@ -931,6 +935,12 @@ static void patch_parsed__free(git_patch *p) if (!patch) return; + git__free((char *)patch->base.binary.old_file.data); + git__free((char *)patch->base.binary.new_file.data); + git_array_clear(patch->base.hunks); + git_array_clear(patch->base.lines); + git__free(patch->base.delta); + git__free(patch->old_prefix); git__free(patch->new_prefix); git__free(patch->header_old_path); @@ -939,9 +949,7 @@ static void patch_parsed__free(git_patch *p) git__free(patch->rename_new_path); git__free(patch->old_path); git__free(patch->new_path); - git_array_clear(patch->base.hunks); - git_array_clear(patch->base.lines); - git__free(patch->base.delta); + git__free(patch->content); git__free(patch); } @@ -969,10 +977,19 @@ int git_patch_from_patchfile( patch->base.free_fn = patch_parsed__free; patch->base.delta = git__calloc(1, sizeof(git_diff_delta)); + GITERR_CHECK_ALLOC(patch->base.delta); + patch->base.delta->status = GIT_DELTA_MODIFIED; patch->base.delta->nfiles = 2; - ctx.content = content; + if (content_len) { + patch->content = git__malloc(content_len); + GITERR_CHECK_ALLOC(patch->content); + + memcpy(patch->content, content, content_len); + } + + ctx.content = patch->content; ctx.content_len = content_len; ctx.remain = content_len; |