From afd1232940f636e763b46263bf828c46ab3f0654 Mon Sep 17 00:00:00 2001 From: frazou Date: Sat, 22 Nov 2025 15:44:52 +0100 Subject: [PATCH] Fix null race-condition for heart rate sensor data The previous implementation was technically safe because the sensor never had null values. Now that it can, the calls to getHeartRate must be stored instead of repeated to avoid a race condition where the sensor data become null between the null-check and the second call --- .../opentracks/sensors/sensorData/SensorDataSet.java | 5 +++-- .../viewmodels/SensorStatisticsViewHolder.java | 12 +++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main/java/de/dennisguse/opentracks/sensors/sensorData/SensorDataSet.java b/src/main/java/de/dennisguse/opentracks/sensors/sensorData/SensorDataSet.java index 3cf3b8058..4ed3bed7c 100644 --- a/src/main/java/de/dennisguse/opentracks/sensors/sensorData/SensorDataSet.java +++ b/src/main/java/de/dennisguse/opentracks/sensors/sensorData/SensorDataSet.java @@ -161,8 +161,9 @@ public class SensorDataSet { trackPoint.setPosition(gps.getAggregatedValue(trackPointCreator.createNow())); } - if (getHeartRate() != null) { - trackPoint.setHeartRate(getHeartRate().first); + Pair heartRate = getHeartRate(); + if (heartRate != null) { + trackPoint.setHeartRate(heartRate.first); } if (getCadence() != null) { diff --git a/src/main/java/de/dennisguse/opentracks/viewmodels/SensorStatisticsViewHolder.java b/src/main/java/de/dennisguse/opentracks/viewmodels/SensorStatisticsViewHolder.java index 32e31ce9c..0c7f20c0f 100644 --- a/src/main/java/de/dennisguse/opentracks/viewmodels/SensorStatisticsViewHolder.java +++ b/src/main/java/de/dennisguse/opentracks/viewmodels/SensorStatisticsViewHolder.java @@ -6,6 +6,7 @@ import android.view.LayoutInflater; import java.time.Instant; import de.dennisguse.opentracks.R; +import de.dennisguse.opentracks.data.models.HeartRate; import de.dennisguse.opentracks.data.models.HeartRateZones; import de.dennisguse.opentracks.databinding.StatsSensorItemBinding; import de.dennisguse.opentracks.sensors.sensorData.SensorDataSet; @@ -36,9 +37,10 @@ public abstract class SensorStatisticsViewHolder extends StatisticViewHolder valueAndUnit; - if (sensorDataSet != null && sensorDataSet.getHeartRate() != null) { - valueAndUnit = StringUtils.getHeartRateParts(getContext(), sensorDataSet.getHeartRate().first); - sensorName = sensorDataSet.getHeartRate().second; + Pair heartRate; + if (sensorDataSet != null && (heartRate = sensorDataSet.getHeartRate()) != null) { + valueAndUnit = StringUtils.getHeartRateParts(getContext(), heartRate.first); + sensorName = heartRate.second; } else { valueAndUnit = StringUtils.getHeartRateParts(getContext(), null); } @@ -46,8 +48,8 @@ public abstract class SensorStatisticsViewHolder extends StatisticViewHolder