From 6d469bd7112038529e50f69bdc69923247a1936c Mon Sep 17 00:00:00 2001 From: Eric Coissac Date: Tue, 14 Apr 2026 14:48:41 +0200 Subject: [PATCH] [obiseq] Add length validation for qualities in SetQualities, Take Qualites and Subsequence [obiseq] Add length validation for qualities in SetQualities, Take Qualites and Subsequence - Panic if sequence/qualities length mismatch when setting or taking qualities in BioSequence. - Add same check before slicing Qualities() for Subsequence to ensure consistency. --- pkg/obiseq/biosequence.go | 6 ++++++ pkg/obiseq/subseq.go | 22 ++++++++++++++++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/pkg/obiseq/biosequence.go b/pkg/obiseq/biosequence.go index b136bb2..f0b114e 100644 --- a/pkg/obiseq/biosequence.go +++ b/pkg/obiseq/biosequence.go @@ -499,6 +499,9 @@ func (s *BioSequence) SetQualities(qualities Quality) { if s.qualities != nil { RecycleSlice(&s.qualities) } + if len(qualities) > 0 && len(qualities) != len(s.sequence) { + log.Panicf("[BioSequence.SetQualities] Sequence %s has a length of %d and qualities a length of %d", s.id, len(s.sequence), len(qualities)) + } s.qualities = CopySlice(qualities) } @@ -508,6 +511,9 @@ func (s *BioSequence) TakeQualities(qualities Quality) { if s.qualities != nil { RecycleSlice(&s.qualities) } + if len(qualities) > 0 && len(qualities) != len(s.sequence) { + log.Panicf("[BioSequence.TakeQualities] Sequence %s has a length of %d and qualities a length of %d", s.id, len(s.sequence), len(qualities)) + } s.qualities = qualities } diff --git a/pkg/obiseq/subseq.go b/pkg/obiseq/subseq.go index 7d714f1..5ea9153 100644 --- a/pkg/obiseq/subseq.go +++ b/pkg/obiseq/subseq.go @@ -48,7 +48,16 @@ func (sequence *BioSequence) Subsequence(from, to int, circular bool) (*BioSeque newSeq.sequence = CopySlice(sequence.Sequence()[from:to]) if sequence.HasQualities() { - newSeq.qualities = CopySlice(sequence.Qualities()[from:to]) + qual := sequence.Qualities() + if len(qual) != sequence.Len() { + log.Panicf( + "[BioSequence.Subsequence] Sequence %s has a length of %d and qualities a length of %d", + sequence.Id(), + sequence.Len(), + len(qual), + ) + } + newSeq.qualities = CopySlice(qual[from:to]) } newSeq.id = fmt.Sprintf("%s_sub[%d..%d]", sequence.Id(), from+1, to) @@ -58,7 +67,16 @@ func (sequence *BioSequence) Subsequence(from, to int, circular bool) (*BioSeque newSeq.Write(sequence.Sequence()[0:to]) if sequence.HasQualities() { - newSeq.WriteQualities(sequence.Qualities()[0:to]) + qual := sequence.Qualities() + if len(qual) != sequence.Len() { + log.Panicf( + "[BioSequence.Subsequence] Sequence %s has a length of %d and qualities a length of %d", + sequence.Id(), + sequence.Len(), + len(qual), + ) + } + newSeq.WriteQualities(qual[0:to]) } }