[PATCH] Properly initialize device_data_t when downloading

Linus Torvalds torvalds at linux-foundation.org
Sat Jun 15 17:56:58 PDT 2013

From: Linus Torvalds <torvalds at linux-foundation.org>
Date: Sat, 15 Jun 2013 14:48:31 -1000
Subject: [PATCH] Properly initialize device_data_t when downloading

The old gtk branch started out with device_data_t explicitly cleared,
but the Qt version never did that.  And we actually depend on the
deviceid in particular being initialized to zero (and then we fill in
the details in the divecomputer download callbacks)

Not properly initializing it meant that we ended up with random
deviceid's that got added to the divecomputer device lists, and then
saved to the XML file without actually matching the data in the dive
computers in the actual *dives*.

Signed-off-by: Linus Torvalds <torvalds at linux-foundation.org>

This was way more subtle than I'd like. The new device_data_t 
initialization is messy. We should zero it all. 

The gtk branch initializes the whole structure when it declares it:

        device_data_t devicedata = {
                .devname = NULL,

but the Qt branch uses this implicit "data" field that is never 
initialized, because it's part of "this". I think that's bad form, never 
mind whether it might be "normal" for C++ people to do things like that.

This is the minimal "at least initialize the two deviceid/diveid fields". 
I think we'd be better off clearing it all with a proper initializer, but 
I'm not going to fight the C++ model.

 qt-ui/downloadfromdivecomputer.cpp | 1 +
 1 file changed, 1 insertion(+)

diff --git a/qt-ui/downloadfromdivecomputer.cpp b/qt-ui/downloadfromdivecomputer.cpp
index b0bdea7399d5..37ca2775bca0 100644
--- a/qt-ui/downloadfromdivecomputer.cpp
+++ b/qt-ui/downloadfromdivecomputer.cpp
@@ -157,6 +157,7 @@ void DownloadFromDCWidget::on_ok_clicked()
 	data.product = strdup(ui->product->currentText().toUtf8().data());
 	data.descriptor = descriptorLookup[ui->vendor->currentText() + ui->product->currentText()];
 	data.force_download = ui->forceDownload->isChecked();
+	data.deviceid = data.diveid = 0;
 	set_default_dive_computer(data.vendor, data.product);

More information about the subsurface mailing list