Browse Source

media: ddbridge: fix deinit order in case of failure in ddb_init()

In ddb_init(), the deinitialization sequence isn't correct when handling
errors, and could even lead to a memleak depending on where things failed.
Fix the deinit order.

Signed-off-by: Daniel Scheller <d.scheller@gmx.net>
Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
Daniel Scheller 7 years ago
parent
commit
b7b9a5a93b
1 changed files with 5 additions and 5 deletions
  1. 5 5
      drivers/media/pci/ddbridge/ddbridge-core.c

+ 5 - 5
drivers/media/pci/ddbridge/ddbridge-core.c

@@ -3279,7 +3279,7 @@ int ddb_init(struct ddb *dev)
 	ddb_init_boards(dev);
 	ddb_init_boards(dev);
 
 
 	if (ddb_i2c_init(dev) < 0)
 	if (ddb_i2c_init(dev) < 0)
-		goto fail;
+		goto fail1;
 	ddb_ports_init(dev);
 	ddb_ports_init(dev);
 	if (ddb_buffers_alloc(dev) < 0) {
 	if (ddb_buffers_alloc(dev) < 0) {
 		dev_info(dev->dev, "Could not allocate buffer memory\n");
 		dev_info(dev->dev, "Could not allocate buffer memory\n");
@@ -3297,14 +3297,14 @@ int ddb_init(struct ddb *dev)
 	return 0;
 	return 0;
 
 
 fail3:
 fail3:
-	ddb_ports_detach(dev);
 	dev_err(dev->dev, "fail3\n");
 	dev_err(dev->dev, "fail3\n");
-	ddb_ports_release(dev);
+	ddb_ports_detach(dev);
+	ddb_buffers_free(dev);
 fail2:
 fail2:
 	dev_err(dev->dev, "fail2\n");
 	dev_err(dev->dev, "fail2\n");
-	ddb_buffers_free(dev);
+	ddb_ports_release(dev);
 	ddb_i2c_release(dev);
 	ddb_i2c_release(dev);
-fail:
+fail1:
 	dev_err(dev->dev, "fail1\n");
 	dev_err(dev->dev, "fail1\n");
 	return -1;
 	return -1;
 }
 }