Hi, tvaudio will oops for tda9874 chips when loaded with debug=1. Cause: tda9874a_STD defaults to -1. Oopses when used as array index. Fix: Sanitize parameters Regards, Gunther
--- bttv-0.7.105/driver/tvaudio.c Fri Jan 3 18:23:44 2003 +++ bttv07105/driver/tvaudio.c Sun Feb 16 12:34:14 2003 @@ -991,33 +991,39 @@ static int tda9874a_initialize(struct CHIPSTATE *chip) { - if(tda9874a_SIF != -1) { - if(tda9874a_SIF == 1) - tda9874a_GCONR = 0xc0; /* sound IF input 1 */ - else if(tda9874a_SIF == 2) - tda9874a_GCONR = 0xc1; /* sound IF input 2 */ - else - printk(KERN_WARNING "tda9874a: SIF parameter must be 1 or 2.\n"); + + dprintk("tda9874a_initialize\n"); + + if(tda9874a_SIF<1 || tda9874a_SIF>2) { + printk(KERN_WARNING "tda9874a_SIF parameter must be 1 or 2. Assuming 1.\n"); + tda9874a_SIF=1; + } + + if(tda9874a_SIF == 1) + tda9874a_GCONR = 0xc0; /* sound IF input 1 */ + else if(tda9874a_SIF == 2) + tda9874a_GCONR = 0xc1; /* sound IF input 2 */ + + if(tda9874a_STD<0 || tda9874a_STD>8) { + printk(KERN_WARNING "tda9874a_STD parameter must be between 0 and 8. Assuming 0.\n"); + tda9874a_STD=0; } - if(tda9874a_STD != -1) { - if((tda9874a_STD >= 0)&&(tda9874a_STD <= 8)) { - tda9874a_ESP = tda9874a_STD; - tda9874a_mode = (tda9874a_STD < 5) ? 0 : 1; - } else { - printk(KERN_WARNING "tda9874a: STD parameter must be between 0 and 8.\n"); - } + if((tda9874a_STD >= 0)&&(tda9874a_STD <= 8)) { + tda9874a_ESP = tda9874a_STD; + tda9874a_mode = (tda9874a_STD < 5) ? 0 : 1; } - if(tda9874a_AMSEL != -1) { - if(tda9874a_AMSEL == 0) - tda9874a_NCONR = 0x01; /* auto-mute: analog mono input */ - else if(tda9874a_AMSEL == 1) - tda9874a_NCONR = 0x05; /* auto-mute: 1st carrier FM or AM */ - else - printk(KERN_WARNING "tda9874a: AMSEL parameter must be 0 or 1.\n"); + if(tda9874a_AMSEL<0 || tda9874a_AMSEL>1) { + printk(KERN_WARNING "tda9874a: AMSEL parameter must be 0 or 1. Assuming 0\n"); + tda9874a_AMSEL=0; } + if(tda9874a_AMSEL == 0) + tda9874a_NCONR = 0x01; /* auto-mute: analog mono input */ + else if(tda9874a_AMSEL == 1) + tda9874a_NCONR = 0x05; /* auto-mute: 1st carrier FM or AM */ + tda9874a_setup(chip); return 0;