Re: [PATCH v2 for v4l-dvb master] V4L/DVB: budget: Oops: "BUG: unable to handle kernel NULL pointer dereference"

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

Bjørn Mork wrote:
> Never call dvb_frontend_detach if we failed to attach a frontend. This fixes
> the following oops:
> 
> [    8.172997] DVB: registering new adapter (TT-Budget S2-1600 PCI)
> [    8.209018] adapter has MAC addr = 00:d0:5c:cc:a7:29
> [    8.328665] Intel ICH 0000:00:1f.5: PCI INT B -> GSI 17 (level, low) -> IRQ 17
> [    8.328753] Intel ICH 0000:00:1f.5: setting latency timer to 64
> [    8.562047] DVB: Unable to find symbol stv090x_attach()
> [    8.562117] BUG: unable to handle kernel NULL pointer dereference at 000000ac
> [    8.562239] IP: [<e08b04a3>] dvb_frontend_detach+0x4/0x67 [dvb_core]
> 
> Ref http://bugs.debian.org/575207
> 
> Also clean up if we are unable to register the tuner and LNB drivers
> 
> Signed-off-by: Bjørn Mork <bjorn@xxxxxxx>
> Reported-by: Fladischer Michael <FladischerMichael@xxxxxxxx>
> ---
> This version should apply to to git://linuxtv.org/v4l-dvb.git master on
> top of commit 30b8f0787e51a3ab0c447e0e3bf4aadc7caf9ffd. 
> 
> It is otherwise identical to the v2 patch for the upstream and stable
> kernel repositories.
> 
> 
>  drivers/media/dvb/ttpci/budget.c |   56 ++++++++++++++++++++-----------------
>  1 files changed, 30 insertions(+), 26 deletions(-)
> 
> diff --git a/drivers/media/dvb/ttpci/budget.c b/drivers/media/dvb/ttpci/budget.c
> index fccb6ad..918679e 100644
> --- a/drivers/media/dvb/ttpci/budget.c
> +++ b/drivers/media/dvb/ttpci/budget.c
> @@ -628,32 +628,36 @@ static void frontend_init(struct budget *budget)
>  						 &tt1600_stv6110x_config,
>  						 &budget->i2c_adap);
>  
> -				tt1600_stv090x_config.tuner_init	  = ctl->tuner_init;
> -				tt1600_stv090x_config.tuner_sleep	  = ctl->tuner_sleep;
> -				tt1600_stv090x_config.tuner_set_mode	  = ctl->tuner_set_mode;
> -				tt1600_stv090x_config.tuner_set_frequency = ctl->tuner_set_frequency;
> -				tt1600_stv090x_config.tuner_get_frequency = ctl->tuner_get_frequency;
> -				tt1600_stv090x_config.tuner_set_bandwidth = ctl->tuner_set_bandwidth;
> -				tt1600_stv090x_config.tuner_get_bandwidth = ctl->tuner_get_bandwidth;
> -				tt1600_stv090x_config.tuner_set_bbgain	  = ctl->tuner_set_bbgain;
> -				tt1600_stv090x_config.tuner_get_bbgain	  = ctl->tuner_get_bbgain;
> -				tt1600_stv090x_config.tuner_set_refclk	  = ctl->tuner_set_refclk;
> -				tt1600_stv090x_config.tuner_get_status	  = ctl->tuner_get_status;
> -
> -				/* call the init function once to initialize
> -				   tuner's clock output divider and demod's
> -				   master clock */
> -				if (budget->dvb_frontend->ops.init)
> -					budget->dvb_frontend->ops.init(budget->dvb_frontend);
> -
> -				dvb_attach(isl6423_attach,
> -					budget->dvb_frontend,
> -					&budget->i2c_adap,
> -					&tt1600_isl6423_config);
> -
> -			} else {
> -				dvb_frontend_detach(budget->dvb_frontend);
> -				budget->dvb_frontend = NULL;
> +				if (ctl) {
> +					tt1600_stv090x_config.tuner_init	  = ctl->tuner_init;
> +					tt1600_stv090x_config.tuner_sleep	  = ctl->tuner_sleep;
> +					tt1600_stv090x_config.tuner_set_mode	  = ctl->tuner_set_mode;
> +					tt1600_stv090x_config.tuner_set_frequency = ctl->tuner_set_frequency;
> +					tt1600_stv090x_config.tuner_get_frequency = ctl->tuner_get_frequency;
> +					tt1600_stv090x_config.tuner_set_bandwidth = ctl->tuner_set_bandwidth;
> +					tt1600_stv090x_config.tuner_get_bandwidth = ctl->tuner_get_bandwidth;
> +					tt1600_stv090x_config.tuner_set_bbgain	  = ctl->tuner_set_bbgain;
> +					tt1600_stv090x_config.tuner_get_bbgain	  = ctl->tuner_get_bbgain;
> +					tt1600_stv090x_config.tuner_set_refclk	  = ctl->tuner_set_refclk;
> +					tt1600_stv090x_config.tuner_get_status	  = ctl->tuner_get_status;
> +
> +					/* call the init function once to initialize
> +					   tuner's clock output divider and demod's
> +					   master clock */
> +					if (budget->dvb_frontend->ops.init)
> +						budget->dvb_frontend->ops.init(budget->dvb_frontend);
> +
> +					if (dvb_attach(isl6423_attach,
> +						       budget->dvb_frontend,
> +						       &budget->i2c_adap,
> +						       &tt1600_isl6423_config) == NULL) {
> +						printk("%s: No Intersil ISL6423 found!\n", __func__);
> +						goto error_out;
> +					}
> +				} else {
> +					printk("%s: No STV6110(A) Silicon Tuner found!\n", __func__);
> +					goto error_out;
> +				}
>  			}
>  		}
>  		break;


Looks fine.

Acked-by: Oliver Endriss <o.endriss@xxxxxx>

CU
Oliver

-- 
----------------------------------------------------------------
VDR Remote Plugin 0.4.0: http://www.escape-edv.de/endriss/vdr/
4 MByte Mod: http://www.escape-edv.de/endriss/dvb-mem-mod/
Full-TS Mod: http://www.escape-edv.de/endriss/dvb-full-ts-mod/
----------------------------------------------------------------
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux