OSDN Git Service

[media] cx23885-dvb: Fix some issues at the DVB error handling
authorMauro Carvalho Chehab <mchehab@osg.samsung.com>
Thu, 30 Oct 2014 14:15:53 +0000 (11:15 -0300)
committerMauro Carvalho Chehab <mchehab@osg.samsung.com>
Mon, 3 Nov 2014 18:21:29 +0000 (16:21 -0200)
X-Patchwork-Delegate: m.chehab@samsung.com
As pointed by smatch:
drivers/media/pci/cx23885/cx23885-dvb.c:1066 dvb_register() error: we previously assumed 'fe0->dvb.frontend' could be null (see line 1060)
drivers/media/pci/cx23885/cx23885-dvb.c:1990 cx23885_dvb_register() error: we previously assumed 'fe0' could be null (see line 1975)

What happens is that the error handling logic when a frontend
register fails sometimes keep doing the work, as if it didn't
fail.

This could potentially cause an OOPS. So, simplify the logic
a little bit and return an error if frontend fails before
trying to setup VB2 queue.

Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>
drivers/media/pci/cx23885/cx23885-dvb.c

index 5e6caed..9da5cf3 100644 (file)
@@ -1058,11 +1058,11 @@ static int dvb_register(struct cx23885_tsport *port)
                fe0->dvb.frontend = dvb_attach(s5h1409_attach,
                                                &hauppauge_generic_config,
                                                &i2c_bus->i2c_adap);
-               if (fe0->dvb.frontend != NULL) {
-                       dvb_attach(mt2131_attach, fe0->dvb.frontend,
-                                  &i2c_bus->i2c_adap,
-                                  &hauppauge_generic_tunerconfig, 0);
-               }
+               if (fe0->dvb.frontend == NULL)
+                       break;
+               dvb_attach(mt2131_attach, fe0->dvb.frontend,
+                          &i2c_bus->i2c_adap,
+                          &hauppauge_generic_tunerconfig, 0);
                break;
        case CX23885_BOARD_HAUPPAUGE_HVR1270:
        case CX23885_BOARD_HAUPPAUGE_HVR1275:
@@ -1070,11 +1070,11 @@ static int dvb_register(struct cx23885_tsport *port)
                fe0->dvb.frontend = dvb_attach(lgdt3305_attach,
                                               &hauppauge_lgdt3305_config,
                                               &i2c_bus->i2c_adap);
-               if (fe0->dvb.frontend != NULL) {
-                       dvb_attach(tda18271_attach, fe0->dvb.frontend,
-                                  0x60, &dev->i2c_bus[1].i2c_adap,
-                                  &hauppauge_hvr127x_config);
-               }
+               if (fe0->dvb.frontend == NULL)
+                       break;
+               dvb_attach(tda18271_attach, fe0->dvb.frontend,
+                          0x60, &dev->i2c_bus[1].i2c_adap,
+                          &hauppauge_hvr127x_config);
                if (dev->board == CX23885_BOARD_HAUPPAUGE_HVR1275)
                        cx23885_set_frontend_hook(port, fe0->dvb.frontend);
                break;
@@ -1084,11 +1084,12 @@ static int dvb_register(struct cx23885_tsport *port)
                fe0->dvb.frontend = dvb_attach(s5h1411_attach,
                                               &hcw_s5h1411_config,
                                               &i2c_bus->i2c_adap);
