diff options
author | Ricardo Cerqueira <v4l@cerqueira.org> | 2008-02-13 20:41:15 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@infradead.org> | 2008-02-18 10:18:08 -0500 |
commit | baff6cdd3328e7b35c4e155d79105621812bceec (patch) | |
tree | ab034bb13f4c37f9d874b46b6f8d855ead19fb06 /drivers/media/video | |
parent | 40ae91a758df916d7a5640fb2de20537ef7849fd (diff) |
V4L/DVB (7201): cx88-mpeg: Fix race condition in variable access
There was a possible race condition in the increment/decrement of
the active device references counter.
Thanks to Trent Piepho (xyzzy@speakeasy.org) for bringing it up.
Signed-off-by: Ricardo Cerqueira <v4l@cerqueira.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
Diffstat (limited to 'drivers/media/video')
-rw-r--r-- | drivers/media/video/cx88/cx88-mpeg.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/drivers/media/video/cx88/cx88-mpeg.c b/drivers/media/video/cx88/cx88-mpeg.c index f12733d6bf72..e357f415db06 100644 --- a/drivers/media/video/cx88/cx88-mpeg.c +++ b/drivers/media/video/cx88/cx88-mpeg.c | |||
@@ -615,8 +615,8 @@ static int cx8802_request_acquire(struct cx8802_driver *drv) | |||
615 | 615 | ||
616 | if (drv->advise_acquire) | 616 | if (drv->advise_acquire) |
617 | { | 617 | { |
618 | core->active_ref++; | ||
619 | mutex_lock(&drv->core->lock); | 618 | mutex_lock(&drv->core->lock); |
619 | core->active_ref++; | ||
620 | if (core->active_type_id == CX88_BOARD_NONE) { | 620 | if (core->active_type_id == CX88_BOARD_NONE) { |
621 | core->active_type_id = drv->type_id; | 621 | core->active_type_id = drv->type_id; |
622 | drv->advise_acquire(drv); | 622 | drv->advise_acquire(drv); |
@@ -634,14 +634,14 @@ static int cx8802_request_release(struct cx8802_driver *drv) | |||
634 | { | 634 | { |
635 | struct cx88_core *core = drv->core; | 635 | struct cx88_core *core = drv->core; |
636 | 636 | ||
637 | mutex_lock(&drv->core->lock); | ||
637 | if (drv->advise_release && --core->active_ref == 0) | 638 | if (drv->advise_release && --core->active_ref == 0) |
638 | { | 639 | { |
639 | mutex_lock(&drv->core->lock); | ||
640 | drv->advise_release(drv); | 640 | drv->advise_release(drv); |
641 | core->active_type_id = CX88_BOARD_NONE; | 641 | core->active_type_id = CX88_BOARD_NONE; |
642 | mutex_unlock(&drv->core->lock); | ||
643 | mpeg_dbg(1,"%s() Post release GPIO=%x\n", __FUNCTION__, cx_read(MO_GP0_IO)); | 642 | mpeg_dbg(1,"%s() Post release GPIO=%x\n", __FUNCTION__, cx_read(MO_GP0_IO)); |
644 | } | 643 | } |
644 | mutex_unlock(&drv->core->lock); | ||
645 | 645 | ||
646 | return 0; | 646 | return 0; |
647 | } | 647 | } |