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 */