Code

screen_lyrics, screen_song: duplicate "next_song"
authorMax Kellermann <max@duempel.org>
Fri, 18 Sep 2009 09:30:49 +0000 (11:30 +0200)
committerMax Kellermann <max@duempel.org>
Fri, 18 Sep 2009 09:30:49 +0000 (11:30 +0200)
The screen_X_switch() function calls screen_switch.  As a side effect
of the previous screen being closed, the next_song pointer may become
invalid, which causes memory corruption.  Let's duplicate the song
when assigning it to next_song.

src/screen_lyrics.c
src/screen_song.c

index a1556aec582bbdf2cf2d2eb3ad9d013a41b3b812..8f7c23d4436448c3950e4cb46e26a0e91580ed42 100644 (file)
@@ -35,7 +35,7 @@
 
 static struct screen_text text;
 
-static const struct mpd_song *next_song;
+static struct mpd_song *next_song;
 static bool follow = false;
 
 static struct {
@@ -210,6 +210,8 @@ lyrics_open(mpdclient_t *c)
             strcmp(next_song->file, current.song->file) != 0))
                screen_lyrics_load(next_song);
 
+       if (next_song != c->song)
+               mpd_freeSong(next_song);
        next_song = NULL;
 }
 
@@ -327,6 +329,6 @@ screen_lyrics_switch(struct mpdclient *c, const struct mpd_song *song, bool f)
        assert(song != NULL);
 
        follow = f;
-       next_song = song;
+       next_song = mpd_songDup(song);
        screen_switch(&screen_lyrics, c);
 }
index 6d27e564a6ca8a23811f42f2f1986839cfdf493e..a7d6f8ee4c087c4dbdae4b189c4c528465bd7985 100644 (file)
@@ -28,7 +28,7 @@
 
 static list_window_t *lw;
 
-static const struct mpd_song *next_song;
+static struct mpd_song *next_song;
 
 static struct {
        struct mpd_song *selected_song;
@@ -315,7 +315,7 @@ screen_song_update(mpdclient_t *c)
        /* If a song was selected before the song screen was opened */
        if (next_song != NULL) {
                assert(current.selected_song == NULL);
-               current.selected_song = mpd_songDup(next_song);
+               current.selected_song = next_song;
                next_song = NULL;
        }
 
@@ -426,6 +426,6 @@ screen_song_switch(mpdclient_t *c, const struct mpd_song *song)
        assert(current.selected_song == NULL);
        assert(current.played_song == NULL);
 
-       next_song = song;
+       next_song = mpd_songDup(song);
        screen_switch(&screen_song, c);
 }