From 8c0981583fcd5e531ac955cd8184866dd4eaf9a2 Mon Sep 17 00:00:00 2001
From: Klaus Schmidinger <vdr@tvdr.de>
Date: Sun, 16 Jan 2005 14:50:33 +0100
Subject: Fixed a possible race condition in cDevice::Action() and
 cTSBuffer::Action()

---
 CONTRIBUTORS |  1 +
 HISTORY      |  2 ++
 device.c     | 13 +++++++------
 3 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/CONTRIBUTORS b/CONTRIBUTORS
index 74487594..987112f6 100644
--- a/CONTRIBUTORS
+++ b/CONTRIBUTORS
@@ -189,6 +189,7 @@ Stefan Huelswitt <huels@iname.com>
  skin in case a shorter title is set after a longer one
  for fixing handling of pmAudioOnlyBlack
  for pointing out possible race conditions in handling childTid in cThread
+ for fixing a possible race condition in cDevice::Action() and cTSBuffer::Action()
 
 Ulrich R�der <roeder@efr-net.de>
  for pointing out that there are channels that have a symbol rate higher than
diff --git a/HISTORY b/HISTORY
index b4c148db..e6ac729b 100644
--- a/HISTORY
+++ b/HISTORY
@@ -3318,3 +3318,5 @@ Video Disk Recorder Revision History
   cRecorder::cRecorder()
   cReceiver::cReceiver()
   cRemux::cRemux()
+- Fixed a possible race condition in cDevice::Action() and cTSBuffer::Action()
+  (thanks to Stefan Huelswitt).
diff --git a/device.c b/device.c
index 0bbf21ce..2cf9f0fd 100644
--- a/device.c
+++ b/device.c
@@ -4,7 +4,7 @@
  * See the main source file 'vdr.c' for copyright information and
  * how to reach the author.
  *
- * $Id: device.c 1.74 2005/01/16 14:05:37 kls Exp $
+ * $Id: device.c 1.75 2005/01/16 14:48:52 kls Exp $
  */
 
 #include "device.h"
@@ -991,8 +991,7 @@ bool cDevice::Receiving(bool CheckAny) const
 
 void cDevice::Action(void)
 {
-  active = true;
-  if (OpenDvr()) {
+  if (active && OpenDvr()) {
      for (; active;) {
          // Read data from the DVR device:
          uchar *b = NULL;
@@ -1054,7 +1053,10 @@ bool cDevice::AttachReceiver(cReceiver *Receiver)
          Receiver->device = this;
          receiver[i] = Receiver;
          Unlock();
-         Start();
+         if (!active) {
+            active = true;
+            Start();
+            }
          return true;
          }
       }
@@ -1094,10 +1096,10 @@ cTSBuffer::cTSBuffer(int File, int Size, int CardIndex)
   SetDescription("TS buffer on device %d", CardIndex);
   f = File;
   cardIndex = CardIndex;
-  active = false;
   delivered = false;
   ringBuffer = new cRingBufferLinear(Size, TS_SIZE, true, "TS");
   ringBuffer->SetTimeouts(100, 100);
+  active = true;
   Start();
 }
 
@@ -1113,7 +1115,6 @@ void cTSBuffer::Action(void)
   if (ringBuffer) {
      bool firstRead = true;
      cPoller Poller(f);
-     active = true;
      for (; active;) {
          if (firstRead || Poller.Poll(100)) {
             firstRead = false;
-- 
cgit v1.2.3