Commit 02d73243 authored by Mauro Carvalho Chehab's avatar Mauro Carvalho Chehab

media: radio-si476x: fix behavior when seek->range* are defined

The logic at si476x_radio_s_hw_freq_seek() checks if the
frequency range that will be used to handle hardware seek
has the minimal frequency under rangelow. That works fine
if userspace zeros both fields. However, if userspace
fills either seek->rangelow or seek-rangehigh, it won't
read the corresponding range from the device, causing the
values to be unitialized, as warned by smatch:

	drivers/media/radio/radio-si476x.c:789 si476x_radio_s_hw_freq_seek() error: uninitialized symbol 'rangelow'.
	drivers/media/radio/radio-si476x.c:789 si476x_radio_s_hw_freq_seek() error: uninitialized symbol 'rangehigh'.

Fix it by initializing those vars from the values present at
the struct v4l2_hw_freq_seek.

While here, simplify the logic which reads such values from
the hardware limits.
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent bc3cad2b
...@@ -759,7 +759,7 @@ static int si476x_radio_s_hw_freq_seek(struct file *file, void *priv, ...@@ -759,7 +759,7 @@ static int si476x_radio_s_hw_freq_seek(struct file *file, void *priv,
{ {
int err; int err;
enum si476x_func func; enum si476x_func func;
u32 rangelow, rangehigh; u32 rangelow = seek->rangelow, rangehigh = seek->rangehigh;
struct si476x_radio *radio = video_drvdata(file); struct si476x_radio *radio = video_drvdata(file);
if (file->f_flags & O_NONBLOCK) if (file->f_flags & O_NONBLOCK)
...@@ -771,23 +771,21 @@ static int si476x_radio_s_hw_freq_seek(struct file *file, void *priv, ...@@ -771,23 +771,21 @@ static int si476x_radio_s_hw_freq_seek(struct file *file, void *priv,
si476x_core_lock(radio->core); si476x_core_lock(radio->core);
if (!seek->rangelow) { if (!rangelow) {
err = regmap_read(radio->core->regmap, err = regmap_read(radio->core->regmap,
SI476X_PROP_SEEK_BAND_BOTTOM, SI476X_PROP_SEEK_BAND_BOTTOM,
&rangelow); &rangelow);
if (!err) if (err)
rangelow = si476x_to_v4l2(radio->core, rangelow);
else
goto unlock; goto unlock;
rangelow = si476x_to_v4l2(radio->core, rangelow);
} }
if (!seek->rangehigh) { if (!rangehigh) {
err = regmap_read(radio->core->regmap, err = regmap_read(radio->core->regmap,
SI476X_PROP_SEEK_BAND_TOP, SI476X_PROP_SEEK_BAND_TOP,
&rangehigh); &rangehigh);
if (!err) if (err)
rangehigh = si476x_to_v4l2(radio->core, rangehigh);
else
goto unlock; goto unlock;
rangehigh = si476x_to_v4l2(radio->core, rangehigh);
} }
if (rangelow > rangehigh) { if (rangelow > rangehigh) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment