summaryrefslogtreecommitdiffstats
path: root/core/dive.c
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2021-07-18 12:51:47 +0200
committerGravatar Dirk Hohndel <dirk@hohndel.org>2021-07-19 10:13:51 -0700
commit82f967ddb37022a69be2de3f38ac445093c0d6df (patch)
tree5f0364680db0f2902b34169600668929ebdab630 /core/dive.c
parent361678dcbea78d5d4155439eb90936e3f0f36114 (diff)
downloadsubsurface-82f967ddb37022a69be2de3f38ac445093c0d6df.tar.gz
core: sanitize pressure-sensor cylinder ids in fixup_dive()
The code will happily perform out-of-bound accesses if pressure-sensors refer to non-existing cylinders. Therefore, sanitize these values in fixup_dive(), which is called everytime a dive is loaded or imported. Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
Diffstat (limited to 'core/dive.c')
-rw-r--r--core/dive.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/core/dive.c b/core/dive.c
index 36b1376fa..e96036611 100644
--- a/core/dive.c
+++ b/core/dive.c
@@ -1208,6 +1208,17 @@ static void fixup_no_o2sensors(struct divecomputer *dc)
}
}
+static void fixup_dc_sample_sensors(struct divecomputer *dc, int nr_cylinders)
+{
+ for (int i = 0; i < dc->samples; i++) {
+ struct sample *s = dc->sample + i;
+ for (int j = 0; j < MAX_SENSORS; j++) {
+ if (s->sensor[j] < 0 || s->sensor[j] >= nr_cylinders)
+ s->sensor[j] = NO_SENSOR;
+ }
+ }
+}
+
static void fixup_dive_dc(struct dive *dive, struct divecomputer *dc)
{
/* Fixup duration and mean depth */
@@ -1228,6 +1239,9 @@ static void fixup_dive_dc(struct dive *dive, struct divecomputer *dc)
/* Fix up cylinder pressures based on DC info */
fixup_dive_pressures(dive, dc);
+ /* Fix up cylinder ids in pressure sensors */
+ fixup_dc_sample_sensors(dc, dive->cylinders.nr);
+
fixup_dc_events(dc);
/* Fixup CCR / PSCR dives with o2sensor values, but without no_o2sensors */