From: Hans Verkuil <hansverk@cisco.com>
To: Prashant Laddha <prladdha@cisco.com>, linux-media@vger.kernel.org
Cc: Hans Verkuil <hans.verkuil@cisco.com>, Martin Bugge <marbugge@cisco.com>
Subject: Re: [PATCH] v4l2-dv-timings: fix overflow in gtf timings calculation
Date: Mon, 04 May 2015 11:57:17 +0200 [thread overview]
Message-ID: <5547427D.3000702@cisco.com> (raw)
In-Reply-To: <1430587386-28409-1-git-send-email-prladdha@cisco.com>
On 05/02/2015 07:23 PM, Prashant Laddha wrote:
> The intermediate calculation in the expression for hblank can exceed
> 32 bit signed range. This overflow can lead to negative values for
> hblank. Typecasting intermediate variable to higher precision.
>
> Cc: Hans Verkuil <hans.verkuil@cisco.com>
> Cc: Martin Bugge <marbugge@cisco.com>
> Signed-off-by: Prashant Laddha <prladdha@cisco.com>
> ---
> drivers/media/v4l2-core/v4l2-dv-timings.c | 16 ++++++++--------
> 1 file changed, 8 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/media/v4l2-core/v4l2-dv-timings.c b/drivers/media/v4l2-core/v4l2-dv-timings.c
> index 86e11d1..9d27f05 100644
> --- a/drivers/media/v4l2-core/v4l2-dv-timings.c
> +++ b/drivers/media/v4l2-core/v4l2-dv-timings.c
> @@ -573,15 +573,15 @@ bool v4l2_detect_gtf(unsigned frame_height,
>
> /* Horizontal */
> if (default_gtf)
> - h_blank = ((image_width * GTF_D_C_PRIME * hfreq) -
> - (image_width * GTF_D_M_PRIME * 1000) +
> - (hfreq * (100 - GTF_D_C_PRIME) + GTF_D_M_PRIME * 1000) / 2) /
> - (hfreq * (100 - GTF_D_C_PRIME) + GTF_D_M_PRIME * 1000);
> + h_blank = ((image_width * GTF_D_C_PRIME * (long long)hfreq) -
> + ((long long)image_width * GTF_D_M_PRIME * 1000) +
> + ((long long)hfreq * (100 - GTF_D_C_PRIME) + GTF_D_M_PRIME * 1000) / 2) /
> + ((long long)hfreq * (100 - GTF_D_C_PRIME) + GTF_D_M_PRIME * 1000);
This will not work on systems that cannot divide 64 bit numbers. Use the do_div
function for this. It's a common mistake to make when developing on Intel CPUs.
Been there, done that :-) Multiple times, in fact...
And I think it will help a lot if some additional variables are introduced since
this calculation is getting complex.
Also replace "/ 2" by ">> 1". That will guarantee that you do not need do_div for
that. Probably unnecessary since I would expect gcc to be smart enough to replace
/ 2 by >> 1 anyway, but it doesn't hurt.
Regards,
Hans
> else
> - h_blank = ((image_width * GTF_S_C_PRIME * hfreq) -
> - (image_width * GTF_S_M_PRIME * 1000) +
> - (hfreq * (100 - GTF_S_C_PRIME) + GTF_S_M_PRIME * 1000) / 2) /
> - (hfreq * (100 - GTF_S_C_PRIME) + GTF_S_M_PRIME * 1000);
> + h_blank = ((image_width * GTF_S_C_PRIME * (long long)hfreq) -
> + ((long long)image_width * GTF_S_M_PRIME * 1000) +
> + ((long long)hfreq * (100 - GTF_S_C_PRIME) + GTF_S_M_PRIME * 1000) / 2) /
> + ((long long)hfreq * (100 - GTF_S_C_PRIME) + GTF_S_M_PRIME * 1000);
>
> h_blank = ((h_blank + GTF_CELL_GRAN) / (2 * GTF_CELL_GRAN)) *
> (2 * GTF_CELL_GRAN);
>
prev parent reply other threads:[~2015-05-04 9:57 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-05-02 17:23 [PATCH] v4l2-dv-timings: fix overflow in gtf timings calculation Prashant Laddha
2015-05-04 9:57 ` Hans Verkuil [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=5547427D.3000702@cisco.com \
--to=hansverk@cisco.com \
--cc=hans.verkuil@cisco.com \
--cc=linux-media@vger.kernel.org \
--cc=marbugge@cisco.com \
--cc=prladdha@cisco.com \
/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.