diff options
author | Klaus Schmidinger <vdr@tvdr.de> | 2016-12-11 13:06:58 +0100 |
---|---|---|
committer | Klaus Schmidinger <vdr@tvdr.de> | 2016-12-11 13:06:58 +0100 |
commit | a9bd3ca0dc06c9a6439f5e484e137fc6aa50b4bc (patch) | |
tree | 49cb44825827e1d45a18d18e932ce86b68f9f50d | |
parent | 031bbcef40cada90ff344511d4c06d67d11f0b83 (diff) | |
download | vdr-a9bd3ca0dc06c9a6439f5e484e137fc6aa50b4bc.tar.gz vdr-a9bd3ca0dc06c9a6439f5e484e137fc6aa50b4bc.tar.bz2 |
Fixed a crash when deleting a recording that is currently being replayed
-rw-r--r-- | HISTORY | 3 | ||||
-rw-r--r-- | menu.c | 39 |
2 files changed, 19 insertions, 23 deletions
@@ -8828,7 +8828,7 @@ Video Disk Recorder Revision History - Empty adaptation field TS packets are now skipped when recording (thanks to Christopher Reimer, based on the "AFFcleaner" by Stefan Pöschel). -2016-12-09: Version 2.3.2 +2016-12-11: Version 2.3.2 - Fixed a crash when deleting a recording (reported by Oliver Endriss). - Fixed an overflow of PIDs in a receiver (thanks to Robert Hannebauer). @@ -8846,3 +8846,4 @@ Video Disk Recorder Revision History - Fixed a crash when trying to delete a channel that is being used by a timer. - Fixed setting the current item and counter values in the Recordings menu after deleting the last recording in a subfolder. +- Fixed a crash when deleting a recording that is currently being replayed. @@ -4,7 +4,7 @@ * See the main source file 'vdr.c' for copyright information and * how to reach the author. * - * $Id: menu.c 4.16 2016/12/09 14:54:24 kls Exp $ + * $Id: menu.c 4.17 2016/12/11 12:43:55 kls Exp $ */ #include "menu.h" @@ -3089,29 +3089,24 @@ eOSState cMenuRecordings::Delete(void) else return osContinue; } - cRecordings *Recordings = cRecordings::GetRecordingsWrite(recordingsStateKey); - Recordings->SetExplicitModify(); - cRecording *Recording = Recordings->GetByName(ri->Recording()->FileName()); - if (!Recording) { - Skins.Message(mtWarning, tr("Recording vanished!")); - recordingsStateKey.Remove(); - return osContinue; - } - cString FileName = Recording->FileName(); - if (RecordingsHandler.GetUsage(FileName)) { - if (Interface->Confirm(tr("Recording is being edited - really delete?"))) { - RecordingsHandler.Del(FileName); - Recording = Recordings->GetByName(FileName); // RecordingsHandler.Del() might have deleted it if it was the edited version - // we continue with the code below even if Recording is NULL, - // in order to have the menu updated etc. - } - else { - recordingsStateKey.Remove(); - return osContinue; - } - } + cString FileName; + { + LOCK_RECORDINGS_READ; + if (const cRecording *Recording = Recordings->GetByName(ri->Recording()->FileName())) { + FileName = Recording->FileName(); + if (RecordingsHandler.GetUsage(FileName)) { + if (Interface->Confirm(tr("Recording is being edited - really delete?"))) + RecordingsHandler.Del(FileName); + else + return osContinue; + } + } + } if (cReplayControl::NowReplaying() && strcmp(cReplayControl::NowReplaying(), FileName) == 0) cControl::Shutdown(); + cRecordings *Recordings = cRecordings::GetRecordingsWrite(recordingsStateKey); + Recordings->SetExplicitModify(); + cRecording *Recording = Recordings->GetByName(FileName); if (!Recording || Recording->Delete()) { cReplayControl::ClearLastReplayed(FileName); Recordings->DelByName(FileName); |