V4L/DVB: gspca - main: Possible race condition in queue management
authorJean-François Moine <moinejf@free.fr>
Tue, 6 Jul 2010 07:16:40 +0000 (04:16 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 2 Aug 2010 19:42:47 +0000 (16:42 -0300)
commit02bbcb9d863df10b5a4b91ba5b4c76eaf1340883
tree1e19c0d8d0a50e1a34d4b6fa5f5027ee713b9612
parent9059cd44403608f6554b37c3b3d5598ded7a3a92
V4L/DVB: gspca - main: Possible race condition in queue management

The problem may occur with SMP:
- a frame is completed at interrupt level (in gspca_frame_add with
  packet_type == LAST_PACKET,
- just after clearing the bit V4L2_BUF_FLAG_QUEUED and before setting
  the bit V4L2_BUF_FLAG_DONE, on the other processor, the application
  tries to requeue the same frame buffer,
- then, the qbuf function succeeds because ALL_FLAGS are not set.
The fix sets and resets the two flags in one instruction.

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>
drivers/media/video/gspca/gspca.c