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 <xiaoxiang@xiaomi.com>
This commit is contained in:
Xiang Xiao
2022-10-17 00:50:59 +08:00
committed by Masayuki Ishikawa
parent dee38ce3e8
commit dca5a3483f
45 changed files with 110 additions and 46 deletions
+2
View File
@@ -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;
}
+3
View File
@@ -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;
}
+1
View File
@@ -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;
}
+1
View File
@@ -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;
+1
View File
@@ -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);
+1
View File
@@ -1580,6 +1580,7 @@ errout_with_interrupts:
errout_with_lock:
nxmutex_destroy(&priv->lock);
kmm_free(priv);
return ret;
}
+1
View File
@@ -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);
}
+1
View File
@@ -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);
}
+1
View File
@@ -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);
}
+1
View File
@@ -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);
}
+1
View File
@@ -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;
}
+2
View File
@@ -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);
}
+3 -1
View File
@@ -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;
}
+1
View File
@@ -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);
}
+1
View File
@@ -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;
+1
View File
@@ -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");
+3 -1
View File
@@ -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;
+1
View File
@@ -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;
}
+1 -1
View File
@@ -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;
}
+3 -1
View File
@@ -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;
}
+5 -3
View File
@@ -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
+3 -1
View File
@@ -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);
+1
View File
@@ -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;
+5 -3
View File
@@ -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
+3
View File
@@ -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;
}
+1
View File
@@ -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);
}
+1
View File
@@ -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);
}
+1
View File
@@ -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);
}
+1
View File
@@ -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);
}
+1
View File
@@ -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);
}
+1
View File
@@ -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);
}
+1
View File
@@ -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;
}
+3
View File
@@ -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;
}
+1
View File
@@ -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);
}
+4
View File
@@ -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);
}
}
+1
View File
@@ -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;
}
+1
View File
@@ -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;
+6 -2
View File
@@ -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;
+7 -6
View File
@@ -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;
}
+9 -3
View File
@@ -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
+12 -10
View File
@@ -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;
}
+9 -9
View File
@@ -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 */
+1
View File
@@ -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
+1 -5
View File
@@ -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 */
+1
View File
@@ -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 */