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;