diff options
author | Dirk Hohndel <dirk@hohndel.org> | 2016-01-19 10:27:38 -0800 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2016-02-26 09:18:25 +0100 |
commit | a01e4fefb419ad0b4cfc64a7d1759a06f08f4a3b (patch) | |
tree | 2cae80324e74472bcf6941f60a02034eeb6c50fa | |
parent | b2eee9db6b318124a04ccf1f51cd65f3270db71e (diff) | |
download | subsurface-a01e4fefb419ad0b4cfc64a7d1759a06f08f4a3b.tar.gz |
Don't blindly copy a pointer to the heap
Copying the entry pointer and assuming that it stays valid is of course totally
bogus. This is most likely the reason for the random crashes people have
observed.
See #992
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r-- | qt-models/diveplotdatamodel.cpp | 7 |
1 files changed, 6 insertions, 1 deletions
diff --git a/qt-models/diveplotdatamodel.cpp b/qt-models/diveplotdatamodel.cpp index f219947ac..10c5ce3ee 100644 --- a/qt-models/diveplotdatamodel.cpp +++ b/qt-models/diveplotdatamodel.cpp @@ -19,7 +19,7 @@ int DivePlotDataModel::columnCount(const QModelIndex &parent) const QVariant DivePlotDataModel::data(const QModelIndex &index, int role) const { - if ((!index.isValid()) || (index.row() >= pInfo.nr)) + if ((!index.isValid()) || (index.row() >= pInfo.nr) || pInfo.entry == 0) return QVariant(); plot_data item = pInfo.entry[index.row()]; @@ -167,6 +167,8 @@ void DivePlotDataModel::clear() if (rowCount() != 0) { beginRemoveRows(QModelIndex(), 0, rowCount() - 1); pInfo.nr = 0; + free(pInfo.entry); + pInfo.entry = 0; diveId = -1; dcNr = -1; endRemoveRows(); @@ -179,7 +181,10 @@ void DivePlotDataModel::setDive(dive *d, const plot_info &info) Q_ASSERT(d != NULL); diveId = d->id; dcNr = dc_number; + free(pInfo.entry); pInfo = info; + pInfo.entry = (struct plot_data *)malloc(sizeof(struct plot_data) * pInfo.nr); + memcpy(pInfo.entry, info.entry, sizeof(plot_data) * pInfo.nr); beginInsertRows(QModelIndex(), 0, pInfo.nr - 1); endInsertRows(); } |