-               if (fe0->dvb.frontend != NULL) {
-                       dvb_attach(tda18271_attach, fe0->dvb.frontend,
-                                  0x60, &dev->i2c_bus[1].i2c_adap,
-                                  &hauppauge_tda18271_config);
-               }
+               if (fe0->dvb.frontend == NULL)
+                       break;
+
+               dvb_attach(tda18271_attach, fe0->dvb.frontend,
+                          0x60, &dev->i2c_bus[1].i2c_adap,
+                          &hauppauge_tda18271_config);
 
                tda18271_attach(&dev->ts1.analog_fe,
                        0x60, &dev->i2c_bus[1].i2c_adap,
@@ -1103,14 +1104,15 @@ static int dvb_register(struct cx23885_tsport *port)
                                dvb_attach(s5h1409_attach,
                                           &hauppauge_ezqam_config,
                                           &i2c_bus->i2c_adap);
-                       if (fe0->dvb.frontend != NULL) {
-                               dvb_attach(tda829x_attach, fe0->dvb.frontend,
-                                          &dev->i2c_bus[1].i2c_adap, 0x42,
-                                          &tda829x_no_probe);
-                               dvb_attach(tda18271_attach, fe0->dvb.frontend,
-                                          0x60, &dev->i2c_bus[1].i2c_adap,
-                                          &hauppauge_tda18271_config);
-                       }
+                       if (fe0->dvb.frontend == NULL)
+                               break;
+
+                       dvb_attach(tda829x_attach, fe0->dvb.frontend,
+                                  &dev->i2c_bus[1].i2c_adap, 0x42,
+                                  &tda829x_no_probe);
+                       dvb_attach(tda18271_attach, fe0->dvb.frontend,
+                                  0x60, &dev->i2c_bus[1].i2c_adap,
+                                  &hauppauge_tda18271_config);
                        break;
                case 0:
                default:
@@ -1118,11 +1120,11 @@ static int dvb_register(struct cx23885_tsport *port)
                                dvb_attach(s5h1409_attach,
                                           &hauppauge_generic_config,
                                           &i2c_bus->i2c_adap);
-                       if (fe0->dvb.frontend != NULL)
-                               dvb_attach(mt2131_attach, fe0->dvb.frontend,
-                                          &i2c_bus->i2c_adap,
-                                          &hauppauge_generic_tunerconfig, 0);
-                       break;
+                       if (fe0->dvb.frontend == NULL)
+                               break;
+                       dvb_attach(mt2131_attach, fe0->dvb.frontend,
+                                  &i2c_bus->i2c_adap,
+                                  &hauppauge_generic_tunerconfig, 0);
                }
                break;
        case CX23885_BOARD_HAUPPAUGE_HVR1800lp:
@@ -1130,32 +1132,33 @@ static int dvb_register(struct cx23885_tsport *port)
                fe0->dvb.frontend = dvb_attach(s5h1409_attach,
                                                &hauppauge_hvr1800lp_config,
                                                &i2c_bus->i2c_adap);
-               if (fe0->dvb.frontend != NULL) {
-                       dvb_attach(mt2131_attach, fe0->dvb.frontend,
-                                  &i2c_bus->i2c_adap,
-                                  &hauppauge_generic_tunerconfig, 0);
-               }
+               if (fe0->dvb.frontend == NULL)
+                       break;
+               dvb_attach(mt2131_attach, fe0->dvb.frontend,
+                          &i2c_bus->i2c_adap,
+                          &hauppauge_generic_tunerconfig, 0);
                break;
        case CX23885_BOARD_DVICO_FUSIONHDTV_5_EXP:
                i2c_bus = &dev->i2c_bus[0];
                fe0->dvb.frontend = dvb_attach(lgdt330x_attach,
                                                &fusionhdtv_5_express,
                                                &i2c_bus->i2c_adap);
-               if (fe0->dvb.frontend != NULL) {
-                       dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
-                                  &i2c_bus->i2c_adap, 0x61,
-                                  TUNER_LG_TDVS_H06XF);
-               }
+               if (fe0->dvb.frontend == NULL)
+                       break;
+               dvb_attach(simple_tuner_attach, fe0->dvb.frontend,
+                          &i2c_bus->i2c_adap, 0x61,
+                          TUNER_LG_TDVS_H06XF);
                break;
        case CX23885_BOARD_HAUPPAUGE_HVR1500Q:
                i2c_bus = &dev->i2c_bus[1];
                fe0->dvb.frontend = dvb_attach(s5h1409_attach,
                                                &hauppauge_hvr1500q_config,
                                                &dev->i2c_bus[0].i2c_adap);
