Commit graph

9839 commits

Author SHA1 Message Date
Dirk Hohndel
69036a1bb7 Avoid resource leak by bailing early
While in the current use this won't happen, if someone were to call
split_dive_at with a dive that's not in the dive_table, let's bail right
away before doing any work.

Coverity CID 1325517 1325518

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-03 09:44:16 -04:00
Dirk Hohndel
b2fcc7c813 Don't keep all the split dives invisibly selected
While the visual state didn't show it, our internal tracking of the
selected state was copied causing all kinds of unexpected behavior. With
this commit we get this right.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-03 07:25:52 -04:00
Dirk Hohndel
f8e9c975b7 Use copy_string() to avoid potential crash
If the trip has no location or notes calling strdup on NULL is just a bad
idea.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-03 07:19:55 -04:00
Dirk Hohndel
c30dfba433 Don't delete the trip when splitting the only dive in a trip
When splitting dives make sure the new dives first are part of the same
trip the original dive was in.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-03 07:17:29 -04:00
Linus Torvalds
e964f533ff Fix 32-bit overflow in Divesoft Freedom time handling
Commit 31fb2e4c62 ("Avoid possible sign extension") handled the
problem when a "unsigned char" is shifted 24 bits left, and becomes a
"signed int".  By casting the result to uint32_t, that signed case won't
happen.

However, there were two bugs in that fix.

The first is the comment.  It's not that "timestamp_t" is signed that is
the problem.  No, the problem is inherent in the C expression

    (ptr[11] << 24)

where "ptr[11]" is an unsigned char.  In C arithmetic, unsigned char is
implicitly type-expanded to "int", so while it has a value between
0..255, when you shift it left by 24, you can get a *negative* "int" as
a result.

So it's actually "ptr[11]" that should have been cast to "unsigned", but
it so happens that you can do all the shifting and adding in "int", and
then cast the end result to "uint32_t" and you'll get the same value.
But at no point did "timestamp_t" matter.

The other bug was pre-existing and just not fixed.  When the code does
the "+ 946684800" (to turn the timestamp to be seconds from the start of
2000, into seconds since the "unix epoch", ie 1970) that arithmetic is
now done in that "uint32_t" (and used to be done in "int").

Which means that the addition can overflow in 32 bits *before* it is
cast to timestamp_t (which is 64 bits).

Admittedly that 32-bit overflow happens a bit later than the sign bit
gets set, but if we're worried aboout overflows, let's just do this
right.

In other words, we have a 32-bit unsigned offset since Jan 1, 2000, and
for the full range we need to do the epoch correction in 32 bits.
Because otherwise you fail in the year 2106 (32-bit unsigned unix epoch
time limit), even though the 32-bit seconds *should* work all the way
until the year 2136.

Of course, I'll be rather surprised if people still use the Divesoft
Freedom in the year 2106.  Or rather, I won't be surprised, because I'll
be dead.

But if we think that the signed problem matters (in the year 2068), then
dammit, we can extend it another 30 years.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-03 00:05:40 -04:00
Dirk Hohndel
7cfd124f67 Avoid negative array index
This case should be impossible to hit - but this seems better than
assuming this can never happen.

Coverity CID 1325458

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-02 21:25:17 -04:00
Dirk Hohndel
ae854ff822 Remove pointless assignment
In every code path stopping is overwritten before it is ever accessed.

Coverity CID 1325278

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-02 17:41:02 -04:00
Dirk Hohndel
d9bbb97bd0 Avoid working with invalid dive indices
When calling merge_two_dives both dives should be in the dive list so i
and j should never be -1. But just as extra precaution, bail if that's the
case (so that the helper functions below aren't called with negative
indices).

Coverity CID 1189514

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-02 17:36:23 -04:00
Dirk Hohndel
6b9aea1b96 Remove unused member
This isn't the bug that Coverity showed, but it was found by looking at
CID 1307969

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-02 17:30:21 -04:00
Dirk Hohndel
31fb2e4c62 Avoid possible sign extension
Interesting theoretical bug (it'll be a while before we run into this
one).

Coverity CID 1307979

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-02 15:48:50 -04:00
Dirk Hohndel
6b0d9adb61 Avoid potential uninitialized access
I don't think this could ever happen but hey, let's be sure.

Coverity CID 1307985

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-02 15:42:43 -04:00
Dirk Hohndel
f09a3c3304 Avoid potentially uninitialized member
This seems a false positive, reply is always set before it is used, but
there's no harm in setting it explicitly.

Coverity CID 1325280

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-02 15:25:03 -04:00
Dirk Hohndel
dde82a6ba4 Avoid potentially uninitialized member
Coverity CID 1325281

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-02 15:22:55 -04:00
Dirk Hohndel
a94c84d598 Undo/redo of dive deletion needs to handle trips as well
If we delete dives that were part of a trip, that trip may get deleted as
well. So if we undo that operation we need to bring back the trip, too.

