summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKlaus Schmidinger <vdr@tvdr.de>2016-12-11 13:06:58 +0100
committerKlaus Schmidinger <vdr@tvdr.de>2016-12-11 13:06:58 +0100
commita9bd3ca0dc06c9a6439f5e484e137fc6aa50b4bc (patch)
tree49cb44825827e1d45a18d18e932ce86b68f9f50d
parent031bbcef40cada90ff344511d4c06d67d11f0b83 (diff)
downloadvdr-a9bd3ca0dc06c9a6439f5e484e137fc6aa50b4bc.tar.gz
vdr-a9bd3ca0dc06c9a6439f5e484e137fc6aa50b4bc.tar.bz2
Fixed a crash when deleting a recording that is currently being replayed
-rw-r--r--HISTORY3
-rw-r--r--menu.c39
2 files changed, 19 insertions, 23 deletions
diff --git a/HISTORY b/HISTORY
index 77185d2d..18c29885 100644
--- a/HISTORY
+++ b/HISTORY
@@ -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.
diff --git a/menu.c b/menu.c
index f157a549..598fc3d3 100644
--- a/menu.c
+++ b/menu.c
@@ -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);