moodbar: check QSlider max/min before using them in division
When switching playback from an item for which the moodbar is not displayed (e.g. an internet stream), to an item for which it is displayed (e.g. a local mp3 file), Clementine sometimes crashes. This happens because the slider_opt->maximum and slider_opt->minimum have the value 0 (their default value), and the difference is used as a divisor. This gives a division by 0, and a SIGFPE. This problem has been fixed in commitaf42cce
. However, whena9f9b0e
reverted3f79fa5
, a little to much was reverted and we lost whataf42cce
did. This patch re-introduces the fix. Fixes #5261 moodbar: Add comment (cherry picked from commit725e1d8f0d
)
This commit is contained in:
parent
8d2911bc32
commit
89e3d9851e
|
@ -270,10 +270,15 @@ QRect MoodbarProxyStyle::subControlRect(ComplexControl cc,
|
|||
case SC_SliderHandle: {
|
||||
const QStyleOptionSlider* slider_opt =
|
||||
qstyleoption_cast<const QStyleOptionSlider*>(opt);
|
||||
int x = 0;
|
||||
|
||||
const int x = (slider_opt->sliderValue - slider_opt->minimum) *
|
||||
(opt->rect.width() - kArrowWidth) /
|
||||
(slider_opt->maximum - slider_opt->minimum);
|
||||
/* slider_opt->{maximum,minimum} can have the value 0 (their default
|
||||
values), so this check avoids a division by 0. */
|
||||
if (slider_opt->maximum > slider_opt->minimum) {
|
||||
x = (slider_opt->sliderValue - slider_opt->minimum) *
|
||||
(opt->rect.width() - kArrowWidth) /
|
||||
(slider_opt->maximum - slider_opt->minimum);
|
||||
}
|
||||
|
||||
return QRect(QPoint(opt->rect.left() + x, opt->rect.top()),
|
||||
QSize(kArrowWidth, kArrowHeight));
|
||||
|
|
Loading…
Reference in New Issue