From dca5a3483f2e2f8223e6b80ea3872ba5682a20fd Mon Sep 17 00:00:00 2001 From: Xiang Xiao Date: Mon, 17 Oct 2022 00:50:59 +0800 Subject: [PATCH] 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 --- 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 +++++++--- .../wireless/spirit/drivers/spirit_netdev.c | 22 ++++++++++--------- 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, 110 insertions(+), 46 deletions(-) diff --git a/drivers/can/mcp2515.c b/drivers/can/mcp2515.c index 38216483310..645c9fd1c8f 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 245558364dd..5a7c4c9f3b9 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 dbd86e374d5..0f0c0a971c7 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 9f05cf2d1bf..2fe4b6b5847 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 6618414c4dd..0a092ab7163 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 de957c284a5..7f1f37875fe 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 24ad7bcbc78..cf6a407e3bb 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 358995111c0..6f697d66007 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 5278952006b..da513d9b8ee 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 a73aad728a6..22149d7870b 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 0ec8c9b9228..1a5ea790bbb 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 ac0ed3bc01a..8b79b3deac5 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 59af4e863f7..2ccc972295c 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 adf087d464d..6706e347907 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 86835db10b3..45291fa18e5 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 0a995cb09ab..b6a78277dc6 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 6e6ca68d341..71f0c166340 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 0f8e1302952..2bdc5ec0a5a 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 c7bf2641cba..25ba08d3362 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 6c0dbe1d0d6..5ce9371f3f9 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 2acaa4c99ec..f4319b914d5 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 1cabb33f87f..164d474cd26 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 194216dfac3..fcbe397b9d4 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 6742ef8f739..8ac24252474 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 fad5e681701..3c03b0d6b5d 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 146c0048d52..febb52e66e9 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 0fd7d1185e9..015b8f319b8 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 a13d4564f49..b013d8228fb 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 025278a1749..de59fc2a523 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 f56d9db3151..15d781490f1 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 d9588a96479..ed7e47a3f1d 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 50395c01120..8d8a5d3d35b 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 46b3fd6d769..767eaec3142 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 7d9501add8c..61f0e6c0e96 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 0a5f3083db4..4ae4f58185d 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 ffe1e3e7095..2539cd00fe2 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 4f4af326b67..f82992c6e42 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 3c3fd2cc2f5..c7731b8fba7 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 a7f8ee6315f..08bfa1fee65 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 72aff94b4de..4d0dab5730f 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 5671982e394..7b86cc6044b 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,15 +2682,6 @@ 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. */ - - ret = netdev_register(dev, NET_LL_PKTRADIO); - if (ret < 0) - { - wlerr("ERROR: netdev_register failed: %d\n", ret); - goto errout_with_attach; - } - /* Attach irq */ ret = lower->attach(lower, spirit_interrupt, priv); @@ -2700,6 +2691,15 @@ int spirit_netdev_initialize(FAR struct spi_dev_s *spi, goto errout_with_alloc; } + /* Register the device with the OS so that IOCTLs can be performed. */ + + ret = netdev_register(dev, NET_LL_PKTRADIO); + if (ret < 0) + { + wlerr("ERROR: netdev_register failed: %d\n", ret); + goto errout_with_attach; + } + /* Enable Radio IRQ */ lower->enable(lower, true); @@ -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 797beb112cd..9b4928e8651 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 05b04ae20c5..00500fe19c8 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 04c574dccd4..bea73750f7f 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 ce3ac93594e..ae52cdda303 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 */