From b7817ffbd8be5648f34cbdbac0aef782f28193d6 Mon Sep 17 00:00:00 2001 From: Viet Hung Nguyen Date: Thu, 9 Jul 2020 01:18:48 -0700 Subject: [PATCH] xdiff: renamed third-party xdiff functions Summary: Renamed xdiff functions to avoid linking issues when using both libgit2-sys and xdiff. When using repo_import tool (https://fburl.com/diffusion/8p6fhjt2) we have libgit2-sys dependency for importing git repos. However, when we derive blame data types, we need to use xdiff functionalities (from_no_parents: https://fburl.com/diffusion/pitukmyo -> diff_hunks: https://fburl.com/diffusion/9f8caan9 -> xdl_diff: https://fburl.com/diffusion/260x66hf). Both libgit2 and eden/scm have vendored versions of xdiff library. Therefore, libgit2-sys and eden/scm share functions with the same signatures, but have different behaviours and when we tried to derive blame, it used libgit2-sys's xdl_diff instead of eden's. This resulted in getting segfaults (https://fburl.com/paste/04gwalpo). Note: repo_import is the first tool that has tried to import both and the first to run into this issue. Reviewed By: StanislavGlebik Differential Revision: D22432330 fbshipit-source-id: f2b965f3926a2dc45de1bf20e41dad70ca09cdfd --- eden/scm/contrib/xdiff/xdiff.c | 2 +- eden/scm/edenscm/mercurial/cext/xdiff.c | 2 +- eden/scm/lib/third-party/xdiff/xdiff.h | 6 +-- eden/scm/lib/third-party/xdiff/xdiffi.c | 38 +++++++++---------- eden/scm/lib/third-party/xdiff/xdiffi.h | 10 ++--- eden/scm/lib/third-party/xdiff/xprepare.c | 2 +- eden/scm/lib/third-party/xdiff/xutils.c | 8 ++-- .../lib/xdiff-sys/src/bin/xdiff-sys-bin.rs | 4 +- eden/scm/lib/xdiff-sys/src/bindgen.rs | 9 +++-- eden/scm/lib/xdiff-sys/src/lib.rs | 6 +-- eden/scm/lib/xdiff/src/lib.rs | 2 +- 11 files changed, 46 insertions(+), 43 deletions(-) diff --git a/eden/scm/contrib/xdiff/xdiff.c b/eden/scm/contrib/xdiff/xdiff.c index 29014f972a..aed5b8b581 100644 --- a/eden/scm/contrib/xdiff/xdiff.c +++ b/eden/scm/contrib/xdiff/xdiff.c @@ -70,7 +70,7 @@ int main(int argc, char const *argv[]) 0, /* priv */ }; - xdl_diff(&a, &b, &xpp, &xecfg, &ecb); + xdl_diff_vendored(&a, &b, &xpp, &xecfg, &ecb); free(a.ptr); free(b.ptr); diff --git a/eden/scm/edenscm/mercurial/cext/xdiff.c b/eden/scm/edenscm/mercurial/cext/xdiff.c index 98f56cb032..add4abe6fa 100644 --- a/eden/scm/edenscm/mercurial/cext/xdiff.c +++ b/eden/scm/edenscm/mercurial/cext/xdiff.c @@ -52,7 +52,7 @@ static PyObject* blocks(PyObject* self, PyObject* args) { rl, /* priv */ }; - if (xdl_diff(&a, &b, &xpp, &xecfg, &ecb) != 0) { + if (xdl_diff_vendored(&a, &b, &xpp, &xecfg, &ecb) != 0) { Py_DECREF(rl); return PyErr_NoMemory(); } diff --git a/eden/scm/lib/third-party/xdiff/xdiff.h b/eden/scm/lib/third-party/xdiff/xdiff.h index 5a86104b5e..554f23aef4 100644 --- a/eden/scm/lib/third-party/xdiff/xdiff.h +++ b/eden/scm/lib/third-party/xdiff/xdiff.h @@ -71,10 +71,10 @@ typedef struct s_xdemitconf { #define xdl_free(ptr) free(ptr) #define xdl_realloc(ptr,x) realloc(ptr,x) -void *xdl_mmfile_first(mmfile_t *mmf, int64_t *size); -int64_t xdl_mmfile_size(mmfile_t *mmf); +void *xdl_mmfile_first_vendored(mmfile_t *mmf, int64_t *size); +int64_t xdl_mmfile_size_vendored(mmfile_t *mmf); -int xdl_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, +int xdl_diff_vendored(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, xdemitconf_t const *xecfg, xdemitcb_t *ecb); #ifdef __cplusplus diff --git a/eden/scm/lib/third-party/xdiff/xdiffi.c b/eden/scm/lib/third-party/xdiff/xdiffi.c index b2756c7647..c188bd5f73 100644 --- a/eden/scm/lib/third-party/xdiff/xdiffi.c +++ b/eden/scm/lib/third-party/xdiff/xdiffi.c @@ -269,7 +269,7 @@ static int64_t xdl_split(uint64_t const *ha1, int64_t off1, int64_t lim1, * the box splitting function. Note that the real job (marking changed lines) * is done in the two boundary reaching checks. */ -int xdl_recs_cmp(diffdata_t *dd1, int64_t off1, int64_t lim1, +int xdl_recs_cmp_vendored(diffdata_t *dd1, int64_t off1, int64_t lim1, diffdata_t *dd2, int64_t off2, int64_t lim2, int64_t *kvdf, int64_t *kvdb, int need_min, xdalgoenv_t *xenv) { uint64_t const *ha1 = dd1->ha, *ha2 = dd2->ha; @@ -312,9 +312,9 @@ int xdl_recs_cmp(diffdata_t *dd1, int64_t off1, int64_t lim1, /* * ... et Impera. */ - if (xdl_recs_cmp(dd1, off1, spl.i1, dd2, off2, spl.i2, + if (xdl_recs_cmp_vendored(dd1, off1, spl.i1, dd2, off2, spl.i2, kvdf, kvdb, spl.min_lo, xenv) < 0 || - xdl_recs_cmp(dd1, spl.i1, lim1, dd2, spl.i2, lim2, + xdl_recs_cmp_vendored(dd1, spl.i1, lim1, dd2, spl.i2, lim2, kvdf, kvdb, spl.min_hi, xenv) < 0) { return -1; @@ -325,7 +325,7 @@ int xdl_recs_cmp(diffdata_t *dd1, int64_t off1, int64_t lim1, } -int xdl_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, +int xdl_do_diff_vendored(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, xdfenv_t *xe) { int64_t ndiags; int64_t *kvd, *kvdf, *kvdb; @@ -367,7 +367,7 @@ int xdl_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, dd2.rchg = xe->xdf2.rchg; dd2.rindex = xe->xdf2.rindex; - if (xdl_recs_cmp(&dd1, 0, dd1.nrec, &dd2, 0, dd2.nrec, + if (xdl_recs_cmp_vendored(&dd1, 0, dd1.nrec, &dd2, 0, dd2.nrec, kvdf, kvdb, (xpp->flags & XDF_NEED_MINIMAL) != 0, &xenv) < 0) { xdl_free(kvd); @@ -817,7 +817,7 @@ static void xdl_bug(const char *msg) * This also helps in finding joinable change groups and reducing the diff * size. */ -int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, int64_t flags) { +int xdl_change_compact_vendored(xdfile_t *xdf, xdfile_t *xdfo, int64_t flags) { struct xdlgroup g, go; int64_t earliest_end, end_matching_other; int64_t groupsize; @@ -971,7 +971,7 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, int64_t flags) { } -int xdl_build_script(xdfenv_t *xe, xdchange_t **xscr) { +int xdl_build_script_vendored(xdfenv_t *xe, xdchange_t **xscr) { xdchange_t *cscr = NULL, *xch; char *rchg1 = xe->xdf1.rchg, *rchg2 = xe->xdf2.rchg; int64_t i1, i2, l1, l2; @@ -985,7 +985,7 @@ int xdl_build_script(xdfenv_t *xe, xdchange_t **xscr) { for (l2 = i2; rchg2[i2 - 1]; i2--); if (!(xch = xdl_add_change(cscr, i1, i2, l1 - i1, l2 - i2))) { - xdl_free_script(cscr); + xdl_free_script_vendored(cscr); return -1; } cscr = xch; @@ -997,7 +997,7 @@ int xdl_build_script(xdfenv_t *xe, xdchange_t **xscr) { } -void xdl_free_script(xdchange_t *xscr) { +void xdl_free_script_vendored(xdchange_t *xscr) { xdchange_t *xch; while ((xch = xscr) != NULL) { @@ -1012,7 +1012,7 @@ void xdl_free_script(xdchange_t *xscr) { * inside the differential hunk according to the specified configuration. * Also advance xscr if the first changes must be discarded. */ -xdchange_t *xdl_get_hunk(xdchange_t **xscr) +xdchange_t *xdl_get_hunk_vendored(xdchange_t **xscr) { xdchange_t *xch, *xchp, *lxch; uint64_t ignored = 0; /* number of ignored blank lines */ @@ -1068,7 +1068,7 @@ static int xdl_call_hunk_func(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb, if ((xecfg->flags & XDL_EMIT_BDIFFHUNK) != 0) { int64_t i1 = 0, i2 = 0, n1 = xe->xdf1.nrec, n2 = xe->xdf2.nrec; for (xch = xscr; xch; xch = xche->next) { - xche = xdl_get_hunk(&xch); + xche = xdl_get_hunk_vendored(&xch); if (!xch) break; if (xch != xche) @@ -1087,7 +1087,7 @@ static int xdl_call_hunk_func(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb, return -1; } else { for (xch = xscr; xch; xch = xche->next) { - xche = xdl_get_hunk(&xch); + xche = xdl_get_hunk_vendored(&xch); if (!xch) break; if (xecfg->hunk_func(xch->i1 + p, @@ -1101,29 +1101,29 @@ static int xdl_call_hunk_func(xdfenv_t *xe, xdchange_t *xscr, xdemitcb_t *ecb, return 0; } -int xdl_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, +int xdl_diff_vendored(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, xdemitconf_t const *xecfg, xdemitcb_t *ecb) { xdchange_t *xscr; xdfenv_t xe; - if (xdl_do_diff(mf1, mf2, xpp, &xe) < 0) { + if (xdl_do_diff_vendored(mf1, mf2, xpp, &xe) < 0) { return -1; } - if (xdl_change_compact(&xe.xdf1, &xe.xdf2, xpp->flags) < 0 || - xdl_change_compact(&xe.xdf2, &xe.xdf1, xpp->flags) < 0 || - xdl_build_script(&xe, &xscr) < 0) { + if (xdl_change_compact_vendored(&xe.xdf1, &xe.xdf2, xpp->flags) < 0 || + xdl_change_compact_vendored(&xe.xdf2, &xe.xdf1, xpp->flags) < 0 || + xdl_build_script_vendored(&xe, &xscr) < 0) { xdl_free_env(&xe); return -1; } if (xdl_call_hunk_func(&xe, xscr, ecb, xecfg) < 0) { - xdl_free_script(xscr); + xdl_free_script_vendored(xscr); xdl_free_env(&xe); return -1; } - xdl_free_script(xscr); + xdl_free_script_vendored(xscr); xdl_free_env(&xe); return 0; diff --git a/eden/scm/lib/third-party/xdiff/xdiffi.h b/eden/scm/lib/third-party/xdiff/xdiffi.h index 9d2721b4a5..c4ee9f0393 100644 --- a/eden/scm/lib/third-party/xdiff/xdiffi.h +++ b/eden/scm/lib/third-party/xdiff/xdiffi.h @@ -46,13 +46,13 @@ typedef struct s_xdchange { -int xdl_recs_cmp(diffdata_t *dd1, int64_t off1, int64_t lim1, +int xdl_recs_cmp_vendored(diffdata_t *dd1, int64_t off1, int64_t lim1, diffdata_t *dd2, int64_t off2, int64_t lim2, int64_t *kvdf, int64_t *kvdb, int need_min, xdalgoenv_t *xenv); -int xdl_do_diff(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, +int xdl_do_diff_vendored(mmfile_t *mf1, mmfile_t *mf2, xpparam_t const *xpp, xdfenv_t *xe); -int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, int64_t flags); -int xdl_build_script(xdfenv_t *xe, xdchange_t **xscr); -void xdl_free_script(xdchange_t *xscr); +int xdl_change_compact_vendored(xdfile_t *xdf, xdfile_t *xdfo, int64_t flags); +int xdl_build_script_vendored(xdfenv_t *xe, xdchange_t **xscr); +void xdl_free_script_vendored(xdchange_t *xscr); #endif /* #if !defined(XDIFFI_H) */ diff --git a/eden/scm/lib/third-party/xdiff/xprepare.c b/eden/scm/lib/third-party/xdiff/xprepare.c index 2fcf91206d..4aa2aab0d5 100644 --- a/eden/scm/lib/third-party/xdiff/xprepare.c +++ b/eden/scm/lib/third-party/xdiff/xprepare.c @@ -270,7 +270,7 @@ static int xdl_prepare_ctx(unsigned int pass, mmfile_t *mf, int64_t narec, } nrec = 0; - if ((cur = blk = xdl_mmfile_first(mf, &bsize)) != NULL) { + if ((cur = blk = xdl_mmfile_first_vendored(mf, &bsize)) != NULL) { for (top = blk + bsize; cur < top; ) { prev = cur; hav = xdl_hash_record(&cur, top); diff --git a/eden/scm/lib/third-party/xdiff/xutils.c b/eden/scm/lib/third-party/xdiff/xutils.c index 2c144293ea..ff8440f1ac 100644 --- a/eden/scm/lib/third-party/xdiff/xutils.c +++ b/eden/scm/lib/third-party/xdiff/xutils.c @@ -40,14 +40,14 @@ int64_t xdl_bogosqrt(int64_t n) { } -void *xdl_mmfile_first(mmfile_t *mmf, int64_t *size) +void *xdl_mmfile_first_vendored(mmfile_t *mmf, int64_t *size) { *size = mmf->size; return mmf->ptr; } -int64_t xdl_mmfile_size(mmfile_t *mmf) +int64_t xdl_mmfile_size_vendored(mmfile_t *mmf) { return mmf->size; } @@ -104,7 +104,7 @@ int64_t xdl_guess_lines(mmfile_t *mf, int64_t sample) { int64_t nl = 0, size, tsize = 0; char const *data, *cur, *top; - if ((cur = data = xdl_mmfile_first(mf, &size)) != NULL) { + if ((cur = data = xdl_mmfile_first_vendored(mf, &size)) != NULL) { for (top = data + size; nl < sample && cur < top; ) { nl++; if (!(cur = memchr(cur, '\n', top - cur))) @@ -116,7 +116,7 @@ int64_t xdl_guess_lines(mmfile_t *mf, int64_t sample) { } if (nl && tsize) - nl = xdl_mmfile_size(mf) / (tsize / nl); + nl = xdl_mmfile_size_vendored(mf) / (tsize / nl); return nl + 1; } diff --git a/eden/scm/lib/xdiff-sys/src/bin/xdiff-sys-bin.rs b/eden/scm/lib/xdiff-sys/src/bin/xdiff-sys-bin.rs index c3d728f5b7..8cfbd09b5d 100644 --- a/eden/scm/lib/xdiff-sys/src/bin/xdiff-sys-bin.rs +++ b/eden/scm/lib/xdiff-sys/src/bin/xdiff-sys-bin.rs @@ -13,7 +13,7 @@ extern crate xdiff_sys; use std::env; use std::fs; use std::os::raw::{c_char, c_int, c_void}; -use xdiff_sys::{mmfile_t, xdemitcb_t, xdemitconf_t, xdl_diff, xpparam_t}; +use xdiff_sys::{mmfile_t, xdemitcb_t, xdemitconf_t, xdl_diff_vendored, xpparam_t}; extern "C" fn hunk_func(a1: i64, a2: i64, b1: i64, b2: i64, _priv: *mut c_void) -> c_int { print!("@@ -{},{} +{},{} @@\n", a1, a2, b1, b2); @@ -48,7 +48,7 @@ fn main() -> Result<(), std::io::Error> { }; unsafe { - xdl_diff(&mut a_mmfile, &mut b_mmfile, &xpp, &xecfg, &mut ecb); + xdl_diff_vendored(&mut a_mmfile, &mut b_mmfile, &xpp, &xecfg, &mut ecb); } Ok(()) } diff --git a/eden/scm/lib/xdiff-sys/src/bindgen.rs b/eden/scm/lib/xdiff-sys/src/bindgen.rs index 9f8d10e4bd..0117e95c71 100644 --- a/eden/scm/lib/xdiff-sys/src/bindgen.rs +++ b/eden/scm/lib/xdiff-sys/src/bindgen.rs @@ -214,13 +214,16 @@ fn bindgen_test_layout_s_xdemitconf() { } pub type xdemitconf_t = s_xdemitconf; extern "C" { - pub fn xdl_mmfile_first(mmf: *mut mmfile_t, size: *mut i64) -> *mut ::std::os::raw::c_void; + pub fn xdl_mmfile_first_vendored( + mmf: *mut mmfile_t, + size: *mut i64, + ) -> *mut ::std::os::raw::c_void; } extern "C" { - pub fn xdl_mmfile_size(mmf: *mut mmfile_t) -> i64; + pub fn xdl_mmfile_size_vendored(mmf: *mut mmfile_t) -> i64; } extern "C" { - pub fn xdl_diff( + pub fn xdl_diff_vendored( mf1: *mut mmfile_t, mf2: *mut mmfile_t, xpp: *const xpparam_t, diff --git a/eden/scm/lib/xdiff-sys/src/lib.rs b/eden/scm/lib/xdiff-sys/src/lib.rs index df0eab2cb5..ded4ace7fa 100644 --- a/eden/scm/lib/xdiff-sys/src/lib.rs +++ b/eden/scm/lib/xdiff-sys/src/lib.rs @@ -5,7 +5,7 @@ * GNU General Public License version 2. */ -// A small subset of xdiff bindings that is just enough to run xdl_diff +// A small subset of xdiff bindings that is just enough to run xdl_diff_vendored #![allow(non_camel_case_types)] #![allow(non_snake_case)] @@ -19,7 +19,7 @@ mod tests { use std::os::raw::{c_char, c_int, c_void}; #[test] - fn test_xdl_diff() { + fn test_xdl_diff_vendored() { extern "C" fn hunk_func(a1: i64, a2: i64, b1: i64, b2: i64, _priv: *mut c_void) -> c_int { let mut _priv = unsafe { (_priv as *mut Vec<(i64, i64, i64, i64)>).as_mut() }; if let Some(result) = _priv { @@ -49,7 +49,7 @@ mod tests { }; unsafe { - xdl_diff(&mut a_mmfile, &mut b_mmfile, &xpp, &xecfg, &mut ecb); + xdl_diff_vendored(&mut a_mmfile, &mut b_mmfile, &xpp, &xecfg, &mut ecb); } assert_eq!(result, [(1, 1, 1, 0), (4, 0, 3, 1)]); } diff --git a/eden/scm/lib/xdiff/src/lib.rs b/eden/scm/lib/xdiff/src/lib.rs index 4815fe9a36..9b483e7cf3 100644 --- a/eden/scm/lib/xdiff/src/lib.rs +++ b/eden/scm/lib/xdiff/src/lib.rs @@ -102,7 +102,7 @@ where }; unsafe { - ffi::xdl_diff(&mut old_mmfile, &mut new_mmfile, &xpp, &xecfg, &mut ecb); + ffi::xdl_diff_vendored(&mut old_mmfile, &mut new_mmfile, &xpp, &xecfg, &mut ecb); } return result; }