[Debian-med-packaging] Bug#1022282: staden-io-lib: FTBFS: ./data/9827_rand3.cram.fai: No such file or directory

Bernhard Übelacker bernhardu at mailbox.org
Thu Oct 27 15:21:53 BST 2022


Dear Maintainer,
the original staden-io-lib seems to be built with
libhtscodecs2 in version 1.2.2-1 [1].

The rebuild seems to be using libhtscodecs2 in version 1.3.0-4.

Unfortunately htscodecs upstream integrated this commit [3],
which renamed e.g. function encode_names to tok3_encode_names.
It added a compatibility function encode_names, but does not
declare it in the header file.
Therefore in the build of staden-io-lib the function encode_names
is implicitly declared - therefore seems to default to
a return type of int [4] - and therefore the returned pointer
gets truncated to the lower 4 bytes [5].
This get through unnoticed until the pointer is freed and
produces a segfault there [6].

I guess the right thing would be to have the short function name
in the header file of htscodecs, therefore solve this issue for
other packages using htscodecs.

A short term solution might be the patch in [7] which makes
the build and tests succeed without "implicit declarations".

Kind regards,
Bernhard



[1] https://buildd.debian.org/status/fetch.php?pkg=staden-io-lib&arch=amd64&ver=1.14.14%2Bdfsg-1%2Bb1&stamp=1663567926&raw=0
[2] https://tracker.debian.org/pkg/htscodecs
[3] https://github.com/jkbonfield/htscodecs/commit/6211b208d2bd21e93f3f62c0cd0d8c43546f98b5

[4]
     cram_io.c: In function ‘cram_compress_by_method’:
     cram_io.c:2420:23: warning: implicit declaration of function ‘encode_names’; did you mean ‘tok3_encode_names’? [-Wimplicit-function-declaration]
     2420 |         uint8_t *cp = encode_names(in, in_size, lev, strat, &out_len, NULL);
         |                       ^~~~~~~~~~~~
         |                       tok3_encode_names
     cram_io.c:2420:23: warning: initialization of ‘uint8_t *’ {aka ‘unsigned char *’} from ‘int’ makes pointer from integer without a cast [-Wint-conversion]


[5]
     (rr) bt
     #0  tok3_encode_names (blk=<optimized out>, len=<optimized out>, level=<optimized out>, use_arith=<optimized out>, out_len=<optimized out>, last_start_p=<optimized out>) at ./htscodecs/tokenise_name3.c:1540
     #1  0x00007f281aa34454 in cram_compress_by_method (s=s at entry=0x55e9af757e50, in=0x7f281000e930 "s0", in_size=9, out_size=out_size at entry=0x7f2819611730, method=method at entry=TOK3, level=<optimized out>, strat=0, content_id=<optimized out>) at ./io_lib/cram_io.c:2420
     #2  0x00007f281aa38ebe in cram_compress_block (fd=fd at entry=0x55e9af71f930, s=s at entry=0x55e9af757e50, b=0x55e9af758830, metrics=0x55e9af731f50, method=65794, level=level at entry=5) at ./io_lib/cram_io.c:2562
     #3  0x00007f281aa22d75 in cram_compress_slice (s=0x55e9af757e50, c=<optimized out>, fd=0x55e9af71f930) at ./io_lib/cram_encode.c:951
     #4  cram_encode_slice (fd=fd at entry=0x55e9af71f930, c=c at entry=0x55e9af73c270, h=h at entry=0x55e9af73c520, s=0x55e9af757e50) at ./io_lib/cram_encode.c:1219
     #5  0x00007f281aa27881 in cram_encode_container (fd=<optimized out>, c=<optimized out>) at ./io_lib/cram_encode.c:2119
     #6  0x00007f281aa33fb0 in cram_flush_thread (arg=0x55e9af4d0500) at ./io_lib/cram_io.c:4328
     #7  0x00007f281aa44272 in t_pool_worker (arg=0x55e9af737460) at ./io_lib/thread_pool.c:434
     #8  0x00007f281a68784a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:442
     #9  0x00007f281a70a530 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:100
     (rr) print out
     $6 = (uint8_t *) 0x7f2810010320 "\t"
     (rr) finish
     Run till exit from #0  tok3_encode_names (blk=<optimized out>, len=<optimized out>, level=<optimized out>, use_arith=<optimized out>, out_len=<optimized out>, last_start_p=<optimized out>) at ./htscodecs/tokenise_name3.c:1540
     0x00007f281aa34454 in cram_compress_by_method (s=s at entry=0x55e9af757e50, in=0x7f281000e930 "s0", in_size=9, out_size=out_size at entry=0x7f2819611730, method=method at entry=TOK3, level=<optimized out>, strat=0, content_id=<optimized out>) at ./io_lib/cram_io.c:2420
     2420            uint8_t *cp = encode_names(in, in_size, lev, strat, &out_len, NULL);
     Value returned is $8 = (uint8_t *) 0x7f2810010320 "\t"
     (rr) stepi
     2421            *out_size = out_len;
     (rr) print cp
     $7 = (uint8_t *) 0x10010320 <error: Cannot access memory at address 0x10010320>
     (rr) list
     2416            int out_len;
     2417            int lev = level;
     2418            if (method == NAME_TOK3 && lev > 3)
     2419                lev = 3;
     2420            uint8_t *cp = encode_names(in, in_size, lev, strat, &out_len, NULL);
     2421            *out_size = out_len;
     2422            return (char *)cp;
     2423        }
     2424
     2425        case RAW:


[6]
     Thread 2 received signal SIGSEGV, Segmentation fault.
     0x00007f281a69788a in __GI___libc_free (mem=0x10010320) at ./malloc/malloc.c:3363
     3363    ./malloc/malloc.c: Datei oder Verzeichnis nicht gefunden.
     (rr) bt
     #0  0x00007f281a69788a in __GI___libc_free (mem=0x10010320) at ./malloc/malloc.c:3363
     #1  0x00007f281aa39238 in cram_compress_block (fd=fd at entry=0x55e9af71f930, s=s at entry=0x55e9af757e50, b=0x55e9af758830, metrics=0x55e9af731f50, method=65794, level=level at entry=5) at ./io_lib/cram_io.c:2575
     #2  0x00007f281aa22d75 in cram_compress_slice (s=0x55e9af757e50, c=<optimized out>, fd=0x55e9af71f930) at ./io_lib/cram_encode.c:951
     #3  cram_encode_slice (fd=fd at entry=0x55e9af71f930, c=c at entry=0x55e9af73c270, h=h at entry=0x55e9af73c520, s=0x55e9af757e50) at ./io_lib/cram_encode.c:1219
     #4  0x00007f281aa27881 in cram_encode_container (fd=<optimized out>, c=<optimized out>) at ./io_lib/cram_encode.c:2119
     #5  0x00007f281aa33fb0 in cram_flush_thread (arg=0x55e9af4d0500) at ./io_lib/cram_io.c:4328
     #6  0x00007f281aa44272 in t_pool_worker (arg=0x55e9af737460) at ./io_lib/thread_pool.c:434
     #7  0x00007f281a68784a in start_thread (arg=<optimized out>) at ./nptl/pthread_create.c:442
     #8  0x00007f281a70a530 in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:100
     (rr) print mem
     $10 = (void *) 0x10010320
     (rr) up
     #1  0x00007f281aa39238 in cram_compress_block (fd=fd at entry=0x55e9af71f930, s=s at entry=0x55e9af757e50, b=0x55e9af758830, metrics=0x55e9af731f50, method=65794, level=level at entry=5) at ./io_lib/cram_io.c:2575
     2575                            free(c);
     (rr) list
     2570                            method_best = m;
     2571                            if (c_best)
     2572                                free(c_best);
     2573                            c_best = c;
     2574                        } else if (c) {
     2575                            free(c);
     2576                        } else {
     2577                            sz[m] = b->uncomp_size*2+1000; // arbitrarily worse than raw
     2578                        }
     2579


[7]
     --- staden-io-lib-1.14.14+dfsg.orig/io_lib/cram_codecs.c
     +++ staden-io-lib-1.14.14+dfsg/io_lib/cram_codecs.c
     @@ -1970,10 +1970,10 @@ static int cram_xrle_decode_expand_char(
         int nb = var_get_u64(len_dat, len_dat+len_sz, &out_sz);
         if (!(b->data = malloc(out_sz)))
             return -1;
     -    rle_decode(lit_dat, lit_sz,
     -              len_dat+nb, len_sz-nb,
     -              rle_syms, rle_nsyms,
     -              b->data, &out_sz);
     +    hts_rle_decode(lit_dat, lit_sz,
     +                   len_dat+nb, len_sz-nb,
     +                   rle_syms, rle_nsyms,
     +                   b->data, &out_sz);
         b->uncomp_size = out_sz;
     
         return 0;
     @@ -2139,10 +2139,10 @@ int cram_xrle_encode_flush(cram_codec *c
     
         int nb = var_put_u64(out_len, NULL, c->e_xrle.to_flush_size);
     
     -    out_lit = rle_encode((uint8_t *)c->e_xrle.to_flush, c->e_xrle.to_flush_size,
     -                        out_len+nb, &out_len_size,
     -                        rle_syms, &rle_nsyms,
     -                        NULL, &out_lit_size);
     +    out_lit = hts_rle_encode((uint8_t *)c->e_xrle.to_flush, c->e_xrle.to_flush_size,
     +                             out_len+nb, &out_len_size,
     +                             rle_syms, &rle_nsyms,
     +                             NULL, &out_lit_size);
         out_len_size += nb;
     
     
     --- staden-io-lib-1.14.14+dfsg.orig/io_lib/cram_io.c
     +++ staden-io-lib-1.14.14+dfsg/io_lib/cram_io.c
     @@ -2162,7 +2162,7 @@ int cram_uncompress_block(cram_block *b)
     
         case NAME_TOK3: {
             uint32_t out_len;
     -       uint8_t *cp = decode_names(b->data, b->comp_size, &out_len);
     +       uint8_t *cp = tok3_decode_names(b->data, b->comp_size, &out_len);
             b->orig_method = NAME_TOK3;
             b->method = RAW;
             free(b->data);
     @@ -2417,7 +2417,7 @@ static char *cram_compress_by_method(cra
             int lev = level;
             if (method == NAME_TOK3 && lev > 3)
                 lev = 3;
     -       uint8_t *cp = encode_names(in, in_size, lev, strat, &out_len, NULL);
     +       uint8_t *cp = tok3_encode_names(in, in_size, lev, strat, &out_len, NULL);
             *out_size = out_len;
             return (char *)cp;
         }



More information about the Debian-med-packaging mailing list