-               if (fe0->dvb.frontend != NULL)
-                       dvb_attach(xc5000_attach, fe0->dvb.frontend,
-                                  &i2c_bus->i2c_adap,
-                                  &hauppauge_hvr1500q_tunerconfig);
+               if (fe0->dvb.frontend == NULL)
+                       break;
+               dvb_attach(xc5000_attach, fe0->dvb.frontend,
+                          &i2c_bus->i2c_adap,
+                          &hauppauge_hvr1500q_tunerconfig);
                break;
        case CX23885_BOARD_HAUPPAUGE_HVR1500:
                i2c_bus = &dev->i2c_bus[1];
@@ -1186,14 +1189,14 @@ static int dvb_register(struct cx23885_tsport *port)
                fe0->dvb.frontend = dvb_attach(tda10048_attach,
                        &hauppauge_hvr1200_config,
                        &i2c_bus->i2c_adap);
-               if (fe0->dvb.frontend != NULL) {
-                       dvb_attach(tda829x_attach, fe0->dvb.frontend,
-                               &dev->i2c_bus[1].i2c_adap, 0x42,
-                               &tda829x_no_probe);
-                       dvb_attach(tda18271_attach, fe0->dvb.frontend,
-                               0x60, &dev->i2c_bus[1].i2c_adap,
-                               &hauppauge_hvr1200_tuner_config);
-               }
+               if (fe0->dvb.frontend == NULL)
+                       break;
+               dvb_attach(tda829x_attach, fe0->dvb.frontend,
+                          &dev->i2c_bus[1].i2c_adap, 0x42,
+                          &tda829x_no_probe);
+               dvb_attach(tda18271_attach, fe0->dvb.frontend,
+                          0x60, &dev->i2c_bus[1].i2c_adap,
+                          &hauppauge_hvr1200_tuner_config);
                break;
        case CX23885_BOARD_HAUPPAUGE_HVR1210:
                i2c_bus = &dev->i2c_bus[0];
@@ -1452,12 +1455,10 @@ static int dvb_register(struct cx23885_tsport *port)
                fe0->dvb.frontend = dvb_attach(lgs8gxx_attach,
                        &mygica_x8506_lgs8gl5_config,
                        &i2c_bus->i2c_adap);
-               if (fe0->dvb.frontend != NULL) {
-                       dvb_attach(xc5000_attach,
-                               fe0->dvb.frontend,
-                               &i2c_bus2->i2c_adap,
-                               &mygica_x8506_xc5000_config);
-               }
+               if (fe0->dvb.frontend == NULL)
+                       break;
+               dvb_attach(xc5000_attach, fe0->dvb.frontend,
+                          &i2c_bus2->i2c_adap, &mygica_x8506_xc5000_config);
                cx23885_set_frontend_hook(port, fe0->dvb.frontend);
                break;
        case CX23885_BOARD_MYGICA_X8507:
@@ -1466,12 +1467,12 @@ static int dvb_register(struct cx23885_tsport *port)
                fe0->dvb.frontend = dvb_attach(mb86a20s_attach,
                        &mygica_x8507_mb86a20s_config,
                        &i2c_bus->i2c_adap);
-               if (fe0->dvb.frontend != NULL) {
-                       dvb_attach(xc5000_attach,
-                       fe0->dvb.frontend,
-                       &i2c_bus2->i2c_adap,
-                       &mygica_x8507_xc5000_config);
-               }
+               if (fe0->dvb.frontend == NULL)
+                       break;
+
+               dvb_attach(xc5000_attach, fe0->dvb.frontend,
+                          &i2c_bus2->i2c_adap,
+                          &mygica_x8507_xc5000_config);
                cx23885_set_frontend_hook(port, fe0->dvb.frontend);
                break;
        case CX23885_BOARD_MAGICPRO_PROHDTVE2:
@@ -1480,12 +1481,11 @@ static int dvb_register(struct cx23885_tsport *port)
                fe0->dvb.frontend = dvb_attach(lgs8gxx_attach,
                        &magicpro_prohdtve2_lgs8g75_config,
                        &i2c_bus->i2c_adap);
