Commit e33a2c96 for libheif
commit e33a2c96752301df87b9262ea9d250f67f120428
Author: Dirk Farin <dirk.farin@gmail.com>
Date: Fri Dec 26 08:36:00 2025 +0100
prevent division by zero
diff --git a/libheif/sequences/track.cc b/libheif/sequences/track.cc
index d5a95ea3..b5cfdb6d 100644
--- a/libheif/sequences/track.cc
+++ b/libheif/sequences/track.cc
@@ -479,7 +479,10 @@ Error Track::load(const std::shared_ptr<Box_trak>& trak_box)
// --- initialize track tables
- init_sample_timing_table();
+ Error err = init_sample_timing_table();
+ if (err) {
+ return err;
+ }
return {};
}
@@ -963,7 +966,7 @@ void Track::add_reference_to_track(uint32_t referenceType, uint32_t to_track_id)
}
-void Track::init_sample_timing_table()
+Error Track::init_sample_timing_table()
{
m_num_samples = m_stsz->num_samples();
@@ -1008,6 +1011,16 @@ void Track::init_sample_timing_table()
m_elst->get_entry(0).segment_duration == m_mdhd->get_duration() &&
m_elst->is_repeat_mode()) {
m_presentation_timeline = media_timeline;
+
+ uint64_t duration_media_units = get_duration_in_media_units();
+ if (duration_media_units == 0) {
+ return {
+ heif_error_Invalid_input,
+ heif_suberror_Unspecified,
+ "Track duration is zero."
+ };
+ }
+
m_num_output_samples = m_heif_context->get_sequence_duration() / get_duration_in_media_units() * media_timeline.size();
}
else {
@@ -1019,6 +1032,8 @@ void Track::init_sample_timing_table()
m_presentation_timeline = media_timeline;
m_num_output_samples = media_timeline.size();
}
+
+ return {};
}
diff --git a/libheif/sequences/track.h b/libheif/sequences/track.h
index 250e12b8..84007017 100644
--- a/libheif/sequences/track.h
+++ b/libheif/sequences/track.h
@@ -221,7 +221,7 @@ protected:
uint32_t m_next_sample_to_be_output = 0;
bool m_decoder_is_flushed = false;
- void init_sample_timing_table();
+ Error init_sample_timing_table();
std::vector<std::shared_ptr<Chunk>> m_chunks;
std::vector<uint8_t> m_chunk_data;