queue/PlaylistEdit: fix crash in SetSongIdRange() while playing
An assertion failure in UpdateQueuedSong() could trigger because the `prev` parameter is always `nullptr`, but `queued` may be set. And in fact, calling UpdateQueuedSong() is only necessary when the queued song was edited, to re-queue it with the new range. Closes https://github.com/MusicPlayerDaemon/MPD/issues/901
This commit is contained in:
@@ -431,6 +431,8 @@ playlist::SetSongIdRange(PlayerControl &pc, unsigned id,
|
||||
if (position < 0)
|
||||
throw PlaylistError::NoSuchSong();
|
||||
|
||||
bool was_queued = false;
|
||||
|
||||
if (playing) {
|
||||
if (position == current)
|
||||
throw PlaylistError(PlaylistResult::DENIED,
|
||||
@@ -442,6 +444,10 @@ playlist::SetSongIdRange(PlayerControl &pc, unsigned id,
|
||||
already; cancel that */
|
||||
pc.LockCancel();
|
||||
queued = -1;
|
||||
|
||||
/* schedule a call to UpdateQueuedSong() to
|
||||
re-queue the song with its new range */
|
||||
was_queued = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -464,7 +470,8 @@ playlist::SetSongIdRange(PlayerControl &pc, unsigned id,
|
||||
song.SetEndTime(end);
|
||||
|
||||
/* announce the change to all interested subsystems */
|
||||
UpdateQueuedSong(pc, nullptr);
|
||||
if (was_queued)
|
||||
UpdateQueuedSong(pc, nullptr);
|
||||
queue.ModifyAtPosition(position);
|
||||
OnModified();
|
||||
}
|
||||
|
Reference in New Issue
Block a user