diff options
author | Berthold Stoeger <bstoeger@mail.tuwien.ac.at> | 2021-07-18 12:51:47 +0200 |
---|---|---|
committer | Dirk Hohndel <dirk@hohndel.org> | 2021-07-19 10:13:51 -0700 |
commit | 82f967ddb37022a69be2de3f38ac445093c0d6df (patch) | |
tree | 5f0364680db0f2902b34169600668929ebdab630 | |
parent | 361678dcbea78d5d4155439eb90936e3f0f36114 (diff) | |
download | subsurface-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>
-rw-r--r-- | core/dive.c | 14 |
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 */ |