libv4lconvert: Fix a regression when converting from Y10B
Commit Message
Fix a regression introduced in commit
efc29f1764a30808ebf7b3e1d9bfa27b909bf641 (libv4lconvert: Reject too
short source buffer before accessing it).
The old code:
case V4L2_PIX_FMT_Y10BPACK:
...
if (result == 0 && src_size < (width * height * 10 / 8)) {
V4LCONVERT_ERR("short y10b data frame\n");
errno = EPIPE;
result = -1;
}
...
meant to say "If the conversion was *successful* _but_ the frame size
was invalid, then take the error path", but in
efc29f1764a30808ebf7b3e1d9bfa27b909bf641 this (maybe weird) logic was
misunderstood and the v4lconvert_convert_pixfmt() was made to return an
error even in the case of a successful conversion from Y10B.
Fix the check, and now print only the message letting the errno and the
result from the conversion routines to be propagated to the caller.
Signed-off-by: Antonio Ospite <ao2@ao2.it>
Cc: Gregor Jasny <gjasny@googlemail.com>
---
Hi,
the regression affects only the users of the gspca-kinect driver when using
the IR stream.
I think this should be cherry-picked in stable-1.0 too.
BTW Gregor, in efc29f1764a30808ebf7b3e1d9bfa27b909bf641 you say "Reject too
short source buffer before accessing it" but the code only does "result = -1"
and then still calls the conversion routines, so it's not actually *rejecting*
the frames, am I missing anything?
Thanks,
Antonio
lib/libv4lconvert/libv4lconvert.c | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
Comments
On Tue, 3 Jun 2014 15:48:46 +0200
Antonio Ospite <ao2@ao2.it> wrote:
> Fix a regression introduced in commit
> efc29f1764a30808ebf7b3e1d9bfa27b909bf641 (libv4lconvert: Reject too
> short source buffer before accessing it).
>
> The old code:
>
> case V4L2_PIX_FMT_Y10BPACK:
> ...
> if (result == 0 && src_size < (width * height * 10 / 8)) {
> V4LCONVERT_ERR("short y10b data frame\n");
> errno = EPIPE;
> result = -1;
> }
> ...
>
> meant to say "If the conversion was *successful* _but_ the frame size
> was invalid, then take the error path", but in
> efc29f1764a30808ebf7b3e1d9bfa27b909bf641 this (maybe weird) logic was
> misunderstood and the v4lconvert_convert_pixfmt() was made to return an
^^^
Dear committer, you can remove this "the", if you feel like it :)
Thanks,
Antonio
@@ -1052,11 +1052,8 @@ static int v4lconvert_convert_pixfmt(struct v4lconvert_data *data,
width, height);
break;
}
- if (result == 0) {
+ if (result != 0)
V4LCONVERT_ERR("y10b conversion failed\n");
- errno = EPIPE;
- result = -1;
- }
break;
case V4L2_PIX_FMT_RGB565: