diff options
author | Junio C Hamano <gitster@pobox.com> | 2013-01-06 22:10:23 -0800 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2013-01-06 22:10:23 -0800 |
commit | 1965f8cdbdf86930b99fd61ed2efb22ac3d6a725 (patch) | |
tree | 69bc7a0dc0ee9c83f126523c4412bebc31e33b36 | |
parent | 32238aeb730fda0f66ccc6ec2f1e342af8b9fd04 (diff) | |
parent | 5de7166d46d25fed3b8a181c3842cf4350ecdea4 (diff) | |
download | git-1965f8cdbdf86930b99fd61ed2efb22ac3d6a725.tar.gz git-1965f8cdbdf86930b99fd61ed2efb22ac3d6a725.tar.xz |
Merge branch 'jc/apply-trailing-blank-removal'
Fix to update_pre_post_images() that did not take into account the
possibility that whitespace fix could shrink the preimage and
change the number of lines in it.
* jc/apply-trailing-blank-removal:
apply.c:update_pre_post_images(): the preimage can be truncated
-rw-r--r-- | builtin/apply.c | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/builtin/apply.c b/builtin/apply.c index 156b3ce3b..6c11e8bc7 100644 --- a/builtin/apply.c +++ b/builtin/apply.c @@ -2095,7 +2095,7 @@ static void update_pre_post_images(struct image *preimage, char *buf, size_t len, size_t postlen) { - int i, ctx; + int i, ctx, reduced; char *new, *old, *fixed; struct image fixed_preimage; @@ -2105,8 +2105,10 @@ static void update_pre_post_images(struct image *preimage, * free "oldlines". */ prepare_image(&fixed_preimage, buf, len, 1); - assert(fixed_preimage.nr == preimage->nr); - for (i = 0; i < preimage->nr; i++) + assert(postlen + ? fixed_preimage.nr == preimage->nr + : fixed_preimage.nr <= preimage->nr); + for (i = 0; i < fixed_preimage.nr; i++) fixed_preimage.line[i].flag = preimage->line[i].flag; free(preimage->line_allocated); *preimage = fixed_preimage; @@ -2126,7 +2128,8 @@ static void update_pre_post_images(struct image *preimage, else new = old; fixed = preimage->buf; - for (i = ctx = 0; i < postimage->nr; i++) { + + for (i = reduced = ctx = 0; i < postimage->nr; i++) { size_t len = postimage->line[i].len; if (!(postimage->line[i].flag & LINE_COMMON)) { /* an added line -- no counterparts in preimage */ @@ -2145,8 +2148,15 @@ static void update_pre_post_images(struct image *preimage, fixed += preimage->line[ctx].len; ctx++; } - if (preimage->nr <= ctx) - die(_("oops")); + + /* + * preimage is expected to run out, if the caller + * fixed addition of trailing blank lines. + */ + if (preimage->nr <= ctx) { + reduced++; + continue; + } /* and copy it in, while fixing the line length */ len = preimage->line[ctx].len; @@ -2159,6 +2169,7 @@ static void update_pre_post_images(struct image *preimage, /* Fix the length of the whole thing */ postimage->len = new - postimage->buf; + postimage->nr -= reduced; } static int match_fragment(struct image *img, |