Hi Laurent,

On Wed, Feb 20, 2019 at 02:51:22PM +0200, Laurent Pinchart wrote:
> Signed-off-by: Laurent Pinchart <laurent.pinch...@ideasonboard.com>
> ---
>  yavta.c | 25 +++++++++++++++++++++++++
>  1 file changed, 25 insertions(+)
> 
> diff --git a/yavta.c b/yavta.c
> index 1490878c6f7e..2d49131a4271 100644
> --- a/yavta.c
> +++ b/yavta.c
> @@ -1334,6 +1334,31 @@ static int video_parse_control_array(const struct 
> v4l2_query_ext_ctrl *query,
>       __u32 value;
>  
>       for ( ; isspace(*val); ++val) { };
> +
> +     if (*val == '<') {
> +             /* Read the control value from the given file. */
> +             ssize_t size;
> +             int fd;
> +
> +             val++;
> +             fd = open(val, O_RDONLY);
> +             if (fd < 0) {
> +                     printf("unable to open control file `%s'\n", val);
> +                     return -EINVAL;
> +             }
> +
> +             size = read(fd, ctrl->ptr, ctrl->size);

Note that a read of count reads *up to* count number of bytes from the file
descriptor. In other words, it's perfectly correct for it to read less than
requested.

How about using fread(3) instead? Or changing this into a loop?

> +             if (size != (ssize_t)ctrl->size) {
> +                     printf("error reading control file `%s' (%s)\n", val,
> +                            strerror(errno));
> +                     close(fd);
> +                     return -EINVAL;
> +             }
> +
> +             close(fd);
> +             return 0;
> +     }
> +
>       if (*val++ != '{')
>               return -EINVAL;
>  

-- 
Regards,

Sakari Ailus

Reply via email to