diff options
author | Jean-François Moine <moinejf@free.fr> | 2010-07-06 03:32:27 -0400 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2010-08-02 15:42:48 -0400 |
commit | f7059eaa285c0460569ffd26c43ae07e3f03cd6c (patch) | |
tree | 4f31450a63b1460fcdf3b79e8f47d8b824683a60 /drivers/media/video/gspca/ov534.c | |
parent | 02bbcb9d863df10b5a4b91ba5b4c76eaf1340883 (diff) |
V4L/DVB: gspca - main: Don't use the frame buffer flags
This patch fixes possible race conditions in queue management with SMP:
when a frame was completed, the irq function tried to use the next frame
buffer. At this time, it was possible that the application on an other
processor updated the frame pointer, making the image to point to a bad
buffer.
The patch contains two main changes:
- the image transfer uses the queue indexes which are protected against
simultaneous memory access,
- the image pointer which is used for image concatenation is only set at
interrupt level.
Some subdrivers which used the image pointer have been updated.
Reported-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Jean-François Moine <moinejf@free.fr>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
Diffstat (limited to 'drivers/media/video/gspca/ov534.c')
-rw-r--r-- | drivers/media/video/gspca/ov534.c | 2 |
1 files changed, 0 insertions, 2 deletions
diff --git a/drivers/media/video/gspca/ov534.c b/drivers/media/video/gspca/ov534.c index 84c9b8dbded..96cb3a97658 100644 --- a/drivers/media/video/gspca/ov534.c +++ b/drivers/media/video/gspca/ov534.c | |||
@@ -988,8 +988,6 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev, | |||
988 | /* If this packet is marked as EOF, end the frame */ | 988 | /* If this packet is marked as EOF, end the frame */ |
989 | } else if (data[1] & UVC_STREAM_EOF) { | 989 | } else if (data[1] & UVC_STREAM_EOF) { |
990 | sd->last_pts = 0; | 990 | sd->last_pts = 0; |
991 | if (gspca_dev->image == NULL) | ||
992 | goto discard; | ||
993 | if (gspca_dev->image_len + len - 12 != | 991 | if (gspca_dev->image_len + len - 12 != |
994 | gspca_dev->width * gspca_dev->height * 2) { | 992 | gspca_dev->width * gspca_dev->height * 2) { |
995 | PDEBUG(D_PACK, "wrong sized frame"); | 993 | PDEBUG(D_PACK, "wrong sized frame"); |