# HG changeset patch # User Chris Cannam # Date 1468504144 -3600 # Node ID 9884efa1f88aba11f6a14249e3f4d49aa9f88af0 # Parent 6d09ad2ab21ff712fadb9706cbb9036cd2a31819 Fix potential crash in Dense3dModelPeakCache owing to combination of wrong width calculation and wrong handling of width overrun diff -r 6d09ad2ab21f -r 9884efa1f88a data/model/Dense3DModelPeakCache.cpp --- a/data/model/Dense3DModelPeakCache.cpp Wed Jul 13 13:06:28 2016 +0100 +++ b/data/model/Dense3DModelPeakCache.cpp Thu Jul 14 14:49:04 2016 +0100 @@ -88,15 +88,29 @@ Profiler profiler("Dense3DModelPeakCache::fillColumn"); if (!in_range_for(m_coverage, column)) { - // see note in sourceModelChanged - if (m_coverage.size() > 0) m_coverage[m_coverage.size()-1] = false; + if (m_coverage.size() > 0) { + // The last peak may have come from an incomplete read, which + // may since have been filled, so reset it + m_coverage[m_coverage.size()-1] = false; + } m_coverage.resize(column + 1, false); } + int sourceWidth = m_source->getWidth(); + Column peak; int n = 0; for (int i = 0; i < m_columnsPerPeak; ++i) { - Column here = m_source->getColumn(column * m_columnsPerPeak + i); + + int sourceColumn = column * m_columnsPerPeak + i; + if (sourceColumn >= sourceWidth) break; + + Column here = m_source->getColumn(sourceColumn); + +// cerr << "Dense3DModelPeakCache::fillColumn(" << column << "): source col " +// << sourceColumn << " of " << sourceWidth +// << " returned " << here.size() << " elts" << endl; + if (i == 0) { peak = here; n = int(peak.size()); diff -r 6d09ad2ab21f -r 9884efa1f88a data/model/Dense3DModelPeakCache.h --- a/data/model/Dense3DModelPeakCache.h Wed Jul 13 13:06:28 2016 +0100 +++ b/data/model/Dense3DModelPeakCache.h Thu Jul 14 14:49:04 2016 +0100 @@ -53,7 +53,12 @@ } virtual int getWidth() const { - return m_source->getWidth() / m_columnsPerPeak + 1; + int sourceWidth = m_source->getWidth(); + if ((sourceWidth % m_columnsPerPeak) == 0) { + return sourceWidth / m_columnsPerPeak; + } else { + return sourceWidth / m_columnsPerPeak + 1; + } } virtual int getHeight() const {