summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Dirk Hohndel <dirk@hohndel.org>2020-02-07 16:26:40 -0800
committerGravatar Dirk Hohndel <dirk@hohndel.org>2020-02-08 10:26:21 -0800
commit988ccba7105442f34d85ed81e13fd69162eb2b87 (patch)
tree7d5eb0d9fba5244e586408bf637ab8625c9e0321
parent92ea29ebcb4c8c7aa36dfc950042a232476ab10a (diff)
downloadsubsurface-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.md1
-rw-r--r--mobile-widgets/qmlmanager.cpp13
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++;