You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by ma...@apache.org on 2022/10/17 06:59:56 UTC
[incubator-nuttx] 03/03: drivers: Destroy mutex and sem in the error path
This is an automated email from the ASF dual-hosted git repository.
masayuki pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit dca5a3483f2e2f8223e6b80ea3872ba5682a20fd
Author: Xiang Xiao <xi...@xiaomi.com>
AuthorDate: Mon Oct 17 00:50:59 2022 +0800
drivers: Destroy mutex and sem in the error path
also correct the order to ensure the memory free is last step
Signed-off-by: Xiang Xiao <xi...@xiaomi.com>
---
drivers/can/mcp2515.c | 2 ++
drivers/i2c/i2c_driver.c | 3 +++
drivers/i2s/i2schar.c | 1 +
drivers/input/cypress_mbr3108.c | 1 +
drivers/input/stmpe811_base.c | 1 +
drivers/lcd/ft80x.c | 1 +
drivers/lcd/ht16k33_14seg.c | 1 +
drivers/lcd/pcf8574_lcd_backpack.c | 1 +
drivers/lcd/st7032.c | 1 +
drivers/leds/ws2812.c | 1 +
drivers/sensors/adxl345_base.c | 1 +
drivers/sensors/aht10.c | 2 ++
drivers/sensors/bmg160.c | 4 +++-
drivers/sensors/dhtxx.c | 1 +
drivers/sensors/hc_sr04.c | 1 +
drivers/sensors/hdc1008.c | 1 +
drivers/sensors/hts221.c | 4 +++-
drivers/sensors/kxtj9.c | 1 +
drivers/sensors/lis3dh.c | 2 +-
drivers/sensors/lis3dsh.c | 4 +++-
drivers/sensors/lis3mdl.c | 8 +++++---
drivers/sensors/lps25h.c | 4 +++-
drivers/sensors/max44009.c | 1 +
drivers/sensors/mlx90393.c | 8 +++++---
drivers/sensors/ms5611.c | 3 +++
drivers/sensors/scd30.c | 1 +
drivers/sensors/scd41.c | 1 +
drivers/sensors/sgp30.c | 1 +
drivers/sensors/sht21.c | 1 +
drivers/sensors/sht3x.c | 1 +
drivers/sensors/sps30.c | 1 +
drivers/sensors/t67xx.c | 1 +
drivers/spi/spi_driver.c | 3 +++
drivers/spi/spi_slave_driver.c | 1 +
drivers/syslog/ramlog.c | 4 ++++
drivers/usbdev/adb.c | 1 +
drivers/video/video.c | 1 +
drivers/wireless/cc1101.c | 8 ++++++--
drivers/wireless/gs2200m.c | 13 +++++++------
drivers/wireless/nrf24l01.c | 12 +++++++++---
drivers/wireless/spirit/drivers/spirit_netdev.c | 20 +++++++++++---------
fs/nfs/nfs_vfsops.c | 18 +++++++++---------
fs/nxffs/nxffs_initialize.c | 1 +
wireless/ieee802154/mac802154_device.c | 6 +-----
wireless/ieee802154/mac802154_netdev.c | 1 +
45 files changed, 109 insertions(+), 45 deletions(-)
diff --git a/drivers/can/mcp2515.c b/drivers/can/mcp2515.c
index 3821648331..645c9fd1c8 100644
--- a/drivers/can/mcp2515.c
+++ b/drivers/can/mcp2515.c
@@ -2541,6 +2541,8 @@ FAR struct mcp2515_can_s *
if (canctrl != DEFAULT_CANCTRL_CONFMODE)
{
canerr("ERROR: CANCTRL = 0x%02X ! It should be 0x87\n", canctrl);
+ nxmutex_destroy(&priv->lock);
+ kmm_free(priv);
return NULL;
}
diff --git a/drivers/i2c/i2c_driver.c b/drivers/i2c/i2c_driver.c
index 245558364d..5a7c4c9f3b 100644
--- a/drivers/i2c/i2c_driver.c
+++ b/drivers/i2c/i2c_driver.c
@@ -394,6 +394,9 @@ int i2c_register(FAR struct i2c_master_s *i2c, int bus)
* device.
*/
+#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
+ nxmutex_destroy(&priv->lock);
+#endif
kmm_free(priv);
return ret;
}
diff --git a/drivers/i2s/i2schar.c b/drivers/i2s/i2schar.c
index dbd86e374d..0f0c0a971c 100644
--- a/drivers/i2s/i2schar.c
+++ b/drivers/i2s/i2schar.c
@@ -436,6 +436,7 @@ int i2schar_register(FAR struct i2s_dev_s *i2s, int minor)
* device.
*/
+ nxmutex_destroy(&priv->lock);
kmm_free(priv);
return ret;
}
diff --git a/drivers/input/cypress_mbr3108.c b/drivers/input/cypress_mbr3108.c
index 9f05cf2d1b..2fe4b6b584 100644
--- a/drivers/input/cypress_mbr3108.c
+++ b/drivers/input/cypress_mbr3108.c
@@ -1112,6 +1112,7 @@ int cypress_mbr3108_register(FAR const char *devpath,
ret = register_driver(devpath, &g_mbr3108_fileops, 0666, priv);
if (ret < 0)
{
+ nxmutex_destroy(&priv->devlock);
kmm_free(priv);
mbr3108_dbg("Error occurred during the driver registering\n");
return ret;
diff --git a/drivers/input/stmpe811_base.c b/drivers/input/stmpe811_base.c
index 6618414c4d..0a092ab716 100644
--- a/drivers/input/stmpe811_base.c
+++ b/drivers/input/stmpe811_base.c
@@ -302,6 +302,7 @@ STMPE811_HANDLE stmpe811_instantiate(FAR struct i2c_master_s *dev,
ret = stmpe811_checkid(priv);
if (ret < 0)
{
+ nxmutex_destroy(&priv->lock);
#ifdef CONFIG_STMPE811_MULTIPLE
g_stmpe811list = priv->flink;
kmm_free(priv);
diff --git a/drivers/lcd/ft80x.c b/drivers/lcd/ft80x.c
index de957c284a..7f1f37875f 100644
--- a/drivers/lcd/ft80x.c
+++ b/drivers/lcd/ft80x.c
@@ -1580,6 +1580,7 @@ errout_with_interrupts:
errout_with_lock:
nxmutex_destroy(&priv->lock);
+ kmm_free(priv);
return ret;
}
diff --git a/drivers/lcd/ht16k33_14seg.c b/drivers/lcd/ht16k33_14seg.c
index 24ad7bcbc7..cf6a407e3b 100644
--- a/drivers/lcd/ht16k33_14seg.c
+++ b/drivers/lcd/ht16k33_14seg.c
@@ -1134,6 +1134,7 @@ int ht16k33_register(int devno, FAR struct i2c_master_s *i2c)
if (ret < 0)
{
snerr("ERROR: Failed to register driver: %d\n", ret);
+ nxmutex_destroy(&priv->lock);
kmm_free(priv);
}
diff --git a/drivers/lcd/pcf8574_lcd_backpack.c b/drivers/lcd/pcf8574_lcd_backpack.c
index 358995111c..6f697d6600 100644
--- a/drivers/lcd/pcf8574_lcd_backpack.c
+++ b/drivers/lcd/pcf8574_lcd_backpack.c
@@ -1664,6 +1664,7 @@ int pcf8574_lcd_backpack_register(FAR const char *devpath,
if (ret < 0)
{
lcdinfo("Failed to register driver: %d\n", ret);
+ nxmutex_destroy(&priv->lock);
kmm_free(priv);
}
diff --git a/drivers/lcd/st7032.c b/drivers/lcd/st7032.c
index 5278952006..da513d9b8e 100644
--- a/drivers/lcd/st7032.c
+++ b/drivers/lcd/st7032.c
@@ -1060,6 +1060,7 @@ int st7032_register(FAR const char *devpath, FAR struct i2c_master_s *i2c)
if (ret < 0)
{
snerr("ERROR: Failed to register driver: %d\n", ret);
+ nxmutex_destroy(&priv->lock);
kmm_free(priv);
}
diff --git a/drivers/leds/ws2812.c b/drivers/leds/ws2812.c
index a73aad728a..22149d7870 100644
--- a/drivers/leds/ws2812.c
+++ b/drivers/leds/ws2812.c
@@ -696,6 +696,7 @@ int ws2812_leds_register(FAR const char *devpath, FAR struct spi_dev_s *spi,
if (ret < 0)
{
lederr("ERROR: Failed to register driver: %d\n", ret);
+ nxmutex_destroy(&priv->lock);
kmm_free(priv->tx_buf);
kmm_free(priv);
}
diff --git a/drivers/sensors/adxl345_base.c b/drivers/sensors/adxl345_base.c
index 0ec8c9b922..1a5ea790bb 100644
--- a/drivers/sensors/adxl345_base.c
+++ b/drivers/sensors/adxl345_base.c
@@ -389,6 +389,7 @@ ADXL345_HANDLE adxl345_instantiate(FAR struct i2c_master_s *dev,
if (ret < 0)
{
snerr("ERROR: Wrong Device ID!\n");
+ nxmutex_destroy(&priv->lock);
kmm_free(priv);
return NULL;
}
diff --git a/drivers/sensors/aht10.c b/drivers/sensors/aht10.c
index ac0ed3bc01..8b79b3deac 100644
--- a/drivers/sensors/aht10.c
+++ b/drivers/sensors/aht10.c
@@ -606,6 +606,7 @@ int aht10_register(FAR const char *devpath, FAR struct i2c_master_s *i2c,
if (ret < 0)
{
snerr("ERROR: Failed to initialize AHT10: %d\n", ret);
+ nxmutex_destroy(&priv->devlock);
kmm_free(priv);
return ret;
}
@@ -616,6 +617,7 @@ int aht10_register(FAR const char *devpath, FAR struct i2c_master_s *i2c,
if (ret < 0)
{
snerr("ERROR: Failed to register driver: %d\n", ret);
+ nxmutex_destroy(&priv->devlock);
kmm_free(priv);
}
diff --git a/drivers/sensors/bmg160.c b/drivers/sensors/bmg160.c
index 59af4e863f..2ccc972295 100644
--- a/drivers/sensors/bmg160.c
+++ b/drivers/sensors/bmg160.c
@@ -542,6 +542,8 @@ int bmg160_register(FAR const char *devpath, FAR struct spi_dev_s *spi,
if (ret < 0)
{
snerr("ERROR: Failed to attach interrupt\n");
+ nxmutex_destroy(&priv->datalock);
+ kmm_free(priv);
return ret;
}
@@ -551,8 +553,8 @@ int bmg160_register(FAR const char *devpath, FAR struct spi_dev_s *spi,
if (ret < 0)
{
snerr("ERROR: Failed to register driver: %d\n", ret);
- kmm_free(priv);
nxmutex_destroy(&priv->datalock);
+ kmm_free(priv);
return ret;
}
diff --git a/drivers/sensors/dhtxx.c b/drivers/sensors/dhtxx.c
index adf087d464..6706e34790 100644
--- a/drivers/sensors/dhtxx.c
+++ b/drivers/sensors/dhtxx.c
@@ -568,6 +568,7 @@ int dhtxx_register(FAR const char *devpath,
ret = register_driver(devpath, &g_dhtxxfops, 0666, priv);
if (ret < 0)
{
+ nxmutex_destroy(&priv->devlock);
kmm_free(priv);
snerr("ERROR: Failed to register driver: %d\n", ret);
}
diff --git a/drivers/sensors/hc_sr04.c b/drivers/sensors/hc_sr04.c
index 86835db10b..45291fa18e 100644
--- a/drivers/sensors/hc_sr04.c
+++ b/drivers/sensors/hc_sr04.c
@@ -422,6 +422,7 @@ int hcsr04_register(FAR const char *devpath,
ret = register_driver(devpath, &g_hcsr04ops, 0666, priv);
if (ret < 0)
{
+ nxmutex_destroy(&priv->devlock);
kmm_free(priv);
hcsr04_dbg("Error occurred during the driver registering = %d\n", ret);
return ret;
diff --git a/drivers/sensors/hdc1008.c b/drivers/sensors/hdc1008.c
index 0a995cb09a..b6a78277dc 100644
--- a/drivers/sensors/hdc1008.c
+++ b/drivers/sensors/hdc1008.c
@@ -969,6 +969,7 @@ int hdc1008_register(FAR const char *devpath, FAR struct i2c_master_s *i2c,
snerr("ERROR: Failed to register driver: %d\n", ret);
nxmutex_destroy(&priv->devlock);
kmm_free(priv);
+ return ret;
}
sninfo("driver registered\n");
diff --git a/drivers/sensors/hts221.c b/drivers/sensors/hts221.c
index 6e6ca68d34..71f0c16634 100644
--- a/drivers/sensors/hts221.c
+++ b/drivers/sensors/hts221.c
@@ -1176,9 +1176,10 @@ int hts221_register(FAR const char *devpath, FAR struct i2c_master_s *i2c,
ret = hts221_load_calibration_data(priv);
if (ret < 0)
{
+ nxmutex_destroy(&priv->devlock);
kmm_free(priv);
hts221_dbg("Cannot calibrate hts221 sensor\n");
- return -EAGAIN;
+ return ret;
}
ret = register_driver(devpath, &g_humidityops, 0666, priv);
@@ -1187,6 +1188,7 @@ int hts221_register(FAR const char *devpath, FAR struct i2c_master_s *i2c,
if (ret < 0)
{
+ nxmutex_destroy(&priv->devlock);
kmm_free(priv);
hts221_dbg("Error occurred during the driver registering\n");
return ret;
diff --git a/drivers/sensors/kxtj9.c b/drivers/sensors/kxtj9.c
index 0f8e130295..2bdc5ec0a5 100644
--- a/drivers/sensors/kxtj9.c
+++ b/drivers/sensors/kxtj9.c
@@ -636,6 +636,7 @@ int kxtj9_register(FAR const char *devpath, FAR struct i2c_master_s *i2c,
if (ret < 0)
{
snerr("ERROR: Failed to register driver: %d\n", ret);
+ nxmutex_destroy(&priv->lock);
kmm_free(priv);
return ret;
}
diff --git a/drivers/sensors/lis3dh.c b/drivers/sensors/lis3dh.c
index c7bf2641cb..25ba08d336 100644
--- a/drivers/sensors/lis3dh.c
+++ b/drivers/sensors/lis3dh.c
@@ -984,9 +984,9 @@ int lis3dh_register(FAR const char *devpath, FAR struct spi_dev_s *spi,
if (ret < 0)
{
snerr("ERROR: Failed to register driver: %d\n", ret);
- kmm_free(priv);
nxmutex_destroy(&priv->queuelock);
nxsem_destroy(&priv->readsem);
+ kmm_free(priv);
return ret;
}
diff --git a/drivers/sensors/lis3dsh.c b/drivers/sensors/lis3dsh.c
index 6c0dbe1d0d..5ce9371f3f 100644
--- a/drivers/sensors/lis3dsh.c
+++ b/drivers/sensors/lis3dsh.c
@@ -552,8 +552,8 @@ int lis3dsh_register(FAR const char *devpath, FAR struct spi_dev_s *spi,
if (ret < 0)
{
snerr("ERROR: Failed to register driver: %d\n", ret);
- kmm_free(priv);
nxmutex_destroy(&priv->datalock);
+ kmm_free(priv);
return ret;
}
@@ -571,6 +571,8 @@ int lis3dsh_register(FAR const char *devpath, FAR struct spi_dev_s *spi,
if (ret < 0)
{
snerr("ERROR: Failed to attach interrupt: %d\n", ret);
+ nxmutex_destroy(&priv->datalock);
+ kmm_free(priv);
return ret;
}
diff --git a/drivers/sensors/lis3mdl.c b/drivers/sensors/lis3mdl.c
index 2acaa4c99e..f4319b914d 100644
--- a/drivers/sensors/lis3mdl.c
+++ b/drivers/sensors/lis3mdl.c
@@ -598,7 +598,9 @@ int lis3mdl_register(FAR const char *devpath, FAR struct spi_dev_s *spi,
if (ret < 0)
{
snerr("ERROR: Failed to attach interrupt\n");
- return -ENODEV;
+ nxmutex_destroy(&priv->datalock);
+ kmm_free(priv);
+ return ret;
}
/* Register the character driver */
@@ -607,9 +609,9 @@ int lis3mdl_register(FAR const char *devpath, FAR struct spi_dev_s *spi,
if (ret < 0)
{
snerr("ERROR: Failed to register driver: %d\n", ret);
- kmm_free(priv);
nxmutex_destroy(&priv->datalock);
- return -ENODEV;
+ kmm_free(priv);
+ return ret;
}
/* Since we support multiple LIS3MDL devices are supported, we will need to
diff --git a/drivers/sensors/lps25h.c b/drivers/sensors/lps25h.c
index 1cabb33f87..164d474cd2 100644
--- a/drivers/sensors/lps25h.c
+++ b/drivers/sensors/lps25h.c
@@ -768,9 +768,11 @@ int lps25h_register(FAR const char *devpath, FAR struct i2c_master_s *i2c,
if (ret < 0)
{
+ nxmutex_destroy(&dev->devlock);
+ nxsem_destroy(&dev->waitsem);
kmm_free(dev);
lps25h_dbg("Error occurred during the driver registering\n");
- return ERROR;
+ return ret;
}
dev->config->irq_attach(config, lps25h_int_handler, dev);
diff --git a/drivers/sensors/max44009.c b/drivers/sensors/max44009.c
index 194216dfac..fcbe397b9d 100644
--- a/drivers/sensors/max44009.c
+++ b/drivers/sensors/max44009.c
@@ -896,6 +896,7 @@ int max44009_register(FAR const char *devpath, FAR struct i2c_master_s *i2c,
max44009_dbg("Registered with %d\n", ret);
if (ret < 0)
{
+ nxmutex_destroy(&priv->dev_lock);
kmm_free(priv);
max44009_dbg("Error occurred during the driver registering\n");
return ret;
diff --git a/drivers/sensors/mlx90393.c b/drivers/sensors/mlx90393.c
index 6742ef8f73..8ac2425247 100644
--- a/drivers/sensors/mlx90393.c
+++ b/drivers/sensors/mlx90393.c
@@ -576,7 +576,9 @@ int mlx90393_register(FAR const char *devpath, FAR struct spi_dev_s *spi,
if (ret < 0)
{
snerr("ERROR: Failed to attach interrupt\n");
- return -ENODEV;
+ nxmutex_destroy(&priv->datalock);
+ kmm_free(priv);
+ return ret;
}
/* Register the character driver */
@@ -585,9 +587,9 @@ int mlx90393_register(FAR const char *devpath, FAR struct spi_dev_s *spi,
if (ret < 0)
{
snerr("ERROR: Failed to register driver: %d\n", ret);
- kmm_free(priv);
nxmutex_destroy(&priv->datalock);
- return -ENODEV;
+ kmm_free(priv);
+ return ret;
}
/* Since we support multiple MLX90393 devices are supported, we will need
diff --git a/drivers/sensors/ms5611.c b/drivers/sensors/ms5611.c
index fad5e68170..3c03b0d6b5 100644
--- a/drivers/sensors/ms5611.c
+++ b/drivers/sensors/ms5611.c
@@ -667,6 +667,7 @@ int ms5611_register(FAR struct i2c_master_s *i2c, int devno, uint8_t addr)
if (ret < 0)
{
snerr("Failed to initialize physical device ms5611:%d\n", ret);
+ nxmutex_destroy(&priv->lock);
kmm_free(priv);
return ret;
}
@@ -677,6 +678,7 @@ int ms5611_register(FAR struct i2c_master_s *i2c, int devno, uint8_t addr)
if (ret < 0)
{
snerr("Failed to register driver: %d\n", ret);
+ nxmutex_destroy(&priv->lock);
kmm_free(priv);
return ret;
}
@@ -693,6 +695,7 @@ int ms5611_register(FAR struct i2c_master_s *i2c, int devno, uint8_t addr)
{
snerr("Failed to create the notification kthread!\n");
sensor_unregister(&priv->sensor_lower, devno);
+ nxmutex_destroy(&priv->lock);
kmm_free(priv);
return ret;
}
diff --git a/drivers/sensors/scd30.c b/drivers/sensors/scd30.c
index 146c0048d5..febb52e66e 100644
--- a/drivers/sensors/scd30.c
+++ b/drivers/sensors/scd30.c
@@ -1068,6 +1068,7 @@ int scd30_register_i2c(FAR const char *devpath, FAR struct i2c_master_s *i2c,
if (ret < 0)
{
scd30_dbg("ERROR: Failed to register driver: %d\n", ret);
+ nxmutex_destroy(&priv->devlock);
kmm_free(priv);
}
diff --git a/drivers/sensors/scd41.c b/drivers/sensors/scd41.c
index 0fd7d1185e..015b8f319b 100644
--- a/drivers/sensors/scd41.c
+++ b/drivers/sensors/scd41.c
@@ -1021,6 +1021,7 @@ int scd41_register_i2c(FAR const char *devpath, FAR struct i2c_master_s *i2c)
if (ret < 0)
{
scd41_dbg("ERROR: Failed to register driver: %d\n", ret);
+ nxmutex_destroy(&priv->devlock);
kmm_free(priv);
}
diff --git a/drivers/sensors/sgp30.c b/drivers/sensors/sgp30.c
index a13d4564f4..b013d8228f 100644
--- a/drivers/sensors/sgp30.c
+++ b/drivers/sensors/sgp30.c
@@ -1069,6 +1069,7 @@ int sgp30_register(FAR const char *devpath, FAR struct i2c_master_s *i2c,
if (ret < 0)
{
sgp30_dbg("ERROR: Failed to register driver: %d\n", ret);
+ nxmutex_destroy(&priv->devlock);
kmm_free(priv);
}
diff --git a/drivers/sensors/sht21.c b/drivers/sensors/sht21.c
index 025278a174..de59fc2a52 100644
--- a/drivers/sensors/sht21.c
+++ b/drivers/sensors/sht21.c
@@ -670,6 +670,7 @@ int sht21_register(FAR const char *devpath, FAR struct i2c_master_s *i2c,
if (ret < 0)
{
snerr("ERROR: Failed to register driver: %d\n", ret);
+ nxmutex_destroy(&priv->devlock);
kmm_free(priv);
}
diff --git a/drivers/sensors/sht3x.c b/drivers/sensors/sht3x.c
index f56d9db315..15d781490f 100644
--- a/drivers/sensors/sht3x.c
+++ b/drivers/sensors/sht3x.c
@@ -687,6 +687,7 @@ int sht3x_register(FAR const char *devpath, FAR struct i2c_master_s *i2c,
if (ret < 0)
{
snerr("ERROR: Failed to register driver: %d\n", ret);
+ nxmutex_destroy(&priv->devlock);
kmm_free(priv);
}
diff --git a/drivers/sensors/sps30.c b/drivers/sensors/sps30.c
index d9588a9647..ed7e47a3f1 100644
--- a/drivers/sensors/sps30.c
+++ b/drivers/sensors/sps30.c
@@ -1082,6 +1082,7 @@ int sps30_register_i2c(FAR const char *devpath, FAR struct i2c_master_s *i2c,
if (ret < 0)
{
sps30_dbg("ERROR: Failed to register driver: %d\n", ret);
+ nxmutex_destroy(&priv->devlock);
kmm_free(priv);
}
diff --git a/drivers/sensors/t67xx.c b/drivers/sensors/t67xx.c
index 50395c0112..8d8a5d3d35 100644
--- a/drivers/sensors/t67xx.c
+++ b/drivers/sensors/t67xx.c
@@ -738,6 +738,7 @@ int t67xx_register(FAR const char *devpath, FAR struct i2c_master_s *i2c,
return ret;
errout:
+ nxmutex_destroy(&priv->devlock);
kmm_free(priv);
return ret;
}
diff --git a/drivers/spi/spi_driver.c b/drivers/spi/spi_driver.c
index 46b3fd6d76..767eaec314 100644
--- a/drivers/spi/spi_driver.c
+++ b/drivers/spi/spi_driver.c
@@ -379,6 +379,9 @@ int spi_register(FAR struct spi_dev_s *spi, int bus)
* device.
*/
+#ifndef CONFIG_DISABLE_PSEUDOFS_OPERATIONS
+ nxmutex_destroy(&priv->lock);
+#endif
kmm_free(priv);
return ret;
}
diff --git a/drivers/spi/spi_slave_driver.c b/drivers/spi/spi_slave_driver.c
index 7d9501add8..61f0e6c0e9 100644
--- a/drivers/spi/spi_slave_driver.c
+++ b/drivers/spi/spi_slave_driver.c
@@ -618,6 +618,7 @@ int spi_slave_register(FAR struct spi_slave_ctrlr_s *ctrlr, int bus)
if (ret < 0)
{
spierr("ERROR: Failed to register driver: %d\n", ret);
+ nxmutex_destroy(&priv->lock);
kmm_free(priv);
}
diff --git a/drivers/syslog/ramlog.c b/drivers/syslog/ramlog.c
index 0a5f3083db..4ae4f58185 100644
--- a/drivers/syslog/ramlog.c
+++ b/drivers/syslog/ramlog.c
@@ -806,6 +806,10 @@ int ramlog_register(FAR const char *devpath, FAR char *buffer, size_t buflen)
ret = register_driver(devpath, &g_ramlogfops, 0666, priv);
if (ret < 0)
{
+ nxmutex_destroy(&priv->rl_lock);
+#ifndef CONFIG_RAMLOG_NONBLOCKING
+ nxsem_destroy(&priv->rl_waitsem);
+#endif
kmm_free(priv);
}
}
diff --git a/drivers/usbdev/adb.c b/drivers/usbdev/adb.c
index ffe1e3e709..2539cd00fe 100644
--- a/drivers/usbdev/adb.c
+++ b/drivers/usbdev/adb.c
@@ -1481,6 +1481,7 @@ static int usbclass_classobject(int minor,
return OK;
exit_free_driver:
+ nxmutex_destroy(&alloc->dev.lock);
kmm_free(alloc);
return ret;
}
diff --git a/drivers/video/video.c b/drivers/video/video.c
index 4f4af326b6..f82992c6e4 100644
--- a/drivers/video/video.c
+++ b/drivers/video/video.c
@@ -3077,6 +3077,7 @@ static FAR void *video_register(FAR const char *devpath)
if (ret < 0)
{
verr("Failed to register driver: %d\n", ret);
+ nxmutex_destroy(&priv->lock_open_num);
kmm_free(priv->devpath);
kmm_free(priv);
return NULL;
diff --git a/drivers/wireless/cc1101.c b/drivers/wireless/cc1101.c
index 3c3fd2cc2f..c7731b8fba 100644
--- a/drivers/wireless/cc1101.c
+++ b/drivers/wireless/cc1101.c
@@ -1480,11 +1480,15 @@ int cc1101_register(FAR const char *path, FAR struct cc1101_dev_s *dev)
dev->fifo_len = 0;
nxmutex_init(&dev->devlock);
nxmutex_init(&dev->lock_rx_buffer);
- nxsem_init(&(dev->sem_rx), 0, 0);
- nxsem_init(&(dev->sem_tx), 0, 0);
+ nxsem_init(&dev->sem_rx, 0, 0);
+ nxsem_init(&dev->sem_tx, 0, 0);
if (cc1101_init2(dev) < 0)
{
+ nxmutex_destroy(&dev->devlock);
+ nxmutex_destroy(&dev->lock_rx_buffer);
+ nxsem_destroy(&dev->sem_rx);
+ nxsem_destroy(&dev->sem_tx);
kmm_free(dev);
wlerr("ERROR: Failed to initialize cc1101_init\n");
return -ENODEV;
diff --git a/drivers/wireless/gs2200m.c b/drivers/wireless/gs2200m.c
index a7f8ee6315..08bfa1fee6 100644
--- a/drivers/wireless/gs2200m.c
+++ b/drivers/wireless/gs2200m.c
@@ -3491,7 +3491,6 @@ FAR void *gs2200m_register(FAR const char *devpath,
size = sizeof(struct gs2200m_dev_s);
dev = (FAR struct gs2200m_dev_s *)kmm_malloc(size);
-
if (!dev)
{
wlerr("Failed to allocate instance.\n");
@@ -3506,10 +3505,7 @@ FAR void *gs2200m_register(FAR const char *devpath,
nxmutex_init(&dev->dev_lock);
- dev->pfd = NULL;
-
ret = gs2200m_initialize(dev, lower);
-
if (ret < 0)
{
wlerr("Failed to initialize driver: %d\n", ret);
@@ -3517,7 +3513,6 @@ FAR void *gs2200m_register(FAR const char *devpath,
}
ret = register_driver(devpath, &g_gs2200m_fops, 0666, dev);
-
if (ret < 0)
{
wlerr("Failed to register driver: %d\n", ret);
@@ -3525,10 +3520,16 @@ FAR void *gs2200m_register(FAR const char *devpath,
}
ret = netdev_register(&dev->net_dev, NET_LL_IEEE80211);
+ if (ret < 0)
+ {
+ unregister_driver(devpath);
+ goto errout;
+ }
- return (FAR void *)dev;
+ return dev;
errout:
+ nxmutex_destroy(&dev->dev_lock);
kmm_free(dev);
return NULL;
}
diff --git a/drivers/wireless/nrf24l01.c b/drivers/wireless/nrf24l01.c
index 72aff94b4d..4d0dab5730 100644
--- a/drivers/wireless/nrf24l01.c
+++ b/drivers/wireless/nrf24l01.c
@@ -1439,10 +1439,14 @@ static int nrf24l01_unregister(FAR struct nrf24l01_dev_s *dev)
/* Free memory */
#ifdef CONFIG_WL_NRF24L01_RXSUPPORT
+ nxmutex_destroy(&dev->lock_fifo);
+ nxsem_destroy(&dev->sem_rx);
kmm_free(dev->rx_fifo);
#endif
- kmm_free(dev);
+ nxmutex_destroy(&dev->devlock);
+ nxsem_destroy(&dev->sem_tx);
+ kmm_free(dev);
return OK;
}
@@ -1484,14 +1488,16 @@ int nrf24l01_register(FAR struct spi_dev_s *spi,
#ifdef CONFIG_WL_NRF24L01_RXSUPPORT
if ((rx_fifo = kmm_malloc(CONFIG_WL_NRF24L01_RXFIFO_LEN)) == NULL)
{
+ nxmutex_destroy(&dev->devlock);
+ nxsem_destroy(&dev->sem_tx);
kmm_free(dev);
return -ENOMEM;
}
- dev->rx_fifo = rx_fifo;
+ dev->rx_fifo = rx_fifo;
nxmutex_init(&dev->lock_fifo);
- nxsem_init(&(dev->sem_rx), 0, 0);
+ nxsem_init(&dev->sem_rx, 0, 0);
nxsem_set_protocol(&dev->sem_rx, SEM_PRIO_NONE);
#endif
diff --git a/drivers/wireless/spirit/drivers/spirit_netdev.c b/drivers/wireless/spirit/drivers/spirit_netdev.c
index 5671982e39..7b86cc6044 100644
--- a/drivers/wireless/spirit/drivers/spirit_netdev.c
+++ b/drivers/wireless/spirit/drivers/spirit_netdev.c
@@ -2670,7 +2670,7 @@ int spirit_netdev_initialize(FAR struct spi_dev_s *spi,
if (ret < 0)
{
wlerr("ERROR: spirit_hw_initialize failed: %d\n", ret);
- goto errout_with_attach;
+ goto errout_with_alloc;
}
#ifdef CONFIG_NET_6LOWPAN
@@ -2682,22 +2682,22 @@ int spirit_netdev_initialize(FAR struct spi_dev_s *spi,
priv->radio.r_dev.d_buf = g_iobuffer.rb_buf;
#endif
- /* Register the device with the OS so that IOCTLs can be performed. */
+ /* Attach irq */
- ret = netdev_register(dev, NET_LL_PKTRADIO);
+ ret = lower->attach(lower, spirit_interrupt, priv);
if (ret < 0)
{
- wlerr("ERROR: netdev_register failed: %d\n", ret);
- goto errout_with_attach;
+ wlerr("ERROR: Failed to attach interrupt: %d\n", ret);
+ goto errout_with_alloc;
}
- /* Attach irq */
+ /* Register the device with the OS so that IOCTLs can be performed. */
- ret = lower->attach(lower, spirit_interrupt, priv);
+ ret = netdev_register(dev, NET_LL_PKTRADIO);
if (ret < 0)
{
- wlerr("ERROR: Failed to attach interrupt: %d\n", ret);
- goto errout_with_alloc;
+ wlerr("ERROR: netdev_register failed: %d\n", ret);
+ goto errout_with_attach;
}
/* Enable Radio IRQ */
@@ -2709,6 +2709,8 @@ errout_with_attach:
lower->attach(lower, NULL, NULL);
errout_with_alloc:
+ nxmutex_destroy(&priv->rxlock);
+ nxmutex_destroy(&priv->txlock);
kmm_free(priv);
return ret;
}
diff --git a/fs/nfs/nfs_vfsops.c b/fs/nfs/nfs_vfsops.c
index 797beb112c..9b4928e865 100644
--- a/fs/nfs/nfs_vfsops.c
+++ b/fs/nfs/nfs_vfsops.c
@@ -2045,20 +2045,20 @@ static int nfs_bind(FAR struct inode *blkdriver, FAR const void *data,
if (!rpc)
{
ferr("ERROR: Failed to allocate rpc structure\n");
- return -ENOMEM;
+ goto bad;
}
finfo("Connecting\n");
/* Translate nfsmnt flags -> rpcclnt flags */
- rpc->rc_path = nmp->nm_path;
- rpc->rc_name = &nmp->nm_nam;
- rpc->rc_sotype = argp->sotype;
- rpc->rc_timeo = nprmt.timeo;
- rpc->rc_retry = nprmt.retry;
+ rpc->rc_path = nmp->nm_path;
+ rpc->rc_name = &nmp->nm_nam;
+ rpc->rc_sotype = argp->sotype;
+ rpc->rc_timeo = nprmt.timeo;
+ rpc->rc_retry = nprmt.retry;
- nmp->nm_rpcclnt = rpc;
+ nmp->nm_rpcclnt = rpc;
ret = rpcclnt_connect(nmp->nm_rpcclnt);
if (ret != OK)
@@ -2067,8 +2067,8 @@ static int nfs_bind(FAR struct inode *blkdriver, FAR const void *data,
goto bad;
}
- nmp->nm_fhsize = nmp->nm_rpcclnt->rc_fhsize;
- nmp->nm_fh = &nmp->nm_rpcclnt->rc_fh;
+ nmp->nm_fhsize = nmp->nm_rpcclnt->rc_fhsize;
+ nmp->nm_fh = &nmp->nm_rpcclnt->rc_fh;
/* Get the file system info */
diff --git a/fs/nxffs/nxffs_initialize.c b/fs/nxffs/nxffs_initialize.c
index 05b04ae20c..00500fe19c 100644
--- a/fs/nxffs/nxffs_initialize.c
+++ b/fs/nxffs/nxffs_initialize.c
@@ -304,6 +304,7 @@ errout_with_buffer:
errout_with_cache:
kmm_free(volume->cache);
errout_with_volume:
+ nxmutex_destroy(&volume->lock);
#ifndef CONFIG_NXFFS_PREALLOCATED
kmm_free(volume);
#endif
diff --git a/wireless/ieee802154/mac802154_device.c b/wireless/ieee802154/mac802154_device.c
index 04c574dccd..bea73750f7 100644
--- a/wireless/ieee802154/mac802154_device.c
+++ b/wireless/ieee802154/mac802154_device.c
@@ -863,11 +863,7 @@ int mac802154dev_register(MACHANDLE mac, int minor)
if (ret < 0)
{
nerr("ERROR: Failed to bind the MAC callbacks: %d\n", ret);
-
- /* Free memory and return the error */
-
- kmm_free(dev);
- return ret;
+ goto errout_with_priv;
}
/* Create the character device name */
diff --git a/wireless/ieee802154/mac802154_netdev.c b/wireless/ieee802154/mac802154_netdev.c
index ce3ac93594..ae52cdda30 100644
--- a/wireless/ieee802154/mac802154_netdev.c
+++ b/wireless/ieee802154/mac802154_netdev.c
@@ -1338,6 +1338,7 @@ int mac802154netdev_register(MACHANDLE mac)
return macnet_ifdown(&priv->md_dev.r_dev);
errout:
+ nxmutex_destroy(&priv->md_lock);
/* Free memory and return the error */