diff options
author | Dirk Hohndel <dirk@hohndel.org> | 2020-02-07 16:26:40 -0800 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2020-02-08 10:26:21 -0800 |
commit | 988ccba7105442f34d85ed81e13fd69162eb2b87 (patch) | |
tree | 7d5eb0d9fba5244e586408bf637ab8625c9e0321 | |
parent | 92ea29ebcb4c8c7aa36dfc950042a232476ab10a (diff) | |
download | subsurface-988ccba7105442f34d85ed81e13fd69162eb2b87.tar.gz |
mobile: prevent crash adding dives
When the cylinders became a dynamic data structure, a get_cylinder() call
suddenly could return a NULL pointer. So use get_or_create_cylinder() for the
first call when parsing the user's data.
Also, deal with an oddity where the string lists look different because an
empty list technically isn't the same as a list with one empty string.
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
-rw-r--r-- | CHANGELOG.md | 1 | ||||
-rw-r--r-- | mobile-widgets/qmlmanager.cpp | 13 |
2 files changed, 10 insertions, 4 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 1880c2515..baac1bb91 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,4 @@ +Mobile: fix potential crash when adding / editing dives Mobile: automatically scroll the dive edit screen so that the notes edit cursor stays visible Desktop: ignore dive sites without location in proximity search Mobile: add personalized option for units diff --git a/mobile-widgets/qmlmanager.cpp b/mobile-widgets/qmlmanager.cpp index 456d9c603..755aa2112 100644 --- a/mobile-widgets/qmlmanager.cpp +++ b/mobile-widgets/qmlmanager.cpp @@ -1122,14 +1122,19 @@ void QMLManager::commitChanges(QString diveId, QString number, QString date, QSt d->weightsystems.weightsystems[0].weight.grams = parseWeightToGrams(weight); } } - // start and end pressures for first cylinder only + // start and end pressures + // first, normalize the lists - QML gives us a list with just one empty string if nothing was entered + if (startpressure == QStringList(QString())) + startpressure = QStringList(); + if (endpressure == QStringList(QString())) + endpressure = QStringList(); if (myDive.startPressure != startpressure || myDive.endPressure != endpressure) { diveChanged = true; for ( int i = 0, j = 0 ; j < startpressure.length() && j < endpressure.length() ; i++ ) { if (state != "add" && !is_cylinder_used(d, i)) continue; - get_cylinder(d, i)->start.mbar = parsePressureToMbar(startpressure[j]); + get_or_create_cylinder(d, i)->start.mbar = parsePressureToMbar(startpressure[j]); get_cylinder(d, i)->end.mbar = parsePressureToMbar(endpressure[j]); if (get_cylinder(d, i)->end.mbar > get_cylinder(d, i)->start.mbar) get_cylinder(d, i)->end.mbar = get_cylinder(d, i)->start.mbar; @@ -1150,7 +1155,7 @@ void QMLManager::commitChanges(QString diveId, QString number, QString date, QSt he >= 0 && he <= 1000 && o2 + he <= 1000) { diveChanged = true; - get_cylinder(d, i)->gasmix.o2.permille = o2; + get_or_create_cylinder(d, i)->gasmix.o2.permille = o2; get_cylinder(d, i)->gasmix.he.permille = he; } j++; @@ -1177,7 +1182,7 @@ void QMLManager::commitChanges(QString diveId, QString number, QString date, QSt break; } } - get_cylinder(d, j)->type.description = copy_qstring(usedCylinder[k]); + get_or_create_cylinder(d, j)->type.description = copy_qstring(usedCylinder[k]); get_cylinder(d, j)->type.size.mliter = size; get_cylinder(d, j)->type.workingpressure.mbar = wp; k++; |