]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
media: dib0700: fix error handling in dib0700_i2c_xfer_legacy()
authorDan Carpenter <dan.carpenter@oracle.com>
Fri, 28 Apr 2017 12:53:31 +0000 (09:53 -0300)
committerMauro Carvalho Chehab <mchehab@s-opensource.com>
Sat, 24 Jun 2017 18:41:57 +0000 (15:41 -0300)
Mostly this adds some unlocks to error paths.  But, if you see where
there were "break;" statements before, I changed those paths to return
error codes instead of returning success.

Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
drivers/media/usb/dvb-usb/dib0700_core.c

index 4dea797188271a81cbea78b7d11df0eb73b94d47..bea1b4764a66773850387cf4b7acf8981848b324 100644 (file)
@@ -287,7 +287,7 @@ static int dib0700_i2c_xfer_legacy(struct i2c_adapter *adap,
 {
        struct dvb_usb_device *d = i2c_get_adapdata(adap);
        struct dib0700_state *st = d->priv;
-       int i,len;
+       int i, len, result;
 
        if (mutex_lock_interruptible(&d->i2c_mutex) < 0)
                return -EINTR;
@@ -304,7 +304,8 @@ static int dib0700_i2c_xfer_legacy(struct i2c_adapter *adap,
                if (msg[i].len > sizeof(st->buf) - 2) {
                        deb_info("i2c xfer to big: %d\n",
                                msg[i].len);
-                       return -EIO;
+                       result = -EIO;
+                       goto unlock;
                }
                memcpy(&st->buf[2], msg[i].buf, msg[i].len);
 
@@ -319,13 +320,15 @@ static int dib0700_i2c_xfer_legacy(struct i2c_adapter *adap,
                        if (len <= 0) {
                                deb_info("I2C read failed on address 0x%02x\n",
                                                msg[i].addr);
-                               break;
+                               result = -EIO;
+                               goto unlock;
                        }
 
                        if (msg[i + 1].len > sizeof(st->buf)) {
                                deb_info("i2c xfer buffer to small for %d\n",
                                        msg[i].len);
-                               return -EIO;
+                               result = -EIO;
+                               goto unlock;
                        }
                        memcpy(msg[i + 1].buf, st->buf, msg[i + 1].len);
 
@@ -334,14 +337,17 @@ static int dib0700_i2c_xfer_legacy(struct i2c_adapter *adap,
                        i++;
                } else {
                        st->buf[0] = REQUEST_I2C_WRITE;
-                       if (dib0700_ctrl_wr(d, st->buf, msg[i].len + 2) < 0)
-                               break;
+                       result = dib0700_ctrl_wr(d, st->buf, msg[i].len + 2);
+                       if (result < 0)
+                               goto unlock;
                }
        }
+       result = i;
+unlock:
        mutex_unlock(&d->usb_mutex);
        mutex_unlock(&d->i2c_mutex);
 
-       return i;
+       return result;
 }
 
 static int dib0700_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msg,