diff options
Diffstat (limited to 'src/patch_parse.c')
| -rw-r--r-- | src/patch_parse.c | 67 |
1 files changed, 36 insertions, 31 deletions
diff --git a/src/patch_parse.c b/src/patch_parse.c index 5ee09ee27..a531eec4d 100644 --- a/src/patch_parse.c +++ b/src/patch_parse.c @@ -4,9 +4,11 @@ * This file is part of libgit2, distributed under the GNU GPL v2 with * a Linking Exception. For full terms see the included COPYING file. */ + +#include "patch_parse.h" + #include "git2/patch.h" #include "patch.h" -#include "patch_parse.h" #include "diff_parse.h" #include "path.h" @@ -176,7 +178,7 @@ static int parse_header_mode(uint16_t *mode, git_patch_parse_ctx *ctx) int ret; if (ctx->line_len < 1 || !git__isdigit(ctx->line[0])) - return parse_err("invalid file mode at line %d", ctx->line_num); + return parse_err("invalid file mode at line %"PRIuZ, ctx->line_num); if ((ret = git__strntol32(&m, ctx->line, ctx->line_len, &end, 8)) < 0) return ret; @@ -205,7 +207,7 @@ static int parse_header_oid( if (len < GIT_OID_MINPREFIXLEN || len > GIT_OID_HEXSZ || git_oid_fromstrn(oid, ctx->line, len) < 0) - return parse_err("invalid hex formatted object id at line %d", + return parse_err("invalid hex formatted object id at line %"PRIuZ, ctx->line_num); parse_advance_chars(ctx, len); @@ -350,7 +352,7 @@ static int parse_header_similarity( git_patch_parsed *patch, git_patch_parse_ctx *ctx) { if (parse_header_percent(&patch->base.delta->similarity, ctx) < 0) - return parse_err("invalid similarity percentage at line %d", + return parse_err("invalid similarity percentage at line %"PRIuZ, ctx->line_num); return 0; @@ -362,7 +364,7 @@ static int parse_header_dissimilarity( uint16_t dissimilarity; if (parse_header_percent(&dissimilarity, ctx) < 0) - return parse_err("invalid similarity percentage at line %d", + return parse_err("invalid similarity percentage at line %"PRIuZ, ctx->line_num); patch->base.delta->similarity = 100 - dissimilarity; @@ -406,15 +408,15 @@ static int parse_header_git( /* Parse the diff --git line */ if (parse_advance_expected_str(ctx, "diff --git ") < 0) - return parse_err("corrupt git diff header at line %d", ctx->line_num); + return parse_err("corrupt git diff header at line %"PRIuZ, ctx->line_num); if (parse_header_path(&patch->header_old_path, ctx) < 0) - return parse_err("corrupt old path in git diff header at line %d", + return parse_err("corrupt old path in git diff header at line %"PRIuZ, ctx->line_num); if (parse_advance_ws(ctx) < 0 || parse_header_path(&patch->header_new_path, ctx) < 0) - return parse_err("corrupt new path in git diff header at line %d", + return parse_err("corrupt new path in git diff header at line %"PRIuZ, ctx->line_num); /* Parse remaining header lines */ @@ -444,10 +446,10 @@ static int parse_header_git( goto done; parse_advance_ws(ctx); - parse_advance_expected_str(ctx, "\n"); - if (ctx->line_len > 0) { - error = parse_err("trailing data at line %d", ctx->line_num); + if (parse_advance_expected_str(ctx, "\n") < 0 || + ctx->line_len > 0) { + error = parse_err("trailing data at line %"PRIuZ, ctx->line_num); goto done; } @@ -456,7 +458,7 @@ static int parse_header_git( } if (!found) { - error = parse_err("invalid patch header at line %d", + error = parse_err("invalid patch header at line %"PRIuZ, ctx->line_num); goto done; } @@ -536,7 +538,7 @@ static int parse_hunk_header( hunk->hunk.header_len = ctx->line - header_start; if (hunk->hunk.header_len > (GIT_DIFF_HUNK_HEADER_SIZE - 1)) - return parse_err("oversized patch hunk header at line %d", + return parse_err("oversized patch hunk header at line %"PRIuZ, ctx->line_num); memcpy(hunk->hunk.header, header_start, hunk->hunk.header_len); @@ -545,7 +547,7 @@ static int parse_hunk_header( return 0; fail: - giterr_set(GITERR_PATCH, "invalid patch hunk header at line %d", + giterr_set(GITERR_PATCH, "invalid patch hunk header at line %"PRIuZ, ctx->line_num); return -1; } @@ -562,15 +564,16 @@ 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; int prefix = 1; if (ctx->line_len == 0 || ctx->line[ctx->line_len - 1] != '\n') { - error = parse_err("invalid patch instruction at line %d", + error = parse_err("invalid patch instruction at line %"PRIuZ, ctx->line_num); goto done; } @@ -596,7 +599,7 @@ static int parse_hunk_body( break; default: - error = parse_err("invalid patch hunk at line %d", ctx->line_num); + error = parse_err("invalid patch hunk at line %"PRIuZ, ctx->line_num); goto done; } @@ -672,7 +675,7 @@ static int parse_patch_header( continue; } - error = parse_err("invalid hunk header outside patch at line %d", + error = parse_err("invalid hunk header outside patch at line %"PRIuZ, line_num); goto done; } @@ -715,12 +718,12 @@ static int parse_patch_binary_side( parse_advance_chars(ctx, 6); } else { error = parse_err( - "unknown binary delta type at line %d", ctx->line_num); + "unknown binary delta type at line %"PRIuZ, ctx->line_num); goto done; } if (parse_number(&len, ctx) < 0 || parse_advance_nl(ctx) < 0 || len < 0) { - error = parse_err("invalid binary size at line %d", ctx->line_num); + error = parse_err("invalid binary size at line %"PRIuZ, ctx->line_num); goto done; } @@ -736,7 +739,7 @@ static int parse_patch_binary_side( decoded_len = c - 'a' + (('z' - 'a') + 1) + 1; if (!decoded_len) { - error = parse_err("invalid binary length at line %d", ctx->line_num); + error = parse_err("invalid binary length at line %"PRIuZ, ctx->line_num); goto done; } @@ -745,7 +748,7 @@ static int parse_patch_binary_side( encoded_len = ((decoded_len / 4) + !!(decoded_len % 4)) * 5; if (encoded_len > ctx->line_len - 1) { - error = parse_err("truncated binary data at line %d", ctx->line_num); + error = parse_err("truncated binary data at line %"PRIuZ, ctx->line_num); goto done; } @@ -754,14 +757,14 @@ static int parse_patch_binary_side( goto done; if (decoded.size - decoded_orig != decoded_len) { - error = parse_err("truncated binary data at line %d", ctx->line_num); + error = parse_err("truncated binary data at line %"PRIuZ, ctx->line_num); goto done; } parse_advance_chars(ctx, encoded_len); if (parse_advance_nl(ctx) < 0) { - error = parse_err("trailing data at line %d", ctx->line_num); + error = parse_err("trailing data at line %"PRIuZ, ctx->line_num); goto done; } } @@ -785,7 +788,7 @@ static int parse_patch_binary( if (parse_advance_expected_str(ctx, "GIT binary patch") < 0 || parse_advance_nl(ctx) < 0) - return parse_err("corrupt git binary header at line %d", ctx->line_num); + return parse_err("corrupt git binary header at line %"PRIuZ, ctx->line_num); /* parse old->new binary diff */ if ((error = parse_patch_binary_side( @@ -793,7 +796,7 @@ static int parse_patch_binary( return error; if (parse_advance_nl(ctx) < 0) - return parse_err("corrupt git binary separator at line %d", + return parse_err("corrupt git binary separator at line %"PRIuZ, ctx->line_num); /* parse new->old binary diff */ @@ -802,7 +805,7 @@ static int parse_patch_binary( return error; if (parse_advance_nl(ctx) < 0) - return parse_err("corrupt git binary patch separator at line %d", + return parse_err("corrupt git binary patch separator at line %"PRIuZ, ctx->line_num); patch->base.binary.contains_data = 1; @@ -820,7 +823,7 @@ static int parse_patch_binary_nodata( parse_advance_expected_str(ctx, patch->header_new_path) < 0 || parse_advance_expected_str(ctx, " differ") < 0 || parse_advance_nl(ctx) < 0) - return parse_err("corrupt git binary header at line %d", ctx->line_num); + return parse_err("corrupt git binary header at line %"PRIuZ, ctx->line_num); patch->base.binary.contains_data = 0; patch->base.delta->flags |= GIT_DIFF_FLAG_BINARY; @@ -912,7 +915,7 @@ static int check_prefix( if (remain_len || !*path) return parse_err( - "header filename does not contain %d path components", + "header filename does not contain %"PRIuZ" path components", prefix_len); done: @@ -1014,8 +1017,10 @@ git_patch_parse_ctx *git_patch_parse_ctx_init( return NULL; if (content_len) { - if ((ctx->content = git__malloc(content_len)) == NULL) + if ((ctx->content = git__malloc(content_len)) == NULL) { + git__free(ctx); return NULL; + } memcpy((char *)ctx->content, content, content_len); } |
