Skip to content

Commit 027630d

Browse files
committed
xdiff: update to xdiff from git 2.40.1
1 parent a821455 commit 027630d

File tree

11 files changed

+131
-129
lines changed

11 files changed

+131
-129
lines changed

deps/xdiff/git-xdiff.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,14 @@
2727
# endif
2828
#endif
2929

30+
#define XDL_UNUSED GIT_UNUSED_ARG
31+
3032
#define xdl_malloc(x) git__malloc(x)
33+
#define xdl_calloc(n, sz) git__calloc(n, sz)
3134
#define xdl_free(ptr) git__free(ptr)
3235
#define xdl_realloc(ptr, x) git__realloc(ptr, x)
3336

34-
#define XDL_BUG(msg) GIT_ASSERT(msg)
37+
#define XDL_BUG(msg) GIT_ASSERT(!msg)
3538

3639
#define xdl_regex_t git_regexp
3740
#define xdl_regmatch_t git_regmatch

deps/xdiff/xdiffi.c

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -315,16 +315,19 @@ int xdl_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
315315
long *kvd, *kvdf, *kvdb;
316316
xdalgoenv_t xenv;
317317
diffdata_t dd1, dd2;
318+
int res;
318319

319-
if (XDF_DIFF_ALG(xpp->flags) == XDF_PATIENCE_DIFF)
320-
return xdl_do_patience_diff(mf1, mf2, xpp, xe);
321-
322-
if (XDF_DIFF_ALG(xpp->flags) == XDF_HISTOGRAM_DIFF)
323-
return xdl_do_histogram_diff(mf1, mf2, xpp, xe);
320+
if (xdl_prepare_env(mf1, mf2, xpp, xe) < 0)
321+
return -1;
324322

325-
if (xdl_prepare_env(mf1, mf2, xpp, xe) < 0) {
323+
if (XDF_DIFF_ALG(xpp->flags) == XDF_PATIENCE_DIFF) {
324+
res = xdl_do_patience_diff(xpp, xe);
325+
goto out;
326+
}
326327

327-
return -1;
328+
if (XDF_DIFF_ALG(xpp->flags) == XDF_HISTOGRAM_DIFF) {
329+
res = xdl_do_histogram_diff(xpp, xe);
330+
goto out;
328331
}
329332

330333
/*
@@ -334,7 +337,7 @@ int xdl_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
334337
* One is to store the forward path and one to store the backward path.
335338
*/
336339
ndiags = xe->xdf1.nreff + xe->xdf2.nreff + 3;
337-
if (!(kvd = (long *) xdl_malloc((2 * ndiags + 2) * sizeof(long)))) {
340+
if (!XDL_ALLOC_ARRAY(kvd, 2 * ndiags + 2)) {
338341

339342
xdl_free_env(xe);
340343
return -1;
@@ -359,17 +362,15 @@ int xdl_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
359362
dd2.rchg = xe->xdf2.rchg;
360363
dd2.rindex = xe->xdf2.rindex;
361364

362-
if (xdl_recs_cmp(&dd1, 0, dd1.nrec, &dd2, 0, dd2.nrec,
363-
kvdf, kvdb, (xpp->flags & XDF_NEED_MINIMAL) != 0, &xenv) < 0) {
364-
365-
xdl_free(kvd);
366-
xdl_free_env(xe);
367-
return -1;
368-
}
369-
365+
res = xdl_recs_cmp(&dd1, 0, dd1.nrec, &dd2, 0, dd2.nrec,
366+
kvdf, kvdb, (xpp->flags & XDF_NEED_MINIMAL) != 0,
367+
&xenv);
370368
xdl_free(kvd);
369+
out:
370+
if (res < 0)
371+
xdl_free_env(xe);
371372

372-
return 0;
373+
return res;
373374
}
374375

375376

@@ -972,7 +973,7 @@ void xdl_free_script(xdchange_t *xscr) {
972973
}
973974
}
974975

975-
static int xdl_call_hunk_func(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
976+
static int xdl_call_hunk_func(xdfenv_t *xe XDL_UNUSED, xdchange_t *xscr, xdemitcb_t *ecb,
976977
xdemitconf_t const *xecfg)
977978
{
978979
xdchange_t *xch, *xche;

deps/xdiff/xdiffi.h

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,7 @@ int xdl_build_script(xdfenv_t *xe, xdchange_t **xscr);
5656
void xdl_free_script(xdchange_t *xscr);
5757
int xdl_emit_diff(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb,
5858
xdemitconf_t const *xecfg);
59-
int xdl_do_patience_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
60-
xdfenv_t *env);
61-
int xdl_do_histogram_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp,
62-
xdfenv_t *env);
59+
int xdl_do_patience_diff(xpparam_t const *xpp, xdfenv_t *env);
60+
int xdl_do_histogram_diff(xpparam_t const *xpp, xdfenv_t *env);
6361

6462
#endif /* #if !defined(XDIFFI_H) */

deps/xdiff/xemit.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ xdchange_t *xdl_get_hunk(xdchange_t **xscr, xdemitconf_t const *xecfg)
6565
*xscr = xch;
6666
}
6767

