Skip to content
Commits on Source (4)
staden-io-lib (1.14.11-5) UNRELEASED; urgency=medium
* Fix hash table HASH_INT_KEYS on 32-bit platforms (thanks to
upstream Rob Davies)
* Do not attempt to run test suite for architecture independant
build.
-- Andreas Tille <tille@debian.org> Fri, 07 Dec 2018 12:52:29 +0100
staden-io-lib (1.14.11-4) unstable; urgency=medium
* Apply three patches from upstream to fix bugs on several
architectures (thanks a lot for the support by James Bonfield)
Closes: #915450, #915459, #915460
-- Andreas Tille <tille@debian.org> Fri, 07 Dec 2018 07:56:28 +0100
staden-io-lib (1.14.11-3) unstable; urgency=medium
* Remove bashism in test script
......
From: James Bonfield <jkb@sanger.ac.uk>
Date: Thu, 6 Dec 2018 12:23:53 +0000
Origin: https://github.com/jkbonfield/io_lib/commit/1b28b6a.patch
Bug-Debian: https://bugs.debian.org/915460
Subject: [PATCH] Fix rANS codec on x32 architecture.
This is 32-bit usage of a 64-bit processor. See
https://wiki.debian.org/X32Port
Should fix the bug found here:
https://buildd.debian.org/status/fetch.php?pkg=staden-io-lib&arch=x32&ver=1.14.11-3&stamp=1543952038&raw=0
---
io_lib/rANS_static.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/io_lib/rANS_static.c b/io_lib/rANS_static.c
index 4cd6264..e2f64a2 100644
--- a/io_lib/rANS_static.c
+++ b/io_lib/rANS_static.c
@@ -339,7 +339,7 @@ static inline void RansDecAdvanceSymbolStep(RansState* r, RansDecSymbol const* s
}
// Renormalize.
-#ifdef __x86_64
+#if defined(__x86_64) && !defined(__ILP32__)
/*
* Assembly variants of the RansDecRenorm code.
* These are based on joint ideas from Rob Davies and from looking at
From: Rob Davies <rmd+git@sanger.ac.uk>
Date: Fri, 7 Dec 2018 11:11:12 +0000
Origin: https://github.com/jkbonfield/io_lib/commit/242cd6b
Bug-Debian: https://bugs.debian.org/915460
Subject: [PATCH] Fix hash table HASH_INT_KEYS on 32-bit platforms
The hash table has the option to declare the key pointer is the key
itself rather than the memory it points to. It assumed however that
the key was 8 bytes long, rather than sizeof(char *).
Fixes Debian Bug#915460
---
io_lib/hash_table.c | 10 +++++-----
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/io_lib/hash_table.c b/io_lib/hash_table.c
index 6c37ff8..238cafa 100644
--- a/io_lib/hash_table.c
+++ b/io_lib/hash_table.c
@@ -478,7 +478,7 @@ int HashTableResize(HashTable *h, int newsize) {
for (hi = h->bucket[i]; hi; hi = next) {
uint64_t hv = h2->options & HASH_INT_KEYS
? hash64(h2->options & HASH_FUNC_MASK,
- (uint8_t *)&hi->key, hi->key_len) & h2->mask
+ (uint8_t *)&hi->key, sizeof(hi->key)) & h2->mask
: hash64(h2->options & HASH_FUNC_MASK,
(uint8_t *)hi->key, hi->key_len) & h2->mask;
next = hi->next;
@@ -535,7 +535,7 @@ HashItem *HashTableAdd(HashTable *h, char *key, int key_len, HashData data,
key_len = strlen(key);
hv = h->options & HASH_INT_KEYS
- ? hash64(h->options & HASH_FUNC_MASK, (uint8_t *)&key, key_len) & h->mask
+ ? hash64(h->options & HASH_FUNC_MASK, (uint8_t *)&key, sizeof(key)) & h->mask
: hash64(h->options & HASH_FUNC_MASK, (uint8_t *)key, key_len) & h->mask;
/* Already exists? */
@@ -603,7 +603,7 @@ int HashTableDel(HashTable *h, HashItem *hi, int deallocate_data) {
hv = h->options & HASH_INT_KEYS
? hash64(h->options & HASH_FUNC_MASK,
- (uint8_t *)&hi->key, hi->key_len) & h->mask
+ (uint8_t *)&hi->key, sizeof(hi->key)) & h->mask
: hash64(h->options & HASH_FUNC_MASK,
(uint8_t *)hi->key, hi->key_len) & h->mask;
@@ -651,7 +651,7 @@ int HashTableRemove(HashTable *h, char *key, int key_len,
key_len = strlen(key);
hv = h->options & HASH_INT_KEYS
- ? hash64(h->options & HASH_FUNC_MASK, (uint8_t *)&key, key_len) & h->mask
+ ? hash64(h->options & HASH_FUNC_MASK, (uint8_t *)&key, sizeof(key)) & h->mask
: hash64(h->options & HASH_FUNC_MASK, (uint8_t *)key, key_len) & h->mask;
last = NULL;
@@ -702,7 +702,7 @@ HashItem *HashTableSearch(HashTable *h, char *key, int key_len) {
key_len = strlen(key);
if (h->options & HASH_INT_KEYS) {
- hv = hash64(h->options & HASH_FUNC_MASK, (uint8_t *)&key, key_len)& h->mask;
+ hv = hash64(h->options & HASH_FUNC_MASK, (uint8_t *)&key, sizeof(key))& h->mask;
for (hi = h->bucket[hv]; hi; hi = hi->next) {
if ((int)(size_t)key == (int)(size_t)hi->key)
From: James Bonfield <jkb@sanger.ac.uk>
Date: Thu, 6 Dec 2018 12:00:39 +0000
Origin: https://github.com/jkbonfield/io_lib/commit/37b33d3.patch
Bug-Debian: https://bugs.debian.org/915459
Subject: [PATCH] Bug multi-threaded CRAM decode on some systems.
The bulk_cram_to_bam function allocated a large array for the BAM
objects, but did not ensure the bam structures are aligned on a word
boundary. This gave rise to bus errors. Fixes debian Bug#915459
---
io_lib/bam.h | 3 ++-
io_lib/cram_decode.c | 9 +++++----
2 files changed, 7 insertions(+), 5 deletions(-)
--- a/io_lib/bam.h
+++ b/io_lib/bam.h
@@ -271,8 +271,9 @@ static inline void bam_set_bin(bam_seq_t
#define bam_qual(b) (bam_seq(b) + (int)(((b)->len+1)/2))
#define bam_aux(b) (bam_qual(b) + (b)->len)
-/* Rounds up to the next multiple of 4 */
+/* Rounds up to the next multiple of 4 or 8 */
#define round4(v) (((v-1)&~3)+4)
+#define round8(v) (((v-1)&~7)+8)
/* CIGAR operations, taken from samtools bam.h */
#define BAM_CIGAR_SHIFT 4
--- a/io_lib/cram_decode.c
+++ b/io_lib/cram_decode.c
@@ -2297,14 +2297,15 @@ static int bulk_cram_to_bam(SAM_hdr *bfd
int sz = bam_size(bfd, fd, &s->crecs[i]);
if (i < 10000)
sizes[i] = sz;
- len += sz;
+ len += round8(sz);
}
- s->bl = (bam_seq_t **)malloc(s->hdr->num_records * sizeof(*s->bl) + len);
+ s->bl = (bam_seq_t **)malloc(s->hdr->num_records * sizeof(*s->bl) + len + 8);
if (!s->bl)
return -1;
- char *x = ((char *)s->bl) + s->hdr->num_records * sizeof(*s->bl);
+ // Round up to next multiple of 8, to ensure bam structs are 8-byte aligned.
+ char *x = ((char *)s->bl) + round8(s->hdr->num_records * sizeof(*s->bl));
for (i = 0; i < s->hdr->num_records; i++) {
bam_seq_t *b = (bam_seq_t *)x, *o = b;
int bsize = i < 10000 ? sizes[i] : bam_size(bfd, fd, &s->crecs[i]);
@@ -2312,7 +2313,7 @@ static int bulk_cram_to_bam(SAM_hdr *bfd
r |= (cram_to_bam(fd->header, fd, s, &s->crecs[i], i, &b) < 0);
// if we allocated enough, the above won't have resized b
assert(o == b && o->alloc == bsize);
- x += bsize;
+ x += round8(bsize);
s->bl[i] = b;
}
From: James Bonfield <jkb@sanger.ac.uk>
Date: Wed, 5 Dec 2018 14:51:09 +0000
Origin: https://github.com/jkbonfield/io_lib/commit/d4591b5.patch
Bug-Debian: https://bugs.debian.org/915450
Subject: [PATCH] Big endian fix for BAM reading.
Fixes Debian Bug#915450
---
io_lib/bam.c | 52 +++++++++++++++++++++++++++-------------------------
1 file changed, 27 insertions(+), 25 deletions(-)
diff --git a/io_lib/bam.c b/io_lib/bam.c
index 55d0919..b259b50 100644
--- a/io_lib/bam.c
+++ b/io_lib/bam.c
@@ -716,7 +716,7 @@ void *bgzf_decode_thread(void *arg) {
uint32_t crc1=libdeflate_crc32(0L, (unsigned char *)j->uncomp, j->uncomp_sz);
uint32_t crc2;
memcpy(&crc2, j->comp + j->comp_sz, 4);
- crc2 = le_int2(crc2);
+ crc2 = le_int4(crc2);
if (crc1 != crc2) {
fprintf(stderr, "Invalid CRC in Deflate stream: %08x vs %08x\n",
crc1, crc2);
@@ -754,7 +754,7 @@ void *bgzf_decode_thread(void *arg) {
uint32_t crc1=iolib_crc32(0L, (unsigned char *)j->uncomp, s.total_out);
uint32_t crc2;
memcpy(&crc2, j->comp + j->comp_sz, 4);
- crc2 = le_int2(crc2);
+ crc2 = le_int4(crc2);
if (crc1 != crc2) {
fprintf(stderr, "Invalid CRC in Deflate stream: %08x vs %08x\n",
crc1, crc2);
@@ -1055,7 +1055,7 @@ static int bam_uncompress_input(bam_file_t *b) {
b->uncomp_sz);
uint32_t crc2;
memcpy(&crc2, b->comp_p-8, 4);
- crc2 = le_int2(crc2);
+ crc2 = le_int4(crc2);
if (crc1 != crc2) {
fprintf(stderr, "Invalid CRC in Deflate stream: "
"%08x vs %08x\n", crc1, crc2);
@@ -1656,7 +1656,8 @@ static int sam_next_seq(bam_file_t *b, bam_seq_t **bsp) {
int bam_get_seq(bam_file_t *b, bam_seq_t **bsp) {
int32_t blk_size, blk_ret;
bam_seq_t *bs;
- uint32_t i32;
+ uint32_t u32;
+ int32_t i32;
b->line++;
@@ -1701,22 +1702,22 @@ int bam_get_seq(bam_file_t *b, bam_seq_t **bsp) {
bs->blk_size = blk_size;
bs->ref = le_int4(bs->ref);
- bs->pos = le_int4(bs->pos_32);
+ i32 = le_int4(bs->pos_32); bs->pos = i32;
// order of bit-fields in struct is platform specific, so manually decode
- i32 = le_int4(bs->bin_packed);
- bs->bin = i32 >> 16;
- bs->map_qual = (i32 >> 8) & 0xff;
- bs->name_len = i32 & 0xff;
+ u32 = le_int4(bs->bin_packed);
+ bs->bin = u32 >> 16;
+ bs->map_qual = (u32 >> 8) & 0xff;
+ bs->name_len = u32 & 0xff;
- i32 = le_int4(bs->flag_packed);
- bs->flag = i32 >> 16;
- bs->cigar_len = i32 & 0xffff;
+ u32 = le_int4(bs->flag_packed);
+ bs->flag = u32 >> 16;
+ bs->cigar_len = u32 & 0xffff;
bs->len = le_int4(bs->len);
bs->mate_ref = le_int4(bs->mate_ref);
- bs->mate_pos = le_int4(bs->mate_pos_32);
- bs->ins_size = le_int4(bs->ins_size_32);
+ i32 = le_int4(bs->mate_pos_32); bs->mate_pos = i32;
+ i32 = le_int4(bs->ins_size_32); bs->ins_size = i32;
if (10 == be_int4(10)) {
int i, cigar_len = bam_cigar_len(bs);
@@ -1734,7 +1735,8 @@ int bam_get_seq(bam_file_t *b, bam_seq_t **bsp) {
int bam_get_seq(bam_file_t *b, bam_seq_t **bsp) {
int32_t blk_size, blk_ret;
bam_seq_t *bs;
- uint32_t i32;
+ uint32_t u32;
+ int32_t i32;
b->line++;
@@ -1769,22 +1771,22 @@ int bam_get_seq(bam_file_t *b, bam_seq_t **bsp) {
bs->blk_size = blk_size;
bs->ref = le_int4(bs->ref);
- bs->pos = le_int4(bs->pos_32);
+ i32 = le_int4(bs->pos_32); bs->pos = i32;
// order of bit-fields in struct is platform specific, so manually decode
- i32 = le_int4(bs->bin_packed);
- bs->bin = i32 >> 16;
- bs->map_qual = (i32 >> 8) & 0xff;
- bs->name_len = i32 & 0xff;
+ u32 = le_int4(bs->bin_packed);
+ bs->bin = u32 >> 16;
+ bs->map_qual = (u32 >> 8) & 0xff;
+ bs->name_len = u32 & 0xff;
- i32 = le_int4(bs->flag_packed);
- bs->flag = i32 >> 16;
- bs->cigar_len = i32 & 0xffff;
+ u32 = le_int4(bs->flag_packed);
+ bs->flag = u32 >> 16;
+ bs->cigar_len = u32 & 0xffff;
bs->len = le_int4(bs->len);
bs->mate_ref = le_int4(bs->mate_ref);
- bs->mate_pos = le_int4(bs->mate_pos_32);
- bs->ins_size = le_int4(bs->ins_size_32);
+ i32 = le_int4(bs->mate_pos_32); bs->mate_pos = i32;
+ i32 = le_int4(bs->ins_size_32); bs->ins_size = i32;
/* Name */
if (bam_read(b, &bs->data, bam_name_len(bs)) != bam_name_len(bs))
......@@ -2,3 +2,7 @@ pathmax.patch
fix_fseeko.patch
fix_non_x86.patch
remove_bashism.patch
d4591b5.patch
37b33d3.patch
1b28b6a.patch
242cd6b.patch
......@@ -35,6 +35,11 @@ override_dh_install-arch:
# --version-string="$(version)" \
# $(CURDIR)/debian/$(utils)/usr/bin/srf_filter > $(mandir)/srf_filter.1
override_dh_install-indep:
ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
echo "Do not run test suite for architecture independent builds"
endif
override_dh_install-indep:
dh_install -i
mkdir -p $(testdir)
......