summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Berthold Stoeger <bstoeger@mail.tuwien.ac.at>2020-11-01 14:40:57 +0100
committerGravatar Dirk Hohndel <dirk@hohndel.org>2020-11-01 10:59:39 -0800
commit386e08b69cf9257421d234237c90f29dbb32d4ee (patch)
treebc798afe66ed3d6ef33a6c102e19715b2a406e65
parentb2b3544f3f3c9dc3995a778722a5b2ca4cadd238 (diff)
downloadsubsurface-386e08b69cf9257421d234237c90f29dbb32d4ee.tar.gz
parser: don't crash when parsing <weight> tags
When encountering a <weight> tag, we would parse into the last weightsystem. However, we only create weightsystems when encountering <weightsystem> tag. Therefore, this code would either crash or overwrite the previous weightsystem. Instead, create a new weightsystem for each <weight> tag. Moreover, make sure that inside a <weightsystem> tag a weightsystem actually exists. This should be the case, but who knows...? Reported-by: Nihal Gabr <gabr.nihal@gmail.com> Signed-off-by: Berthold Stoeger <bstoeger@mail.tuwien.ac.at>
-rw-r--r--core/parse-xml.c19
1 files changed, 14 insertions, 5 deletions
diff --git a/core/parse-xml.c b/core/parse-xml.c
index 2c20ad56c..7b1a62ef9 100644
--- a/core/parse-xml.c
+++ b/core/parse-xml.c
@@ -1223,7 +1223,10 @@ static void try_to_fill_dive(struct dive *dive, const char *name, char *buf, str
{
char *hash = NULL;
cylinder_t *cyl = dive->cylinders.nr > 0 ? get_cylinder(dive, dive->cylinders.nr - 1) : NULL;
+ weightsystem_t *ws = dive->weightsystems.nr > 0 ?
+ &dive->weightsystems.weightsystems[dive->weightsystems.nr - 1] : NULL;
pressure_t p;
+ weight_t w;
start_match("dive", name, buf);
switch (state->import_source) {
@@ -1326,12 +1329,18 @@ static void try_to_fill_dive(struct dive *dive, const char *name, char *buf, str
return;
if (MATCH_STATE("airpressure.dive", pressure, &dive->surface_pressure))
return;
- if (MATCH("description.weightsystem", utf8_string, &dive->weightsystems.weightsystems[dive->weightsystems.nr - 1].description))
- return;
- if (MATCH_STATE("weight.weightsystem", weight, &dive->weightsystems.weightsystems[dive->weightsystems.nr - 1].weight))
- return;
- if (MATCH_STATE("weight", weight, &dive->weightsystems.weightsystems[dive->weightsystems.nr - 1].weight))
+ if (ws) {
+ if (MATCH("description.weightsystem", utf8_string, &ws->description))
+ return;
+ if (MATCH_STATE("weight.weightsystem", weight, &ws->weight))
+ return;
+ }
+ if (MATCH_STATE("weight", weight, &w)) {
+ weightsystem_t ws = empty_weightsystem;
+ ws.weight = w;
+ add_cloned_weightsystem(&dive->weightsystems, ws);
return;
+ }
if (cyl) {
if (MATCH("size.cylinder", cylindersize, &cyl->type.size))
return;