diff --git a/drivers/i2s/i2s_common.c b/drivers/i2s/i2s_common.c index 2c2fe884b022..a9eb676ad109 100644 --- a/drivers/i2s/i2s_common.c +++ b/drivers/i2s/i2s_common.c @@ -48,5 +48,10 @@ int _impl_i2s_buf_write(struct device *dev, void *buf, size_t size) memcpy(mem_block, (void *)buf, size); - return i2s_write((struct device *)dev, mem_block, size); + ret = i2s_write((struct device *)dev, mem_block, size); + if (ret != 0) { + k_mem_slab_free(tx_cfg->mem_slab, &mem_block); + } + + return ret; } diff --git a/drivers/i2s/i2s_handlers.c b/drivers/i2s/i2s_handlers.c index 063024a7c75e..1fb3fbea109c 100644 --- a/drivers/i2s/i2s_handlers.c +++ b/drivers/i2s/i2s_handlers.c @@ -98,7 +98,12 @@ Z_SYSCALL_HANDLER(i2s_buf_write, dev, buf, size) Z_OOPS(ret); } - return i2s_write((struct device *)dev, mem_block, size); + ret = i2s_write((struct device *)dev, mem_block, size); + if (ret != 0) { + k_mem_slab_free(tx_cfg->mem_slab, &mem_block); + } + + return ret; } Z_SYSCALL_HANDLER(i2s_trigger, dev, dir, cmd)