From e0b75b6e3debc095dc78da4014395b0206861b4b Mon Sep 17 00:00:00 2001 From: Thomas Harte Date: Sat, 9 Jun 2018 21:47:51 -0400 Subject: [PATCH] Corrects logic for avoiding overwrite. --- Storage/Disk/Track/PCMSegment.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Storage/Disk/Track/PCMSegment.cpp b/Storage/Disk/Track/PCMSegment.cpp index 2a4af08aa..c9473bb56 100644 --- a/Storage/Disk/Track/PCMSegment.cpp +++ b/Storage/Disk/Track/PCMSegment.cpp @@ -46,16 +46,18 @@ void PCMSegmentEventSource::reset() { PCMSegment &PCMSegment::operator +=(const PCMSegment &rhs) { if(!rhs.number_of_bits) return *this; + assert(((rhs.number_of_bits+7) >> 3) == rhs.data.size()); + if(number_of_bits&7) { auto target_number_of_bits = number_of_bits + rhs.number_of_bits; data.resize((target_number_of_bits + 7) >> 3); std::size_t first_byte = number_of_bits >> 3; - int shift = number_of_bits&7; + const int shift = number_of_bits&7; for(std::size_t source = 0; source < rhs.data.size(); ++source) { data[first_byte + source] |= rhs.data[source] >> shift; - if(source*8 + static_cast(shift) < rhs.number_of_bits) + if(source*8 + static_cast(8 - shift) < rhs.number_of_bits) data[first_byte + source + 1] = static_cast(rhs.data[source] << (8-shift)); } @@ -65,6 +67,8 @@ PCMSegment &PCMSegment::operator +=(const PCMSegment &rhs) { number_of_bits += rhs.number_of_bits; } + assert(((number_of_bits+7) >> 3) == data.size()); + return *this; }