-               if (fe0->dvb.frontend != NULL) {
-                       dvb_attach(xc5000_attach,
-                               fe0->dvb.frontend,
-                               &i2c_bus2->i2c_adap,
-                               &magicpro_prohdtve2_xc5000_config);
-               }
+               if (fe0->dvb.frontend == NULL)
+                       break;
+               dvb_attach(xc5000_attach, fe0->dvb.frontend,
+                          &i2c_bus2->i2c_adap,
+                          &magicpro_prohdtve2_xc5000_config);
                cx23885_set_frontend_hook(port, fe0->dvb.frontend);
                break;
        case CX23885_BOARD_HAUPPAUGE_HVR1850:
@@ -1493,10 +1493,11 @@ static int dvb_register(struct cx23885_tsport *port)
                fe0->dvb.frontend = dvb_attach(s5h1411_attach,
                        &hcw_s5h1411_config,
                        &i2c_bus->i2c_adap);
-               if (fe0->dvb.frontend != NULL)
-                       dvb_attach(tda18271_attach, fe0->dvb.frontend,
-                               0x60, &dev->i2c_bus[0].i2c_adap,
-                               &hauppauge_tda18271_config);
+               if (fe0->dvb.frontend == NULL)
+                       break;
+               dvb_attach(tda18271_attach, fe0->dvb.frontend,
+                          0x60, &dev->i2c_bus[0].i2c_adap,
+                          &hauppauge_tda18271_config);
 
                tda18271_attach(&dev->ts1.analog_fe,
                        0x60, &dev->i2c_bus[1].i2c_adap,
@@ -1508,10 +1509,11 @@ static int dvb_register(struct cx23885_tsport *port)
                fe0->dvb.frontend = dvb_attach(s5h1411_attach,
                        &hcw_s5h1411_config,
                        &i2c_bus->i2c_adap);
-               if (fe0->dvb.frontend != NULL)
-                       dvb_attach(tda18271_attach, fe0->dvb.frontend,
-                               0x60, &dev->i2c_bus[0].i2c_adap,
-                               &hauppauge_tda18271_config);
+               if (fe0->dvb.frontend == NULL)
+                       break;
+               dvb_attach(tda18271_attach, fe0->dvb.frontend,
+                          0x60, &dev->i2c_bus[0].i2c_adap,
+                          &hauppauge_tda18271_config);
                break;
        case CX23885_BOARD_MYGICA_X8558PRO:
                switch (port->nr) {
@@ -1521,12 +1523,11 @@ static int dvb_register(struct cx23885_tsport *port)
                        fe0->dvb.frontend = dvb_attach(atbm8830_attach,
                                &mygica_x8558pro_atbm8830_cfg1,
                                &i2c_bus->i2c_adap);
-                       if (fe0->dvb.frontend != NULL) {
-                               dvb_attach(max2165_attach,
-                                       fe0->dvb.frontend,
-                                       &i2c_bus->i2c_adap,
-                                       &mygic_x8558pro_max2165_cfg1);
-                       }
+                       if (fe0->dvb.frontend == NULL)
+                               break;
+                       dvb_attach(max2165_attach, fe0->dvb.frontend,
+                                  &i2c_bus->i2c_adap,
+                                  &mygic_x8558pro_max2165_cfg1);
                        break;
                /* port C */
                case 2:
@@ -1534,13 +1535,11 @@ static int dvb_register(struct cx23885_tsport *port)
                        fe0->dvb.frontend = dvb_attach(atbm8830_attach,
                                &mygica_x8558pro_atbm8830_cfg2,
                                &i2c_bus->i2c_adap);
-                       if (fe0->dvb.frontend != NULL) {
-                               dvb_attach(max2165_attach,
-                                       fe0->dvb.frontend,
-                                       &i2c_bus->i2c_adap,
-                                       &mygic_x8558pro_max2165_cfg2);
-                       }
-                       break;
+                       if (fe0->dvb.frontend == NULL)
+                               break;
+                       dvb_attach(max2165_attach, fe0->dvb.frontend,
+                                  &i2c_bus->i2c_adap,
+                                  &mygic_x8558pro_max2165_cfg2);
                }
                break;
        case CX23885_BOARD_NETUP_DUAL_DVB_T_C_CI_RF:
@@ -1552,15 +1551,15 @@ static int dvb_register(struct cx23885_tsport *port)
                fe0->dvb.frontend = dvb_attach(stv0367ter_attach,
                                        &netup_stv0367_config[port->nr - 1],
                                        &i2c_bus->i2c_adap);
-               if (fe0->dvb.frontend != NULL) {
-                       if (NULL == dvb_attach(xc5000_attach,
-                                       fe0->dvb.frontend,
+               if (fe0->dvb.frontend == NULL)
+                       break;
+               if (NULL == dvb_attach(xc5000_attach, fe0->dvb.frontend,
                                        &i2c_bus->i2c_adap,
                                        &netup_xc5000_config[port->nr - 1]))
-                               goto frontend_detach;
-                       /* load xc5000 firmware */
-                       fe0->dvb.frontend->ops.tuner_ops.init(fe0->dvb.frontend);
-               }
+                       goto frontend_detach;
+               /* load xc5000 firmware */
+               fe0->dvb.frontend->ops.tuner_ops.init(fe0->dvb.frontend);
+
                /* MFE frontend 2 */
                fe1 = vb2_dvb_get_frontend(&port->frontends, 2);
                if (fe1 == NULL)
@@ -1569,14 +1568,15 @@ static int dvb_register(struct cx23885_tsport *port)
                fe1->dvb.frontend = dvb_attach(stv0367cab_attach,
                                        &netup_stv0367_config[port->nr - 1],
                                        &i2c_bus->i2c_adap);
-               if (fe1->dvb.frontend != NULL) {
-                       fe1->dvb.frontend->id = 1;
-                       if (NULL == dvb_attach(xc5000_attach,
-                                       fe1->dvb.frontend,
-                                       &i2c_bus->i2c_adap,
-                                       &netup_xc5000_config[port->nr - 1]))
-                               goto frontend_detach;
-               }
+               if (fe1->dvb.frontend == NULL)
+                       break;
+
+               fe1->dvb.frontend->id = 1;
+               if (NULL == dvb_attach(xc5000_attach,
+                                      fe1->dvb.frontend,
+                                      &i2c_bus->i2c_adap,
+                                      &netup_xc5000_config[port->nr - 1]))
+                       goto frontend_detach;
                break;
        case CX23885_BOARD_TERRATEC_CINERGY_T_PCIE_DUAL:
                i2c_bus = &dev->i2c_bus[0];
@@ -1588,26 +1588,26 @@ static int dvb_register(struct cx23885_tsport *port)
                        fe0->dvb.frontend = dvb_attach(drxk_attach,
                                        &terratec_drxk_config[0],
                                        &i2c_bus->i2c_adap);
-                       if (fe0->dvb.frontend != NULL) {
-                               if (!dvb_attach(mt2063_attach,
-                                               fe0->dvb.frontend,
-                                               &terratec_mt2063_config[0],
-                                               &i2c_bus2->i2c_adap))
-                                       goto frontend_detach;
-                       }
+                       if (fe0->dvb.frontend == NULL)
+                               break;
+                       if (!dvb_attach(mt2063_attach,
+                                       fe0->dvb.frontend,
+                                       &terratec_mt2063_config[0],
+                                       &i2c_bus2->i2c_adap))
+                               goto frontend_detach;
                        break;
                /* port c */
                case 2:
                        fe0->dvb.frontend = dvb_attach(drxk_attach,
                                        &terratec_drxk_config[1],
                                        &i2c_bus->i2c_adap);
-                       if (fe0->dvb.frontend != NULL) {
-                               if (!dvb_attach(mt2063_attach,
-                                               fe0->dvb.frontend,
-                                               &terratec_mt2063_config[1],
-                                               &i2c_bus2->i2c_adap))
-                                       goto frontend_detach;
-                       }
+                       if (fe0->dvb.frontend == NULL)
+                               break;
+                       if (!dvb_attach(mt2063_attach,
+                                       fe0->dvb.frontend,
+                                       &terratec_mt2063_config[1],
+                                       &i2c_bus2->i2c_adap))
+                               goto frontend_detach;
                        break;
                }
                break;
@@ -1617,10 +1617,10 @@ static int dvb_register(struct cx23885_tsport *port)
                fe0->dvb.frontend = dvb_attach(ds3000_attach,
                                        &tevii_ds3000_config,
                                        &i2c_bus->i2c_adap);
-               if (fe0->dvb.frontend != NULL) {
-                       dvb_attach(ts2020_attach, fe0->dvb.frontend,
-                               &tevii_ts2020_config, &i2c_bus->i2c_adap);
-               }
+               if (fe0->dvb.frontend == NULL)
+                       break;
+               dvb_attach(ts2020_attach, fe0->dvb.frontend,
+                          &tevii_ts2020_config, &i2c_bus->i2c_adap);
                break;
        case CX23885_BOARD_PROF_8000:
                i2c_bus = &dev->i2c_bus[0];
@@ -1629,15 +1629,15 @@ static int dvb_register(struct cx23885_tsport *port)
                                                &prof_8000_stv090x_config,
                                                &i2c_bus->i2c_adap,
                                                STV090x_DEMODULATOR_0);
-               if (fe0->dvb.frontend != NULL) {
-                       if (!dvb_attach(stb6100_attach,
-                                       fe0->dvb.frontend,
-                                       &prof_8000_stb6100_config,
-                                       &i2c_bus->i2c_adap))
-                               goto frontend_detach;
+               if (fe0->dvb.frontend == NULL)
+                       break;
+               if (!dvb_attach(stb6100_attach,
+                               fe0->dvb.frontend,
+                               &prof_8000_stb6100_config,
+                               &i2c_bus->i2c_adap))
+                       goto frontend_detach;
 
-                       fe0->dvb.frontend->ops.set_voltage = p8000_set_voltage;
-               }
+               fe0->dvb.frontend->ops.set_voltage = p8000_set_voltage;
                break;
        case CX23885_BOARD_HAUPPAUGE_HVR4400:
                i2c_bus = &dev->i2c_bus[0];
@@ -1648,26 +1648,26 @@ static int dvb_register(struct cx23885_tsport *port)
                        fe0->dvb.frontend = dvb_attach(tda10071_attach,
                                                &hauppauge_tda10071_config,
                                                &i2c_bus->i2c_adap);
-                       if (fe0->dvb.frontend != NULL) {
-                               if (!dvb_attach(a8293_attach, fe0->dvb.frontend,
-                                               &i2c_bus->i2c_adap,
-                                               &hauppauge_a8293_config))
-                                       goto frontend_detach;
-                       }
+                       if (fe0->dvb.frontend == NULL)
+                               break;
+                       if (!dvb_attach(a8293_attach, fe0->dvb.frontend,
+                                       &i2c_bus->i2c_adap,
+                                       &hauppauge_a8293_config))
+                               goto frontend_detach;
                        break;
                /* port c */
                case 2:
                        fe0->dvb.frontend = dvb_attach(si2165_attach,
                                        &hauppauge_hvr4400_si2165_config,
                                        &i2c_bus->i2c_adap);
-                       if (fe0->dvb.frontend != NULL) {
-                               fe0->dvb.frontend->ops.i2c_gate_ctrl = NULL;
-                               if (!dvb_attach(tda18271_attach,
-                                               fe0->dvb.frontend,
-                                               0x60, &i2c_bus2->i2c_adap,
-                                         &hauppauge_hvr4400_tuner_config))
-                                       goto frontend_detach;
-                       }
+                       if (fe0->dvb.frontend == NULL)
+                               break;
+                       fe0->dvb.frontend->ops.i2c_gate_ctrl = NULL;
+                       if (!dvb_attach(tda18271_attach,
+                                       fe0->dvb.frontend,
+                                       0x60, &i2c_bus2->i2c_adap,
+                                 &hauppauge_hvr4400_tuner_config))
+                               goto frontend_detach;
                        break;
                }
                break;
@@ -2032,7 +2032,7 @@ int cx23885_dvb_register(struct cx23885_tsport *port)
 
                fe0 = vb2_dvb_get_frontend(&port->frontends, i);
                if (!fe0)
-                       err = -EINVAL;
+                       return -EINVAL;
 
                dprintk(1, "%s\n", __func__);
                dprintk(1, " ->probed by Card=%d Name=%s, PCI %02x:%02x\n",