[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <56C6EA14.7080405@lysator.liu.se>
Date: Fri, 19 Feb 2016 11:10:28 +0100
From: Peter Rosin <peda@...ator.liu.se>
To: Antti Palosaari <crope@....fi>
CC: linux-media@...r.kernel.org,
Mauro Carvalho Chehab <mchehab@....samsung.com>,
linux-kernel@...r.kernel.org
Subject: m88ds3103: Undefined division
Hi!
I'm looking at this code in drivers/media/dvb-frontends/m88ds3103.c in
the m88ds3103_set_frontend() function, line 600 (give or take):
s32tmp = 0x10000 * (tuner_frequency - c->frequency);
s32tmp = DIV_ROUND_CLOSEST(s32tmp, priv->mclk_khz);
if (s32tmp < 0)
s32tmp += 0x10000;
There is code that tries to handle negative s32tmp, so I assume that
negative s32tmp is a possibility. Further, priv->mclk_khz is an unsigned
type as far as I can tell. But then we have this comment for the
DIV_ROUND_CLOSEST macro:
/*
* Divide positive or negative dividend by positive divisor and round
* to closest integer. Result is undefined for negative divisors and
* for negative dividends if the divisor variable type is unsigned.
*/
#define DIV_ROUND_CLOSEST(x, divisor)( \
I don't know how bad this is, and what the consequences of garbage are,
but from here it looks like a problem waiting to happen...
Cheers,
Peter
Powered by blists - more mailing lists