aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video
diff options
context:
space:
mode:
authorArjan van de Ven <arjan@linux.intel.com>2008-06-22 16:03:02 -0400
committerMauro Carvalho Chehab <mchehab@infradead.org>2008-06-26 14:58:59 -0400
commita17898737eaed4ef41f273da7b830c632e06613e (patch)
treebbeba425693062ad38bc13f73ec8d0f5744f26e2 /drivers/media/video
parent5c554e6b984ce6b36488b93a7ec8e2752233e7cb (diff)
V4L/DVB (8108): Fix open/close race in saa7134
The saa7134 driver uses a (non-atomic) variable in an attempt to only allow one opener of the device (how it deals with sending the fd over unix sockets I don't know). Unfortunately, the release function first decrements this variable, and THEN goes on to disable more of the device. This allows for a race where another opener of the device comes in after the decrement of the variable, configures the hardware just to then see the hardware be disabled by the rest of the release function. This patch makes the release function use the same lock as the open function to protect the hardware as well as the variable (which now at least has some locking to protect it). Signed-off-by: Arjan van de Ven <arjan@linux.intel.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers/media/video')
-rw-r--r--drivers/media/video/saa7134/saa7134-empress.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/drivers/media/video/saa7134/saa7134-empress.c b/drivers/media/video/saa7134/saa7134-empress.c
index 1c8cd0ef4a65..3ae71a340822 100644
--- a/drivers/media/video/saa7134/saa7134-empress.c
+++ b/drivers/media/video/saa7134/saa7134-empress.c
@@ -110,6 +110,8 @@ static int ts_release(struct inode *inode, struct file *file)
110{ 110{
111 struct saa7134_dev *dev = file->private_data; 111 struct saa7134_dev *dev = file->private_data;
112 112
113 mutex_lock(&dev->empress_tsq.vb_lock);
114
113 videobuf_stop(&dev->empress_tsq); 115 videobuf_stop(&dev->empress_tsq);
114 videobuf_mmap_free(&dev->empress_tsq); 116 videobuf_mmap_free(&dev->empress_tsq);
115 117
@@ -122,6 +124,8 @@ static int ts_release(struct inode *inode, struct file *file)
122 124
123 dev->empress_users--; 125 dev->empress_users--;
124 126
127 mutex_unlock(&dev->empress_tsq.vb_lock);
128
125 return 0; 129 return 0;
126} 130}
127 131