diff --git a/crates/meta/src/gpx.rs b/crates/meta/src/gpx.rs index abfc9ebd4..204e39116 100644 --- a/crates/meta/src/gpx.rs +++ b/crates/meta/src/gpx.rs @@ -147,7 +147,7 @@ pub fn parse_gpx(s: &str) -> Result { match name.as_slice() { b"ele" if parent == Some(b"trkpt") => { if let Some(p) = pt.as_mut() { - p.ele = text.trim().parse().ok(); + p.ele = text.trim().parse().ok().filter(|v: &f64| v.is_finite()); } } b"time" if parent == Some(b"trkpt") => { @@ -351,6 +351,18 @@ mod tests { assert_eq!(log.points[1].time - log.points[0].time, 60.0); } + #[test] + fn non_finite_elevation_is_dropped() { + for ele in ["inf", "-inf", "NaN", "infinity"] { + let s = format!( + r#"{ele}"# + ); + let log = parse_gpx(&s).unwrap(); + assert_eq!(log.points.len(), 1, "{ele}"); + assert_eq!(log.points[0].elevation, None, "{ele}"); + } + } + #[test] fn interpolation_across_the_antimeridian() { let a = TrackPoint { time: 0.0, latitude: 0.0, longitude: 179.0, elevation: None, segment: 0 };