From 0b0bfc9af43a1c8ba3d9996684c636c88035315f Mon Sep 17 00:00:00 2001 From: Jakub Bogusz Date: Sat, 16 Dec 2023 19:51:52 +0100 Subject: [PATCH] - added tsan,asan,ubsan patches (fix issues detected by gcc sanitizers) --- cvs-fast-export-asan.patch | 20 ++++++ cvs-fast-export-tsan.patch | 120 ++++++++++++++++++++++++++++++++++++ cvs-fast-export-ubsan.patch | 39 ++++++++++++ cvs-fast-export.spec | 6 ++ 4 files changed, 185 insertions(+) create mode 100644 cvs-fast-export-asan.patch create mode 100644 cvs-fast-export-tsan.patch create mode 100644 cvs-fast-export-ubsan.patch diff --git a/cvs-fast-export-asan.patch b/cvs-fast-export-asan.patch new file mode 100644 index 0000000..26b4721 --- /dev/null +++ b/cvs-fast-export-asan.patch @@ -0,0 +1,20 @@ +--- cvs-fast-export-1.62/export.c.orig 2023-12-10 22:08:38.039921414 +0100 ++++ cvs-fast-export-1.62/export.c 2023-12-11 06:17:08.424656665 +0100 +@@ -208,7 +208,7 @@ static void export_blob(node_t *node, + for (char *cp = cbuf; cp < cbuf + len; cp++) + if (*cp == ' ') + *cp = '\n'; +- if (strlen(cbuf) >= 2 && cbuf[0] == '!' && cbuf[1] == '\n') ++ if (strnlen(cbuf, len) >= 2 && cbuf[0] == '!' && cbuf[1] == '\n') + extralen = 0; + } + +@@ -697,7 +697,7 @@ static struct commit_seq *canonicalize(g + #define is_branchroot_of(x, y) ((x)->head == (y)->head && (x)->isbase) + #define is_older_than(x, y) (((struct commit_seq *)x)->commit->date < ((struct commit_seq *)y)->commit->date) + /* back up as far as we can */ +- while (!is_parent_of(bp-1, hp) && !is_branchroot_of(bp-1, hp) && !is_older_than(bp-1, hp)) ++ while ((bp > history) && !is_parent_of(bp-1, hp) && !is_branchroot_of(bp-1, hp) && !is_older_than(bp-1, hp)) + bp--; + if (bp < hp) { + /* shift commits up and put *hp where *bp was */ diff --git a/cvs-fast-export-tsan.patch b/cvs-fast-export-tsan.patch new file mode 100644 index 0000000..48b831a --- /dev/null +++ b/cvs-fast-export-tsan.patch @@ -0,0 +1,120 @@ +--- cvs-fast-export-1.62/atom.c.orig 2023-12-10 21:33:28.557717340 +0100 ++++ cvs-fast-export-1.62/atom.c 2023-12-10 21:33:33.707747222 +0100 +@@ -99,21 +99,22 @@ atom(const char *string) + hash_bucket_t *b; + int len; + +- while ((b = *head)) { +-collision: +- if (b->hash == hash && !strcmp(string, b->string)) +- return b->string; +- head = &(b->next); +- } + #ifdef THREADS + if (threads > 1) + pthread_mutex_lock(&bucket_mutex); + #endif /* THREADS */ +- if ((b = *head)) { ++ while ((b = *head)) { ++collision: ++ if (b->hash == hash && !strcmp(string, b->string)) { + #ifdef THREADS + if (threads > 1) + pthread_mutex_unlock(&bucket_mutex); + #endif /* THREADS */ ++ return b->string; ++ } ++ head = &(b->next); ++ } ++ if ((b = *head)) { + goto collision; + } + +@@ -154,21 +155,22 @@ atom_cvs_number(const cvs_number n) + number_bucket_t **head = &number_buckets[bucket]; + number_bucket_t *b; + +- while ((b = *head)) { +- collision: +- if (cvs_number_equal(&b->number, &n)) +- return &b->number; +- head = &(b->next); +- } + #ifdef THREADS + if (threads > 1) + pthread_mutex_lock(&number_bucket_mutex); + #endif /* THREADS */ +- if ((b = *head)) { ++ while ((b = *head)) { ++ collision: ++ if (cvs_number_equal(&b->number, &n)) { + #ifdef THREADS + if (threads > 1) + pthread_mutex_unlock(&number_bucket_mutex); + #endif /* THREADS */ ++ return &b->number; ++ } ++ head = &(b->next); ++ } ++ if ((b = *head)) { + goto collision; + } + +--- cvs-fast-export-1.62/revcvs.c.orig 2023-05-13 19:35:07.000000000 +0200 ++++ cvs-fast-export-1.62/revcvs.c 2023-12-10 21:41:28.540502302 +0100 +@@ -22,6 +22,9 @@ + #endif + + const master_dir *root_dir = NULL; ++#ifdef THREADS ++static pthread_mutex_t root_dir_mutex = PTHREAD_MUTEX_INITIALIZER; ++#endif + + static const char * + fileop_name(const char *rectified) +@@ -86,21 +89,22 @@ atom_dir(const char* dirname) + dir_bucket **head = &dir_buckets[HASH_VALUE(dirname) % DIR_BUCKETS]; + dir_bucket *b; + +- while ((b = *head)) { +- collision: +- if (b->dir.name == dirname) +- return &(b->dir); +- head = &(b->next); +- } + #ifdef THREADS + if (threads > 1) + pthread_mutex_lock(&dir_bucket_mutex); + #endif /* THREADS */ +- if ((b = *head)) { ++ while ((b = *head)) { ++ collision: ++ if (b->dir.name == dirname) { + #ifdef THREADS + if (threads > 1) + pthread_mutex_unlock(&dir_bucket_mutex); + #endif /* THREADS */ ++ return &(b->dir); ++ } ++ head = &(b->next); ++ } ++ if ((b = *head)) { + goto collision; + } + b = xmalloc(sizeof(dir_bucket), __func__); +@@ -800,7 +803,15 @@ cvs_master_digest(cvs_file *cvs, cvs_mas + cvs_branch *cb; + cvs_version *ctrunk = NULL; + ++#ifdef THREADS ++ if (threads > 1) ++ pthread_mutex_lock(&root_dir_mutex); ++#endif + if (!root_dir) root_dir = atom_dir(atom("\0")); ++#ifdef THREADS ++ if (threads > 1) ++ pthread_mutex_unlock(&root_dir_mutex); ++#endif + build_rev_master(cvs, master); + #if CVSDEBUG + char buf[CVS_MAX_REV_LEN]; diff --git a/cvs-fast-export-ubsan.patch b/cvs-fast-export-ubsan.patch new file mode 100644 index 0000000..ab61831 --- /dev/null +++ b/cvs-fast-export-ubsan.patch @@ -0,0 +1,39 @@ +--- cvs-fast-export-1.62/treepack.c.orig 2019-04-26 16:03:34.000000000 +0200 ++++ cvs-fast-export-1.62/treepack.c 2023-12-11 20:26:03.515346763 +0100 +@@ -215,6 +215,7 @@ revdir_pack_init(void) + frame = frames; + nfiles = 0; + frames[0].dir = root_dir; ++ frames[0].dirs = xmalloc(0, __func__); + frames[0].ndirs = 0; + frames[0].hash = hash_init(); + } +@@ -257,6 +257,7 @@ revdir_pack_add(const cvs_commit *file, + + const master_dir *parent = frame++->dir; + frame->dir = first_subdir(dir, parent); ++ frame->dirs = xmalloc(0, __func__); + frame->ndirs = 0; + frame->hash = hash_init(); + continue; +--- cvs-fast-export-1.62/generate.c.orig 2023-12-16 09:25:49.122347160 +0100 ++++ cvs-fast-export-1.62/generate.c 2023-12-16 09:25:51.565694258 +0100 +@@ -1058,7 +1058,7 @@ static node_t *generate_setup(generator_ + eb->Gfilename = gen->master_name; + eb->Gexpand = gen->expand; + eb->Gabspath = NULL; +- Gline(eb) = NULL; Ggap(eb) = Ggapsize(eb) = Glinemax(eb) = 0; ++ Gline(eb) = xmalloc(0, __func__); Ggap(eb) = Ggapsize(eb) = Glinemax(eb) = 0; + } + + return gen->nodehash.head_node; +--- cvs-fast-export-1.62/import.c.orig 2023-08-28 19:20:50.000000000 +0200 ++++ cvs-fast-export-1.62/import.c 2023-12-16 19:32:48.695246837 +0100 +@@ -322,6 +322,7 @@ void analyze_masters(int argc, const cha + striplen = analyzer->striplen; + + forest->textsize = forest->filecount = 0; ++ forest->cvsroot = false; + progress_begin("Reading file list...", NO_MAX); + for (;;) + { diff --git a/cvs-fast-export.spec b/cvs-fast-export.spec index f7745f9..c49c67c 100644 --- a/cvs-fast-export.spec +++ b/cvs-fast-export.spec @@ -12,6 +12,9 @@ Group: Development/Version Control Source0: http://www.catb.org/~esr/cvs-fast-export/%{name}-%{version}.tar.gz # Source0-md5: 8ed2dac4c7c1763d8351650d0bb2630c Patch0: hack-disable-cvsignore.patch +Patch1: %{name}-tsan.patch +Patch2: %{name}-asan.patch +Patch3: %{name}-ubsan.patch URL: http://www.catb.org/~esr/cvs-fast-export/ BuildRequires: asciidoc BuildRequires: sed >= 4.0 @@ -45,6 +48,9 @@ ze zdalnych serwerów CVS. %prep %setup -q %patch0 -p1 +%patch1 -p1 +%patch2 -p1 +%patch3 -p1 %{__sed} -i -e '1s,/usr/bin/env python3$,%{__python3},' cvsconvert cvsstrip -- 2.44.0