Fixed a crash when deleting a recording that is currently being replayed

This commit is contained in:
Klaus Schmidinger 2016-12-11 13:06:58 +01:00
parent 031bbcef40
commit a9bd3ca0dc
2 changed files with 19 additions and 23 deletions

View File

@ -8828,7 +8828,7 @@ Video Disk Recorder Revision History
- Empty adaptation field TS packets are now skipped when recording (thanks to - Empty adaptation field TS packets are now skipped when recording (thanks to
Christopher Reimer, based on the "AFFcleaner" by Stefan Pöschel). 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 a crash when deleting a recording (reported by Oliver Endriss).
- Fixed an overflow of PIDs in a receiver (thanks to Robert Hannebauer). - 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 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 - Fixed setting the current item and counter values in the Recordings menu after
deleting the last recording in a subfolder. deleting the last recording in a subfolder.
- Fixed a crash when deleting a recording that is currently being replayed.

39
menu.c
View File

@ -4,7 +4,7 @@
* See the main source file 'vdr.c' for copyright information and * See the main source file 'vdr.c' for copyright information and
* how to reach the author. * 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" #include "menu.h"
@ -3089,29 +3089,24 @@ eOSState cMenuRecordings::Delete(void)
else else
return osContinue; return osContinue;
} }
cRecordings *Recordings = cRecordings::GetRecordingsWrite(recordingsStateKey); cString FileName;
Recordings->SetExplicitModify(); {
cRecording *Recording = Recordings->GetByName(ri->Recording()->FileName()); LOCK_RECORDINGS_READ;
if (!Recording) { if (const cRecording *Recording = Recordings->GetByName(ri->Recording()->FileName())) {
Skins.Message(mtWarning, tr("Recording vanished!")); FileName = Recording->FileName();
recordingsStateKey.Remove(); if (RecordingsHandler.GetUsage(FileName)) {
return osContinue; if (Interface->Confirm(tr("Recording is being edited - really delete?")))
} RecordingsHandler.Del(FileName);
cString FileName = Recording->FileName(); else
if (RecordingsHandler.GetUsage(FileName)) { return osContinue;
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;
}
}
if (cReplayControl::NowReplaying() && strcmp(cReplayControl::NowReplaying(), FileName) == 0) if (cReplayControl::NowReplaying() && strcmp(cReplayControl::NowReplaying(), FileName) == 0)
cControl::Shutdown(); cControl::Shutdown();
cRecordings *Recordings = cRecordings::GetRecordingsWrite(recordingsStateKey);
Recordings->SetExplicitModify();
cRecording *Recording = Recordings->GetByName(FileName);
if (!Recording || Recording->Delete()) { if (!Recording || Recording->Delete()) {
cReplayControl::ClearLastReplayed(FileName); cReplayControl::ClearLastReplayed(FileName);
Recordings->DelByName(FileName); Recordings->DelByName(FileName);