Stefan Huelswitt wrote:
On 12 Mar 2005 Wolfgang Fritz wolfgang.fritz@gmx.net wrote:
Graphlcd crashes with segfault when stopping an MP3 replay because it calls cMP3Control::GetIndex after the MP3 player object is already destroyed.
Reason: MP3 plugin signals end of replay too late. The attaches patch fixes it.
Ok, I changed the location, but I think that the real flaw is in VDRs player.h where the "player" var isn't checked before access.
If tested this (temporarily inserted a test for player == 0 in player.h), but it didn't help.
maybe
void cMP3Control::Stop(void) { delete player; player=0; mgr->Halt(); mgr->Flush(); //XXX remove later }
has a concurrency problem? Who guarantees that no other thread interrupts the mp3 thread while is in the destructor?
Wouldn't be something like this a little bit safer:
void cMP3Control::Stop(void) { cMP3player *p = player; player = 0; delete p; mgr->Halt(); mgr->Flush(); //XXX remove later }
There seem to be more concurrency problems which crop up with the graphlcd plugin. In rare cases I get a segfault when exiting a normal vdr replay.
Wolfgang
Regards.