From 8437cd4edde26eff4c48bc77e0ec15ca9b535dd8 Mon Sep 17 00:00:00 2001 From: Heng Li Date: Tue, 19 Mar 2013 01:04:57 -0400 Subject: [PATCH] r369: bugfix - segfault caused by the last change Sigh... Even the simplest change can lead to new bugs. --- bwamem.c | 51 ++++++++++++++++++++++++++------------------------- main.c | 2 +- 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/bwamem.c b/bwamem.c index 1af7f87..d19848d 100644 --- a/bwamem.c +++ b/bwamem.c @@ -759,37 +759,38 @@ int mem_approx_mapq_se(const mem_opt_t *opt, const mem_alnreg_t *a) void mem_reg2sam_se(const mem_opt_t *opt, const bntseq_t *bns, const uint8_t *pac, bseq1_t *s, mem_alnreg_v *a, int extra_flag, const mem_aln_t *m) { kstring_t str; + kvec_t(mem_aln_t) aa; + int k; + + kv_init(aa); str.l = str.m = 0; str.s = 0; - if (a->n > 0 && a->a[0].score >= opt->T) { - int k; - kvec_t(mem_aln_t) aa; - kv_init(aa); - for (k = 0; k < a->n; ++k) { - mem_alnreg_t *p = &a->a[k]; - mem_aln_t *q; - if (p->score < opt->T) continue; - if (p->secondary >= 0 && !(opt->flag&MEM_F_ALL)) continue; - if (p->secondary >= 0 && p->score < a->a[p->secondary].score * .5) continue; - q = kv_pushp(mem_aln_t, aa); - *q = mem_reg2aln(opt, bns, pac, s->l_seq, s->seq, p); - if (q->rid < 0) { // unfixable cross-reference alignment - --aa.n; - continue; - } - q->flag |= extra_flag | (p->secondary >= 0? 0x100 : 0); // flag secondary - if (p->secondary >= 0) q->sub = -1; // don't output sub-optimal score - if ((opt->flag&MEM_F_NO_MULTI) && k && p->secondary < 0) q->flag |= 0x10000; - if (k && q->mapq > aa.a[0].mapq) q->mapq = aa.a[0].mapq; + for (k = 0; k < a->n; ++k) { + mem_alnreg_t *p = &a->a[k]; + mem_aln_t *q; + if (p->score < opt->T) continue; + if (p->secondary >= 0 && !(opt->flag&MEM_F_ALL)) continue; + if (p->secondary >= 0 && p->score < a->a[p->secondary].score * .5) continue; + q = kv_pushp(mem_aln_t, aa); + *q = mem_reg2aln(opt, bns, pac, s->l_seq, s->seq, p); + if (q->rid < 0) { // unfixable cross-reference alignment + --aa.n; + continue; } - for (k = 0; k < aa.n; ++k) - mem_aln2sam(bns, &str, s, aa.n, aa.a, k, m); - for (k = 0; k < aa.n; ++k) free(aa.a[k].cigar); - free(aa.a); - } else { + q->flag |= extra_flag | (p->secondary >= 0? 0x100 : 0); // flag secondary + if (p->secondary >= 0) q->sub = -1; // don't output sub-optimal score + if ((opt->flag&MEM_F_NO_MULTI) && k && p->secondary < 0) q->flag |= 0x10000; + if (k && q->mapq > aa.a[0].mapq) q->mapq = aa.a[0].mapq; + } + if (aa.n == 0) { // no alignments good enough; then write an unaligned record mem_aln_t t; t = mem_reg2aln(opt, bns, pac, s->l_seq, s->seq, 0); t.flag |= extra_flag; mem_aln2sam(bns, &str, s, 1, &t, 0, m); + } else { + for (k = 0; k < aa.n; ++k) + mem_aln2sam(bns, &str, s, aa.n, aa.a, k, m); + for (k = 0; k < aa.n; ++k) free(aa.a[k].cigar); + free(aa.a); } s->sam = str.s; } diff --git a/main.c b/main.c index 0a79581..54c3093 100644 --- a/main.c +++ b/main.c @@ -3,7 +3,7 @@ #include "utils.h" #ifndef PACKAGE_VERSION -#define PACKAGE_VERSION "0.7.3-r368-beta" +#define PACKAGE_VERSION "0.7.3-r369-beta" #endif int bwa_fa2pac(int argc, char *argv[]);