diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2012-08-18 09:02:27 -0700 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2012-08-18 09:02:27 -0700 |
commit | 1a05f34ae89d35f6ece12dba7b6ab5f60df98705 (patch) | |
tree | 803086825524c6b8d1beb7284a17a0cce825fb64 | |
parent | c26c370c2b519cbceaa231cc3c840c78ca92d2a7 (diff) | |
download | subsurface-1a05f34ae89d35f6ece12dba7b6ab5f60df98705.tar.gz |
Make fixup_divep robust against insane dive times
This fixes the case of the dive duration being zero, or being shorter
than the assumed ascent/descent time.
Reported-by: Lutz Vieweg <lvml@5t9.de>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
-rw-r--r-- | dive.c | 15 |
1 files changed, 11 insertions, 4 deletions
@@ -472,11 +472,18 @@ struct dive *fixup_dive(struct dive *dive) cyl->sample_end.mbar = 0; } } - if (end < 0) - { + if (end < 0) { /* Assume an ascent/descent rate of 9 m/min */ - int asc_desc_time = dive->maxdepth.mm*60/9000; - dive->meandepth.mm = dive->maxdepth.mm*(dive->duration.seconds-asc_desc_time)/dive->duration.seconds; + int depth = dive->maxdepth.mm; + int asc_desc_time = depth*60/9000; + int duration = dive->duration.seconds; + + /* Protect against insane dives - make mean be half of max */ + if (duration <= asc_desc_time) { + duration = 2; + asc_desc_time = 1; + } + dive->meandepth.mm = depth*(duration-asc_desc_time)/duration; return dive; } |