From 988ccba7105442f34d85ed81e13fd69162eb2b87 Mon Sep 17 00:00:00 2001 From: Dirk Hohndel Date: Fri, 7 Feb 2020 16:26:40 -0800 Subject: 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 --- mobile-widgets/qmlmanager.cpp | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'mobile-widgets/qmlmanager.cpp') 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++; -- cgit v1.2.3-70-g09d2