aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/media/video/gspca/cpia1.c
diff options
context:
space:
mode:
authorJean-François Moine <moinejf@free.fr>2010-07-06 03:32:27 -0400
committerMauro Carvalho Chehab <mchehab@redhat.com>2010-08-02 15:42:48 -0400
commitf7059eaa285c0460569ffd26c43ae07e3f03cd6c (patch)
tree4f31450a63b1460fcdf3b79e8f47d8b824683a60 /drivers/media/video/gspca/cpia1.c
parent02bbcb9d863df10b5a4b91ba5b4c76eaf1340883 (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/cpia1.c')
-rw-r--r--drivers/media/video/gspca/cpia1.c10
1 files changed, 3 insertions, 7 deletions
diff --git a/drivers/media/video/gspca/cpia1.c b/drivers/media/video/gspca/cpia1.c
index 4b3ea3b4bbba..3747a1dcff54 100644
--- a/drivers/media/video/gspca/cpia1.c
+++ b/drivers/media/video/gspca/cpia1.c
@@ -1765,14 +1765,10 @@ static void sd_pkt_scan(struct gspca_dev *gspca_dev,
1765 atomic_set(&sd->cam_exposure, data[39] * 2); 1765 atomic_set(&sd->cam_exposure, data[39] * 2);
1766 atomic_set(&sd->fps, data[41]); 1766 atomic_set(&sd->fps, data[41]);
1767 1767
1768 image = gspca_dev->image;
1769 if (image == NULL) {
1770 gspca_dev->last_packet_type = DISCARD_PACKET;
1771 return;
1772 }
1773
1774 /* Check for proper EOF for last frame */ 1768 /* Check for proper EOF for last frame */
1775 if (gspca_dev->image_len > 4 && 1769 image = gspca_dev->image;
1770 if (image != NULL &&
1771 gspca_dev->image_len > 4 &&
1776 image[gspca_dev->image_len - 4] == 0xff && 1772 image[gspca_dev->image_len - 4] == 0xff &&
1777 image[gspca_dev->image_len - 3] == 0xff && 1773 image[gspca_dev->image_len - 3] == 0xff &&
1778 image[gspca_dev->image_len - 2] == 0xff && 1774 image[gspca_dev->image_len - 2] == 0xff &&