]> git.donarmstrong.com Git - samtools.git/blobdiff - bam_md.c
fixed a bug in realignment
[samtools.git] / bam_md.c
index 63c25e961d704b0c555eaea115fe69f38275e17b..fb4673263044cd80831288a1b7a286ec62486d14 100644 (file)
--- a/bam_md.c
+++ b/bam_md.c
@@ -142,6 +142,7 @@ int bam_realn(bam1_t *b, const char *ref)
        cigar = ka_global_core(s_ref, l_ref, s_read, c->l_qseq, &par, &score, &n_cigar);
        if (score <= 0) { // realignment failed
                free(cigar); free(s_ref); free(s_read);
+               return -1;
        }
        // copy over the alignment
        if (4 * (n_cigar - (int)c->n_cigar) + b->data_len > b->m_data) { // enlarge b->data
@@ -149,8 +150,10 @@ int bam_realn(bam1_t *b, const char *ref)
                kroundup32(b->m_data);
                b->data = realloc(b->data, b->m_data);
        }
-       if (n_cigar != (int)c->n_cigar) // move data
-               memmove(b->data + c->l_qname + 4 * n_cigar, bam1_seq(b), b->data_len - c->l_qseq - 4 * c->n_cigar);
+       if (n_cigar != (int)c->n_cigar) { // move data
+               memmove(b->data + c->l_qname + 4 * n_cigar, bam1_seq(b), b->data_len - c->l_qname - 4 * c->n_cigar);
+               b->data_len += 4 * (n_cigar - (int)c->n_cigar);
+       }
        memcpy(bam1_cigar(b), cigar, n_cigar * 4);
        c->n_cigar = n_cigar;
        free(s_ref); free(s_read); free(cigar);