diff options
author | Berthold Stoeger <bstoeger@mail.tuwien.ac.at> | 2019-08-10 17:28:24 +0200 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2019-08-10 09:55:11 -0700 |
commit | f18ea2e3b62f43358ea3f7f5b5ba74a351f7b088 (patch) | |
tree | 1989e3874a06ad9c480ca19d7708e8aba44704ac | |
parent | 309a8c5b14a717cdc35ecb03aae2a57e59c0f922 (diff) | |
download | subsurface-f18ea2e3b62f43358ea3f7f5b5ba74a351f7b088.tar.gz |
Location model: treat invalid indexes gracefully
There have been crash reports in DiveSiteSortedModel::allSiteNames().
The only conceivable reason that this crashes is that the core knows
about more sites than the model and therefore on mapToSource() we
get an invalid index, which is translated to -1. Accessing the name
of that dive site will crash.
Handle such invalid indexes gracefully.
Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
-rw-r--r-- | qt-models/divelocationmodel.cpp | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/qt-models/divelocationmodel.cpp b/qt-models/divelocationmodel.cpp index 3c03c27de..224dc1bea 100644 --- a/qt-models/divelocationmodel.cpp +++ b/qt-models/divelocationmodel.cpp @@ -227,6 +227,13 @@ QStringList DiveSiteSortedModel::allSiteNames() const int num = rowCount(); for (int i = 0; i < num; i++) { int idx = mapToSource(index(i, 0)).row(); + // This shouldn't happen, but if model and core get out of sync, + // (more precisely: the core has more sites than the model is aware of), + // we might get an invalid index. + if (idx < 0 || idx > dive_site_table.nr) { + fprintf(stderr, "DiveSiteSortedModel::allSiteNames(): invalid index"); + continue; + } locationNames << QString(dive_site_table.dive_sites[idx]->name); } return locationNames; |