From 9e6133a020fc2aea3a6dba11bb02709c7f52bc6b Mon Sep 17 00:00:00 2001 From: Andrew Coffey <49015102+oddbookworm@users.noreply.github.com> Date: Wed, 30 Aug 2023 13:34:07 -0500 Subject: [PATCH] Prevent segfault due to division by zero in music.get_pos (#2426) music.get_pos now returns -1 on failure --- docs/reST/ref/music.rst | 2 ++ src_c/music.c | 9 +++++---- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/docs/reST/ref/music.rst b/docs/reST/ref/music.rst index b400d8f639..aa1cfc6c6d 100644 --- a/docs/reST/ref/music.rst +++ b/docs/reST/ref/music.rst @@ -217,6 +217,8 @@ MP3 in most cases. The returned time only represents how long the music has been playing; it does not take into account any starting position offsets. + Returns -1 if ``get_pos`` failed due to music not playing. + .. ## pygame.mixer.music.get_pos ## .. function:: queue diff --git a/src_c/music.c b/src_c/music.c index e279aef20d..ede1dc3ded 100644 --- a/src_c/music.c +++ b/src_c/music.c @@ -252,12 +252,13 @@ music_get_pos(PyObject *self, PyObject *_null) MIXER_INIT_CHECK(); - if (music_pos_time < 0) + Uint16 intermediate_step = (music_format & 0xff) >> 3; + long denominator = music_channels * music_frequency * intermediate_step; + if (music_pos_time < 0 || denominator == 0) { return PyLong_FromLong(-1); + } - ticks = (long)(1000 * music_pos / - (music_channels * music_frequency * - ((music_format & 0xff) >> 3))); + ticks = (long)(1000 * music_pos / denominator); if (!Mix_PausedMusic()) ticks += PG_GetTicks() - music_pos_time;