This also deals with a bug in the original code that did the delete both
in calling code (in divelistview.cpp) and in the redo function. Because of
the nature of the delete this didn't really matter but it is of course
wrong and with the new code it would in fact cause an issue.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-02 14:50:12 -04:00
Linus Torvalds
7c427dcc02 Add support to "split" a dive with surface time in the middle
Right now this requires that

 (a) the dive have only one divecomputer associated with it.

     Trying to split a dive with multiple dive computers would be *much*
     harder to do, since you'd have to try to line up the surface
     interval between computers etc.  So just don't do it after
     downloading multiple dive computers for the same dive.

 (b) there must be at least one minute between the sample that came up
     to the surface and the sample that goes down again.

     If you just peeked your head above the surface, don't try to split
     things into two dives.  Maybe we can relax this for freediving or
     something.

also note that the split dive will only get new numbering if the dive
that was split was the very last dive in the divelist.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-01 22:29:43 -04:00
Linus Torvalds
b5b7bdda81 Make add_single_dive() grow the divelist allocation if necessary
We only made sure the divelist allocation was big enough in
"record_dive_to_table()", but add_single_dive() can add entries too.

Now, in practice that never bit anybody, since

 (a) we allocate extra entries anyway, and it would be very unusual that
     the divelist table was exactly full

 (b) most "malloc()" implementations end up having their own slop on top
     of that

 (c) add_single_dive() was only used for merging dives, which actually
     ends up removing more divex than it adds (but it does add one first)

but when I'm starting to split dives, this will be a bigger issue in
practice.  And it was wrong.

Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-01 22:28:04 -04:00
Dirk Hohndel
b80079c37f Avoid having uninitialized member
Coverity CID 1325283

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-01 22:02:53 -04:00
Dirk Hohndel
df51171352 Avoid possible NULL pointer dereference
This makes the code more robust in case the Uemis returns random or
non-sensical data. It's unlikely the user has a billion dives or that the
Uemis returns such a number. That's no reason not to handle this case
without crashing.

Coverity CID 1325289

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-01 22:02:01 -04:00
Dirk Hohndel
dd58402ef3 Avoid possible NULL dereference
I actually think this might be a false positive, but the libgit2 API
doesn't appear to guarantee that ancestor is not NULL, so let's add that
check.

Coverity CID 1325296

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-01 21:37:32 -04:00
Dirk Hohndel
a51903fbb6 Avoid NULL dereference
Coverity CID 1325297

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-01 21:24:04 -04:00
Dirk Hohndel
15a55b9648 Avoid resource leak
Coverity CID 1307997

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-01 21:12:31 -04:00
Dirk Hohndel
7d8a36820d Avoid memory leaks
Coverity CID 1308003

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-01 21:12:14 -04:00
Dirk Hohndel
12c83b744e Avoid possible uninitialized memory read
This looks like possibly a false positive in the Coverity scan, but we can
always assume that the first point of the dive plan has been entered by
the user.

Coverity CID 1325285

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-01 21:11:59 -04:00
Dirk Hohndel
5a6aaec490 Avoid possible uninitialized memory read
Coverity CID 1325286

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-01 21:11:43 -04:00
Dirk Hohndel
b41773734b Avoid resource leak
Coverity CID 1325288

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-01 21:11:23 -04:00
Tomaz Canabrava
6979ebfdae Make dive trip location edit work again.
:D

Signed-off-by: Tomaz Canabrava <tomaz.canabrava@intel.com>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-01 18:01:34 -04:00
Tomaz Canabrava
d25e456fcc Hide trip location when launching Subsurface
It was ugly to show trip and dive location when no dive
was selected.

Signed-off-by: Tomaz Canabrava <tomaz.canabrava@intel.com>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-01 18:01:22 -04:00
Tomaz Canabrava
3548d11195 Update the dive site location when editing
Simple.

Signed-off-by: Tomaz Canabrava <tomaz.canabrava@intel.com>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-01 18:01:15 -04:00
Tomaz Canabrava
db97f33e13 Add a new QLineEdit to set the dive trip location
This is different from a dive site, as it's not a dive site. It's just a
normal string, while a dive site has gps coordinates.

Signed-off-by: Tomaz Canabrava <tomaz.canabrava@intel.com>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-01 17:59:44 -04:00
Tomaz Canabrava
d032373caf Fix selecting invalid dive site
This patch fixes an invalid dive site selection when
you where typing the name of a dive site for your current
dive.