68-
if (*xscr == NULL)
68+
if (!*xscr)
6969
return NULL;
7070

7171
lxch = *xscr;
@@ -95,7 +95,7 @@ xdchange_t *xdl_get_hunk(xdchange_t **xscr, xdemitconf_t const *xecfg)
9595
}
9696

9797

98-
static long def_ff(const char *rec, long len, char *buf, long sz, void *priv)
98+
static long def_ff(const char *rec, long len, char *buf, long sz)
9999
{
100100
if (len > 0 &&
101101
(isalpha((unsigned char)*rec) || /* identifier? */
@@ -117,7 +117,7 @@ static long match_func_rec(xdfile_t *xdf, xdemitconf_t const *xecfg, long ri,
117117
const char *rec;
118118
long len = xdl_get_rec(xdf, ri, &rec);
119119
if (!xecfg->find_func)
120-
return def_ff(rec, len, buf, sz, xecfg->find_func_priv);
120+
return def_ff(rec, len, buf, sz);
121121
return xecfg->find_func(rec, len, buf, sz, xecfg->find_func_priv);
122122
}
123123

deps/xdiff/xhistogram.c

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ static int find_lcs(xpparam_t const *xpp, xdfenv_t *env,
251251
int line1, int count1, int line2, int count2)
252252
{
253253
int b_ptr;
254-
int sz, ret = -1;
254+
int ret = -1;
255255
struct histindex index;
256256

257257
memset(&index, 0, sizeof(index));
@@ -265,23 +265,16 @@ static int find_lcs(xpparam_t const *xpp, xdfenv_t *env,
265265
index.rcha.head = NULL;
266266

267267
index.table_bits = xdl_hashbits(count1);
268-
sz = index.records_size = 1 << index.table_bits;
269-
sz *= sizeof(struct record *);
270-
if (!(index.records = (struct record **) xdl_malloc(sz)))
268+
index.records_size = 1 << index.table_bits;
269+
if (!XDL_CALLOC_ARRAY(index.records, index.records_size))
271270
goto cleanup;
272-
memset(index.records, 0, sz);
273271

274-
sz = index.line_map_size = count1;
275-
sz *= sizeof(struct record *);
276-
if (!(index.line_map = (struct record **) xdl_malloc(sz)))
272+
index.line_map_size = count1;
273+
if (!XDL_CALLOC_ARRAY(index.line_map, index.line_map_size))
277274
goto cleanup;
278-
memset(index.line_map, 0, sz);
279275

280-
sz = index.line_map_size;
281-
sz *= sizeof(unsigned int);
282-
if (!(index.next_ptrs = (unsigned int *) xdl_malloc(sz)))
276+
if (!XDL_CALLOC_ARRAY(index.next_ptrs, index.line_map_size))
283277
goto cleanup;
284-
memset(index.next_ptrs, 0, sz);
285278

286279
/* lines / 4 + 1 comes from xprepare.c:xdl_prepare_ctx() */
287280
if (xdl_cha_init(&index.rcha, sizeof(struct record), count1 / 4 + 1) < 0)
@@ -369,12 +362,8 @@ static int histogram_diff(xpparam_t const *xpp, xdfenv_t *env,
369362
return result;
370363
}
371364

372-
int xdl_do_histogram_diff(mmfile_t *file1, mmfile_t *file2,
373-
xpparam_t const *xpp, xdfenv_t *env)
365+
int xdl_do_histogram_diff(xpparam_t const *xpp, xdfenv_t *env)
374366
{
375-
if (xdl_prepare_env(file1, file2, xpp, env) < 0)
376-
return -1;
377-
378367
return histogram_diff(xpp, env,
379368
env->xdf1.dstart + 1, env->xdf1.dend - env->xdf1.dstart + 1,
380369
env->xdf2.dstart + 1, env->xdf2.dend - env->xdf2.dstart + 1);

deps/xdiff/xmacros.h

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
#define XDL_ADDBITS(v,b) ((v) + ((v) >> (b)))
3535
#define XDL_MASKBITS(b) ((1UL << (b)) - 1)
3636
#define XDL_HASHLONG(v,b) (XDL_ADDBITS((unsigned long)(v), b) & XDL_MASKBITS(b))
37-
#define XDL_PTRFREE(p) do { if (p) { xdl_free(p); (p) = NULL; } } while (0)
3837
#define XDL_LE32_PUT(p, v) \
3938
do { \
4039
unsigned char *__p = (unsigned char *) (p); \
@@ -50,5 +49,23 @@ do { \
5049
((unsigned long) __p[2]) << 16 | ((unsigned long) __p[3]) << 24; \
5150
} while (0)
5251

52+
/* Allocate an array of nr elements, returns NULL on failure */
53+
#define XDL_ALLOC_ARRAY(p, nr) \
54+
((p) = SIZE_MAX / sizeof(*(p)) >= (size_t)(nr) \
55+
? xdl_malloc((nr) * sizeof(*(p))) \
56+
: NULL)
57+
58+
/* Allocate an array of nr zeroed out elements, returns NULL on failure */
59+
#define XDL_CALLOC_ARRAY(p, nr) ((p) = xdl_calloc(nr, sizeof(*(p))))
60+
61+
/*
62+
* Ensure array p can accommodate at least nr elements, growing the
63+
* array and updating alloc (which is the number of allocated
64+
* elements) as necessary. Frees p and returns -1 on failure, returns
65+
* 0 on success
66+
*/
67+
#define XDL_ALLOC_GROW(p, nr, alloc) \
68+
(-!((nr) <= (alloc) || \
69+
((p) = xdl_alloc_grow_helper((p), (nr), &(alloc), sizeof(*(p))))))
5370

5471
#endif /* #if !defined(XMACROS_H) */

deps/xdiff/xmerge.c

Lines changed: 24 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ static int xdl_cleanup_merge(xdmerge_t *c)
8888
if (c->mode == 0)
8989
count++;
9090
next_c = c->next;
91-
xdl_free(c);
91+
free(c);
9292
}
9393
return count;
9494
}
@@ -456,7 +456,7 @@ static void xdl_merge_two_conflicts(xdmerge_t *m)
456456
m->chg1 = next_m->i1 + next_m->chg1 - m->i1;
457457
m->chg2 = next_m->i2 + next_m->chg2 - m->i2;
458458
m->next = next_m->next;
459-
xdl_free(next_m);
459+
free(next_m);
460460
}
461461

462462
/*
@@ -684,54 +684,56 @@ static int xdl_do_merge(xdfenv_t *xe1, xdchange_t *xscr1,
684684
int xdl_merge(mmfile_t *orig, mmfile_t *mf1, mmfile_t *mf2,
685685
xmparam_t const *xmp, mmbuffer_t *result)
686686
{
687-
xdchange_t *xscr1, *xscr2;
687+
xdchange_t *xscr1 = NULL, *xscr2 = NULL;
688688
xdfenv_t xe1, xe2;
689-
int status;
689+
int status = -1;
690690
xpparam_t const *xpp = &xmp->xpp;
691691

692692
result->ptr = NULL;
693693
result->size = 0;
694694

695-
if (xdl_do_diff(orig, mf1, xpp, &xe1) < 0) {
695+
if (xdl_do_diff(orig, mf1, xpp, &xe1) < 0)
696696
return -1;
697-
}
698-
if (xdl_do_diff(orig, mf2, xpp, &xe2) < 0) {
699-
xdl_free_env(&xe1);
700-
return -1;
701-
}
697+
698+
if (xdl_do_diff(orig, mf2, xpp, &xe2) < 0)
699+
goto free_xe1; /* avoid double free of xe2 */
700+
702701
if (xdl_change_compact(&xe1.xdf1, &xe1.xdf2, xpp->flags) < 0 ||
703702
xdl_change_compact(&xe1.xdf2, &xe1.xdf1, xpp->flags) < 0 ||
704-
xdl_build_script(&xe1, &xscr1) < 0) {
705-
xdl_free_env(&xe1);
706-
return -1;
707-
}
703+
xdl_build_script(&xe1, &xscr1) < 0)
704+
goto out;
705+
708706
if (xdl_change_compact(&xe2.xdf1, &xe2.xdf2, xpp->flags) < 0 ||
709707
xdl_change_compact(&xe2.xdf2, &xe2.xdf1, xpp->flags) < 0 ||
710-
xdl_build_script(&xe2, &xscr2) < 0) {
711-
xdl_free_script(xscr1);
712-
xdl_free_env(&xe1);
713-
xdl_free_env(&xe2);
714-
return -1;
715-
}
716-
status = 0;
708+
xdl_build_script(&xe2, &xscr2) < 0)
709+
goto out;
710+
717711
if (!xscr1) {
718712
result->ptr = xdl_malloc(mf2->size);
713+
if (!result->ptr)
714+
goto out;
715+
status = 0;
719716
memcpy(result->ptr, mf2->ptr, mf2->size);
720717
result->size = mf2->size;
721718
} else if (!xscr2) {
722719
result->ptr = xdl_malloc(mf1->size);
720+
if (!result->ptr)
721+
goto out;
722+
status = 0;
723723
memcpy(result->ptr, mf1->ptr, mf1->size);
724724
result->size = mf1->size;
725725
} else {
726726
status = xdl_do_merge(&xe1, xscr1,
727727
&xe2, xscr2,
728728
xmp, result);
729729
}
730+
out:
730731
xdl_free_script(xscr1);
731732
xdl_free_script(xscr2);
732733

733-
xdl_free_env(&xe1);
734734
xdl_free_env(&xe2);
735+
free_xe1:
736+
xdl_free_env(&xe1);
735737

736738
return status;
737739
}

0 commit comments

Comments
 (0)