diff options
author | Wendly Li <wendlyli@google.com> | 2022-06-30 16:59:44 +0000 |
---|---|---|
committer | Wendly Li <wendlyli@google.com> | 2022-07-04 06:30:48 +0000 |
commit | 45b9a13cb2d8bebb7b62d02c5b8a69caa680775b (patch) | |
tree | f53dd9807da5ad9a2fe80dc92d9768970567a7ad /goodix_brl_spi.c | |
parent | b8e8849b7187e5b34dadb78386a0797ce422c6dd (diff) | |
download | goodix_touch-45b9a13cb2d8bebb7b62d02c5b8a69caa680775b.tar.gz |
touch/goodix: fix deadlock in edge cases
Bug: 229036434
Test: driver works fine after some edge cases
Change-Id: I313db6d33cc2f60342ed5c5f169d614610213959
Signed-off-by: Wendly Li <wendlyli@google.com>
Diffstat (limited to 'goodix_brl_spi.c')
-rw-r--r-- | goodix_brl_spi.c | 24 |
1 files changed, 13 insertions, 11 deletions
diff --git a/goodix_brl_spi.c b/goodix_brl_spi.c index 42731c2..b868f8c 100644 --- a/goodix_brl_spi.c +++ b/goodix_brl_spi.c @@ -66,14 +66,15 @@ static int goodix_spi_read_bra(struct device *dev, unsigned int addr, rx_buf = kzalloc(buf_len, GFP_KERNEL); if (!rx_buf) { ts_err("alloc rx_buf failed, size:%d", buf_len); - return -ENOMEM; + ret = -ENOMEM; + goto err_alloc_rx_buf; } tx_buf = kzalloc(buf_len, GFP_KERNEL); if (!tx_buf) { ts_err("alloc tx_buf failed, size:%d", buf_len); ret = -ENOMEM; - goto err_alloc_rx_buf; + goto err_alloc_tx_buf; } } @@ -103,14 +104,14 @@ static int goodix_spi_read_bra(struct device *dev, unsigned int addr, } memcpy(data, &rx_buf[SPI_READ_PREFIX_LEN], len); - mutex_unlock(&goodix_spi_bus.mutex); - err_spi_transfer: + if (tx_buf != goodix_spi_bus.tx_buf) + kfree(tx_buf); +err_alloc_tx_buf: if (rx_buf != goodix_spi_bus.rx_buf) kfree(rx_buf); err_alloc_rx_buf: - if (tx_buf != goodix_spi_bus.tx_buf) - kfree(tx_buf); + mutex_unlock(&goodix_spi_bus.mutex); return ret; } @@ -140,14 +141,15 @@ static int goodix_spi_read(struct device *dev, unsigned int addr, rx_buf = kzalloc(buf_len, GFP_KERNEL); if (!rx_buf) { ts_err("alloc rx_buf failed, size:%d", buf_len); - return -ENOMEM; + ret = -ENOMEM; + goto err_alloc_rx_buf; } tx_buf = kzalloc(buf_len, GFP_KERNEL); if (!tx_buf) { ts_err("alloc tx_buf failed, size:%d", buf_len); ret = -ENOMEM; - goto err_alloc_rx_buf; + goto err_alloc_tx_buf; } } @@ -177,14 +179,14 @@ static int goodix_spi_read(struct device *dev, unsigned int addr, } memcpy(data, &rx_buf[SPI_READ_PREFIX_LEN - 1], len); - mutex_unlock(&goodix_spi_bus.mutex); - err_spi_transfer: if (tx_buf != goodix_spi_bus.tx_buf) kfree(tx_buf); -err_alloc_rx_buf: +err_alloc_tx_buf: if (rx_buf != goodix_spi_bus.rx_buf) kfree(rx_buf); +err_alloc_rx_buf: + mutex_unlock(&goodix_spi_bus.mutex); return ret; } |