From: "Lubomir I. Ivanov" <neolit...@gmail.com> MAX_TANK_INFO is a new macro in dive.h to define the maximum number of tank_info_t objects.
TankInfoModel's data() and setData() now check for valid row indexes before accessing the tank_info[] array directly. Without this patch TankInfoMode::data() can cause a SIGSEGV. Reported-by: Pedro Neves <nevesdi...@gmail.com> Signed-off-by: Lubomir I. Ivanov <neolit...@gmail.com> --- sesm to only happen for Perdo's log (45MB). i don't know the underlying cause - i.e. why QModelIndex returns a value of >99. maybe Tomaz can find the underlying bug? --- core/dive.h | 3 ++- qt-models/tankinfomodel.cpp | 6 +++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/core/dive.h b/core/dive.h index c65d3ff..2565b4a 100644 --- a/core/dive.h +++ b/core/dive.h @@ -296,6 +296,7 @@ struct divecomputer { #define MAX_CYLINDERS (20) #define MAX_WEIGHTSYSTEMS (6) +#define MAX_TANK_INFO (100) #define W_IDX_PRIMARY 0 #define W_IDX_SECONDARY 1 @@ -923,7 +924,7 @@ struct tank_info_t { const char *name; int cuft, ml, psi, bar; }; -extern struct tank_info_t tank_info[100]; +extern struct tank_info_t tank_info[MAX_TANK_INFO]; struct ws_info_t { const char *name; diff --git a/qt-models/tankinfomodel.cpp b/qt-models/tankinfomodel.cpp index 75303d8..97f0e80 100644 --- a/qt-models/tankinfomodel.cpp +++ b/qt-models/tankinfomodel.cpp @@ -28,6 +28,10 @@ bool TankInfoModel::setData(const QModelIndex &index, const QVariant &value, int { //WARN Seems wrong, we need to check for role == Qt::EditRole Q_UNUSED(role); + + if (index.row() < 0 || index.row() > MAX_TANK_INFO - 1) + return false; + struct tank_info_t *info = &tank_info[index.row()]; switch (index.column()) { case DESCRIPTION: @@ -51,7 +55,7 @@ void TankInfoModel::clear() QVariant TankInfoModel::data(const QModelIndex &index, int role) const { QVariant ret; - if (!index.isValid()) { + if (!index.isValid() || index.row() < 0 || index.row() > MAX_TANK_INFO - 1) { return ret; } if (role == Qt::FontRole) { -- 1.7.11.msysgit.0 _______________________________________________ subsurface mailing list subsurface@subsurface-divelog.org http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface