commit 0b0bfc9af43a1c8ba3d9996684c636c88035315f
Author: Jakub Bogusz <[email protected]>
Date:   Sat Dec 16 19:51:52 2023 +0100

    - 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(+)
---
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
 
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 (;;)
+     {
================================================================

---- gitweb:

http://git.pld-linux.org/gitweb.cgi/packages/cvs-fast-export.git/commitdiff/0b0bfc9af43a1c8ba3d9996684c636c88035315f

_______________________________________________
pld-cvs-commit mailing list
[email protected]
http://lists.pld-linux.org/mailman/listinfo/pld-cvs-commit

Reply via email to