Signed-off-by: Tomaz Canabrava <tomaz.canabrava@intel.com>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-01 17:59:35 -04:00
Dirk Hohndel
f1558b86da Another small string update for translations
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-01 12:56:35 -04:00
Lubomir I. Ivanov
6614e38581 printoptions.cpp: add missing tr() calls
Signed-off-by: Lubomir I. Ivanov <neolit123@gmail.com>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-01 12:55:29 -04:00
Miika Turkia
261c11de28 Test case: fix Seabear test data to proper dive length
Signed-off-by: Miika Turkia <miika.turkia@gmail.com>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-01 07:56:21 -04:00
Miika Turkia
058575bbbc CSV import: use the delta value instead of 1 sec
Signed-off-by: Miika Turkia <miika.turkia@gmail.com>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-01 07:54:51 -04:00
Dirk Hohndel
efa4dc3c9a Don't zoom out the globe if the dive site has no GPS
This may or may not look intuitive, but it can cause problems with the
zoom seemingly stuck all out (because of the timeouts). So instead stay
where you are. If the current dive site has GPS then its flag will be
bigger and brighter - so there still is visual feedback. But there's less
crazy zooming around.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-01 07:52:13 -04:00
Dirk Hohndel
a52f8f8168 Latest strings
And the usual clutter of thousands of line location changes.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-10-01 07:38:26 -04:00
Tomaz Canabrava
cbf02ac7ab Fix multi-dive edit regarding Dive Sites
Now it correctly sets the same dive site instead of
creating a new one for each dive.

Signed-off-by: Tomaz Canabrava <tomaz.canabrava@intel.com>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-09-30 19:28:55 -04:00
Tomaz Canabrava
63a2307cfb Better way to handle the tooltip for dive sites
Signed-off-by: Tomaz Canabrava <tomaz.canabrava@intel.com>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-09-30 19:26:46 -04:00
Tomaz Canabrava
0847447cda Make 'Choose dive site' work as 'Rename'
But it will actually create a new dive site, not just rename the existing
one.

Signed-off-by: Tomaz Canabrava <tomaz.canabrava@intel.com>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-09-30 19:24:38 -04:00
Tomaz Canabrava
2794af4166 Remove unused code
Signed-off-by: Tomaz Canabrava <tomaz.canabrava@intel.com>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-09-30 19:24:27 -04:00
Dirk Hohndel
83b14629d8 Don't emit the filter end signal too soon
First make sure all the data in displayed dive is correctly recorded,
otherwise things could get overwritten when the filter is removed and we
redisplay the current dive.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-09-30 19:11:16 -04:00
Dirk Hohndel
ebc3b148db Don't merge manually added dives
If the user added a dive manually we have a hard time trusting the start
time and duration. We just shouldn't automatically merge them with
anything else.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-09-30 07:47:20 -04:00
Dirk Hohndel
aedbde1e86 Delete unused dive sites after edit
This way they don't continue to clutter the globe.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-09-29 20:58:57 -04:00
Dirk Hohndel
1b8ac21f6b Correctly handle updating the name of dive sites from GPS
If the user downloaded the GPS data from the Subsurface webservice before
naming a dive site, we run into a special case where entering a new name
for a dive location should just update the name of the automatically named
site which already has the correct GPS information.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-09-29 20:10:29 -04:00
Dirk Hohndel
b1a929260f Whitespace cleanup
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-09-29 19:57:53 -04:00
Anton Lundin
57e83240dd qtserialbluetooth: use QIODevice::Unbuffered io
This adds the QIODevice::Unbuffered flag to our rfcomm connections to
bypass the buffering layer in QIODevice.

This fixes so firmware upgrades work against the OSTC Sport.

Signed-off-by: Anton Lundin <glance@acc.umu.se>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-09-29 17:46:19 -04:00
Anton Lundin
65e9991501 qtserialbluetooth: Remove no-op calls
waitForReadyRead and waitForBytesWritten not overridden in
QBluetoothSocket and the default implementation in QIODevice are just
no-ops that always return false.

This removes those calls to lessen the confusion for anyone who looks at
the code.

Signed-off-by: Anton Lundin <glance@acc.umu.se>
Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-09-29 17:46:08 -04:00
Dirk Hohndel
edac07554c Make sure we don't create multiple dive sites with the same uuid
This shouldn't happen, but in case there is a logic error higher up in the
code somewhere, this will prevent it from happening, period.

If the code asks for a new dive site with a specific uuid, simply return
the existing dive site with that uuid.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-09-29 12:58:16 -04:00
Dirk Hohndel
7ad1485c39 Don't save unused, auto-create dive sites
Normally the auto-created sites that are used when downloading GPS data
from the webservice that aren't associated with a dive will immediately
discarded. But if such a site is used for a dive but then the user changes
their mind and uses another site for that dive (for example because they
had a previous dive at that spot and decided they liked that one better
after all), then the dive site can stick around as an orphan.

Having orphan dive site may make sense for named dive sites that for some
reason are no longer used but may be used again in the future, but having
an auto-named orphaned dive site in the data file seems silly. So let's
remove them.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-09-28 22:30:20 -04:00
Dirk Hohndel
55cc0ee9c1 Fix incorrect and confusing warning message
In verbose mode we wanted to tell the user if they had a reference to a
non-existant dive site that we removed for consistency. Except the
condition was wrong and the warning was printed for every VALID dive site
reference. Oops.

Signed-off-by: Dirk Hohndel <dirk@hohndel.org>
2015-09-28 21:41:32 -04:00