Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[media] dw2102: some missing unlocks on error

We recently introduced some new error paths but the unlocks are missing.
Fixes: 0065a79a8698 ('[media] dw2102: Don't use dynamic static allocation')

Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>

authored by

Dan Carpenter and committed by
Mauro Carvalho Chehab
324ed533 1cdbcc5d

+36 -16
+36 -16
drivers/media/usb/dvb-usb/dw2102.c
··· 292 292 static int dw2102_earda_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], int num) 293 293 { 294 294 struct dvb_usb_device *d = i2c_get_adapdata(adap); 295 + int ret; 295 296 296 297 if (!d) 297 298 return -ENODEV; ··· 308 307 if (2 + msg[1].len > sizeof(ibuf)) { 309 308 warn("i2c rd: len=%d is too big!\n", 310 309 msg[1].len); 311 - return -EOPNOTSUPP; 310 + ret = -EOPNOTSUPP; 311 + goto unlock; 312 312 } 313 313 314 314 obuf[0] = msg[0].addr << 1; ··· 333 331 if (2 + msg[0].len > sizeof(obuf)) { 334 332 warn("i2c wr: len=%d is too big!\n", 335 333 msg[1].len); 336 - return -EOPNOTSUPP; 334 + ret = -EOPNOTSUPP; 335 + goto unlock; 337 336 } 338 337 339 338 obuf[0] = msg[0].addr << 1; ··· 351 348 if (2 + msg[0].len > sizeof(obuf)) { 352 349 warn("i2c wr: len=%d is too big!\n", 353 350 msg[1].len); 354 - return -EOPNOTSUPP; 351 + ret = -EOPNOTSUPP; 352 + goto unlock; 355 353 } 356 354 357 355 obuf[0] = msg[0].addr << 1; ··· 381 377 382 378 break; 383 379 } 380 + ret = num; 384 381 382 + unlock: 385 383 mutex_unlock(&d->i2c_mutex); 386 - return num; 384 + return ret; 387 385 } 388 386 389 387 static int dw2104_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], int num) 390 388 { 391 389 struct dvb_usb_device *d = i2c_get_adapdata(adap); 392 - int len, i, j; 390 + int len, i, j, ret; 393 391 394 392 if (!d) 395 393 return -ENODEV; ··· 427 421 if (2 + msg[j].len > sizeof(ibuf)) { 428 422 warn("i2c rd: len=%d is too big!\n", 429 423 msg[j].len); 430 - return -EOPNOTSUPP; 424 + ret = -EOPNOTSUPP; 425 + goto unlock; 431 426 } 432 427 433 428 dw210x_op_rw(d->udev, 0xc3, ··· 464 457 if (2 + msg[j].len > sizeof(obuf)) { 465 458 warn("i2c wr: len=%d is too big!\n", 466 459 msg[j].len); 467 - return -EOPNOTSUPP; 460 + ret = -EOPNOTSUPP; 461 + goto unlock; 468 462 } 469 463 470 464 obuf[0] = msg[j].addr << 1; ··· 480 472 } 481 473 482 474 } 475 + ret = num; 483 476 477 + unlock: 484 478 mutex_unlock(&d->i2c_mutex); 485 - return num; 479 + return ret; 486 480 } 487 481 488 482 static int dw3101_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], 489 483 int num) 490 484 { 491 485 struct dvb_usb_device *d = i2c_get_adapdata(adap); 486 + int ret; 492 487 int i; 493 488 494 489 if (!d) ··· 508 497 if (2 + msg[1].len > sizeof(ibuf)) { 509 498 warn("i2c rd: len=%d is too big!\n", 510 499 msg[1].len); 511 - return -EOPNOTSUPP; 500 + ret = -EOPNOTSUPP; 501 + goto unlock; 512 502 } 513 503 obuf[0] = msg[0].addr << 1; 514 504 obuf[1] = msg[0].len; ··· 533 521 if (2 + msg[0].len > sizeof(obuf)) { 534 522 warn("i2c wr: len=%d is too big!\n", 535 523 msg[0].len); 536 - return -EOPNOTSUPP; 524 + ret = -EOPNOTSUPP; 525 + goto unlock; 537 526 } 538 527 obuf[0] = msg[0].addr << 1; 539 528 obuf[1] = msg[0].len; ··· 560 547 msg[i].flags == 0 ? ">>>" : "<<<"); 561 548 debug_dump(msg[i].buf, msg[i].len, deb_xfer); 562 549 } 550 + ret = num; 563 551 552 + unlock: 564 553 mutex_unlock(&d->i2c_mutex); 565 - return num; 554 + return ret; 566 555 } 567 556 568 557 static int s6x0_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[], ··· 572 557 { 573 558 struct dvb_usb_device *d = i2c_get_adapdata(adap); 574 559 struct usb_device *udev; 575 - int len, i, j; 560 + int len, i, j, ret; 576 561 577 562 if (!d) 578 563 return -ENODEV; ··· 624 609 if (msg[j].len > sizeof(ibuf)) { 625 610 warn("i2c rd: len=%d is too big!\n", 626 611 msg[j].len); 627 - return -EOPNOTSUPP; 612 + ret = -EOPNOTSUPP; 613 + goto unlock; 628 614 } 629 615 630 616 dw210x_op_rw(d->udev, 0x91, 0, 0, ··· 659 643 if (2 + msg[j].len > sizeof(obuf)) { 660 644 warn("i2c wr: len=%d is too big!\n", 661 645 msg[j].len); 662 - return -EOPNOTSUPP; 646 + ret = -EOPNOTSUPP; 647 + goto unlock; 663 648 } 664 649 665 650 obuf[0] = msg[j + 1].len; ··· 679 662 if (2 + msg[j].len > sizeof(obuf)) { 680 663 warn("i2c wr: len=%d is too big!\n", 681 664 msg[j].len); 682 - return -EOPNOTSUPP; 665 + ret = -EOPNOTSUPP; 666 + goto unlock; 683 667 } 684 668 obuf[0] = msg[j].len + 1; 685 669 obuf[1] = (msg[j].addr << 1); ··· 694 676 } 695 677 } 696 678 } 679 + ret = num; 697 680 681 + unlock: 698 682 mutex_unlock(&d->i2c_mutex); 699 - return num; 683 + return ret; 700 684 } 701 685 702 686 static int su3000_i2c_transfer(struct i2c_adapter *adap, struct i2c_msg msg[],