mirror of https://gitee.com/openkylin/linux.git
[media] gspca_main: Update buffer flags even when user_copy fails
Before this patch dqbuf errors out on a failing user_copy (with user pointers) before updating the buffer flags, causing a successsfully dequeued buffer to still have the DONE flag, which means that it could no longer be re-queueud (assuming the app somehow survives the segfault). Signed-off-by: Hans de Goede <hdegoede@redhat.com> Acked-by: Jean-Francois Moine <moinejf@free.fr> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
27074efa2e
commit
4a82bc60a9
|
@ -1912,6 +1912,11 @@ static int vidioc_dqbuf(struct file *file, void *priv,
|
|||
mutex_unlock(&gspca_dev->usb_lock);
|
||||
}
|
||||
|
||||
frame->v4l2_buf.flags &= ~V4L2_BUF_FLAG_DONE;
|
||||
memcpy(v4l2_buf, &frame->v4l2_buf, sizeof *v4l2_buf);
|
||||
PDEBUG(D_FRAM, "dqbuf %d", j);
|
||||
ret = 0;
|
||||
|
||||
if (gspca_dev->memory == V4L2_MEMORY_USERPTR) {
|
||||
if (copy_to_user((__u8 __user *) frame->v4l2_buf.m.userptr,
|
||||
frame->data,
|
||||
|
@ -1919,13 +1924,8 @@ static int vidioc_dqbuf(struct file *file, void *priv,
|
|||
PDEBUG(D_ERR|D_STREAM,
|
||||
"dqbuf cp to user failed");
|
||||
ret = -EFAULT;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
frame->v4l2_buf.flags &= ~V4L2_BUF_FLAG_DONE;
|
||||
memcpy(v4l2_buf, &frame->v4l2_buf, sizeof *v4l2_buf);
|
||||
PDEBUG(D_FRAM, "dqbuf %d", j);
|
||||
ret = 0;
|
||||
out:
|
||||
mutex_unlock(&gspca_dev->queue_lock);
|
||||
return ret;
|
||||
|
|
Loading…
Reference in New Issue