Merge branch 'vn/line-log-memcpy-size-fix' into maint
authorJunio C Hamano <gitster@pobox.com>
Thu, 16 Mar 2017 20:56:42 +0000 (13:56 -0700)
committerJunio C Hamano <gitster@pobox.com>
Thu, 16 Mar 2017 20:56:42 +0000 (13:56 -0700)
The command-line parsing of "git log -L" copied internal data
structures using incorrect size on ILP32 systems.

* vn/line-log-memcpy-size-fix:
  line-log: use COPY_ARRAY to fix mis-sized memcpy

1  2 
line-log.c

diff --combined line-log.c
@@@ -43,9 -43,10 +43,10 @@@ void range_set_release(struct range_se
  static void range_set_copy(struct range_set *dst, struct range_set *src)
  {
        range_set_init(dst, src->nr);
-       memcpy(dst->ranges, src->ranges, src->nr*sizeof(struct range_set));
+       COPY_ARRAY(dst->ranges, src->ranges, src->nr);
        dst->nr = src->nr;
  }
  static void range_set_move(struct range_set *dst, struct range_set *src)
  {
        range_set_release(dst);
@@@ -113,7 -114,7 +114,7 @@@ void sort_and_merge_range_set(struct ra
        int i;
        int o = 0; /* output cursor */
  
 -      qsort(rs->ranges, rs->nr, sizeof(struct range), range_cmp);
 +      QSORT(rs->ranges, rs->nr, range_cmp);
  
        for (i = 0; i < rs->nr; i++) {
                if (rs->ranges[i].start == rs->ranges[i].end)
  static void range_set_union(struct range_set *out,
                             struct range_set *a, struct range_set *b)
  {
 -      int i = 0, j = 0, o = 0;
 +      int i = 0, j = 0;
        struct range *ra = a->ranges;
        struct range *rb = b->ranges;
        /* cannot make an alias of out->ranges: it may change during grow */
                        new = &rb[j++];
                if (new->start == new->end)
                        ; /* empty range */
 -              else if (!o || out->ranges[o-1].end < new->start) {
 +              else if (!out->nr || out->ranges[out->nr-1].end < new->start) {
                        range_set_grow(out, 1);
 -                      out->ranges[o].start = new->start;
 -                      out->ranges[o].end = new->end;
 -                      o++;
 -              } else if (out->ranges[o-1].end < new->end) {
 -                      out->ranges[o-1].end = new->end;
 +                      out->ranges[out->nr].start = new->start;
 +                      out->ranges[out->nr].end = new->end;
 +                      out->nr++;
 +              } else if (out->ranges[out->nr-1].end < new->end) {
 +                      out->ranges[out->nr-1].end = new->end;
                }
        }
 -      out->nr = o;
  }
  
  /*