All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Frank Schäfer" <fschaefer.oss@googlemail.com>
To: Hans Verkuil <hverkuil@xs4all.nl>,
	Linux Media Mailing List <linux-media@vger.kernel.org>
Subject: Re: [PATCH for v3.17] v4l2-ctrls: fix rounding calculation
Date: Sun, 27 Jul 2014 23:18:25 +0200	[thread overview]
Message-ID: <53D56CA1.2010706@googlemail.com> (raw)
In-Reply-To: <53D3D133.7000103@xs4all.nl>


Am 26.07.2014 18:02, schrieb Hans Verkuil:
> Commit 958c7c7e65 ("[media] v4l2-ctrls: fix corner case in round-to-range code") broke
> controls that use a negative range.
>
> The cause was a s32/u32 mixup: ctrl->step is unsigned while all others are signed. So
> the result type of the expression '(ctrl)->maximum - ((ctrl)->step / 2)' became unsigned,
> making 'val >= (ctrl)->maximum - ((ctrl)->step / 2)' true, since '((u32)-128) > 128'
> (if val = -128, maximum = 128 and step = 1).
>
> So carefully cast (step / 2) to s32.
>
> There was one cast of step to s32 where it should have been u32 because both offset and
> step are unsigned, so casting to signed makes no sense there. You do need a cast to u32
> there, because otherwise architectures that have no 64-bit division start complaining
> (step is a u64).
>
> Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
> Reported-by: Frank Schäfer <fschaefer.oss@googlemail.com>
>
> diff --git a/drivers/media/v4l2-core/v4l2-ctrls.c b/drivers/media/v4l2-core/v4l2-ctrls.c
> index 2d8ced8..9d0c7a1 100644
> --- a/drivers/media/v4l2-core/v4l2-ctrls.c
> +++ b/drivers/media/v4l2-core/v4l2-ctrls.c
> @@ -1347,14 +1347,14 @@ static void std_log(const struct v4l2_ctrl *ctrl)
>  ({								\
>  	offset_type offset;					\
>  	if ((ctrl)->maximum >= 0 &&				\
> -	    val >= (ctrl)->maximum - ((ctrl)->step / 2))	\
> +	    val >= (ctrl)->maximum - (s32)((ctrl)->step / 2))	\
>  		val = (ctrl)->maximum;				\
>  	else							\
> -		val += (ctrl)->step / 2;			\
> +		val += (s32)((ctrl)->step / 2);			\
>  	val = clamp_t(typeof(val), val,				\
>  		      (ctrl)->minimum, (ctrl)->maximum);	\
>  	offset = (val) - (ctrl)->minimum;			\
> -	offset = (ctrl)->step * (offset / (s32)(ctrl)->step);	\
> +	offset = (ctrl)->step * (offset / (u32)(ctrl)->step);	\
>  	val = (ctrl)->minimum + offset;				\
>  	0;							\
>  })
> @@ -1376,10 +1376,10 @@ static int std_validate(const struct v4l2_ctrl *ctrl, u32 idx,
>  		 * the u64 divide that needs special care.
>  		 */
>  		val = ptr.p_s64[idx];
> -		if (ctrl->maximum >= 0 && val >= ctrl->maximum - ctrl->step / 2)
> +		if (ctrl->maximum >= 0 && val >= ctrl->maximum - (s64)(ctrl->step / 2))
>  			val = ctrl->maximum;
>  		else
> -			val += ctrl->step / 2;
> +			val += (s64)(ctrl->step / 2);
>  		val = clamp_t(s64, val, ctrl->minimum, ctrl->maximum);
>  		offset = val - ctrl->minimum;
>  		do_div(offset, ctrl->step);

Tested-by: Frank Schäfer <fschaefer.oss@googlemail.com>



      reply	other threads:[~2014-07-27 21:17 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-26 16:02 [PATCH for v3.17] v4l2-ctrls: fix rounding calculation Hans Verkuil
2014-07-27 21:18 ` Frank Schäfer [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=53D56CA1.2010706@googlemail.com \
    --to=fschaefer.oss@googlemail.com \
    --cc=hverkuil@xs4all.nl \
    --cc=linux-media@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.