diff --git a/drivers/misc/qseecom.c b/drivers/misc/qseecom.c index 9be68883664f..76d1526bb6ee 100644 --- a/drivers/misc/qseecom.c +++ b/drivers/misc/qseecom.c @@ -190,6 +190,13 @@ struct sglist_info { #define MAKE_WHITELIST_VERSION(major, minor, patch) \ (((major & 0x3FF) << 22) | ((minor & 0x3FF) << 12) | (patch & 0xFFF)) +#define MAKE_NULL(sgt, attach, dmabuf) do {\ + sgt = NULL;\ + attach = NULL;\ + dmabuf = NULL;\ + } while (0) + + struct qseecom_registered_listener_list { struct list_head list; struct qseecom_register_listener_req svc; @@ -1432,6 +1439,7 @@ static int qseecom_vaddr_map(int ion_fd, err_unmap: dma_buf_end_cpu_access(new_dma_buf, DMA_BIDIRECTIONAL); qseecom_dmabuf_unmap(new_sgt, new_attach, new_dma_buf); + MAKE_NULL(*sgt, *attach, *dmabuf); err: return ret; } @@ -1508,9 +1516,11 @@ static int __qseecom_set_sb_memory(struct qseecom_registered_listener_list *svc, } return 0; err: - if (svc->dmabuf) + if (svc->dmabuf) { qseecom_vaddr_unmap(svc->sb_virt, svc->sgt, svc->attach, svc->dmabuf); + MAKE_NULL(svc->sgt, svc->attach, svc->dmabuf); + } return ret; } @@ -1636,9 +1646,11 @@ static int __qseecom_unregister_listener(struct qseecom_dev_handle *data, } exit: - if (ptr_svc->dmabuf) + if (ptr_svc->dmabuf) { qseecom_vaddr_unmap(ptr_svc->sb_virt, ptr_svc->sgt, ptr_svc->attach, ptr_svc->dmabuf); + MAKE_NULL(ptr_svc->sgt, ptr_svc->attach, ptr_svc->dmabuf); + } __qseecom_free_tzbuf(&ptr_svc->sglistinfo_shm); list_del(&ptr_svc->list); kzfree(ptr_svc); @@ -2049,9 +2061,12 @@ static int qseecom_set_client_mem_param(struct qseecom_dev_handle *data, return ret; exit: - if (data->client.dmabuf) + if (data->client.dmabuf) { qseecom_vaddr_unmap(data->client.sb_virt, data->client.sgt, data->client.attach, data->client.dmabuf); + MAKE_NULL(data->client.sgt, + data->client.attach, data->client.dmabuf); + } return ret; } @@ -2992,8 +3007,10 @@ static int qseecom_load_app(struct qseecom_dev_handle *data, void __user *argp) } loadapp_err: - if (dmabuf) + if (dmabuf) { qseecom_vaddr_unmap(vaddr, sgt, attach, dmabuf); + MAKE_NULL(sgt, attach, dmabuf); + } checkapp_err: __qseecom_disable_clk_scale_down(data); enable_clk_err: @@ -3129,9 +3146,12 @@ static int qseecom_unload_app(struct qseecom_dev_handle *data, } unload_exit: - if (data->client.dmabuf) + if (data->client.dmabuf) { qseecom_vaddr_unmap(data->client.sb_virt, data->client.sgt, data->client.attach, data->client.dmabuf); + MAKE_NULL(data->client.sgt, + data->client.attach, data->client.dmabuf); + } data->released = true; return ret; } @@ -4063,8 +4083,10 @@ static int __qseecom_update_cmd_buf(void *msg, bool cleanup, } return ret; err: - if (!IS_ERR_OR_NULL(sg_ptr)) + if (!IS_ERR_OR_NULL(sg_ptr)) { qseecom_dmabuf_unmap(sg_ptr, attach, dmabuf); + MAKE_NULL(sg_ptr, attach, dmabuf); + } return -ENOMEM; } @@ -4301,8 +4323,10 @@ err: data->client.sec_buf_fd[i].size, data->client.sec_buf_fd[i].vbase, data->client.sec_buf_fd[i].pbase); - if (!IS_ERR_OR_NULL(sg_ptr)) + if (!IS_ERR_OR_NULL(sg_ptr)) { qseecom_dmabuf_unmap(sg_ptr, attach, dmabuf); + MAKE_NULL(sg_ptr, attach, dmabuf); + } return -ENOMEM; } @@ -5867,8 +5891,10 @@ exit_register_bus_bandwidth_needs: } exit_cpu_restore: - if (dmabuf) + if (dmabuf) { qseecom_vaddr_unmap(va, sgt, attach, dmabuf); + MAKE_NULL(sgt, attach, dmabuf); + } return ret; } @@ -7122,8 +7148,10 @@ clean: } return ret; err: - if (!IS_ERR_OR_NULL(sg_ptr)) + if (!IS_ERR_OR_NULL(sg_ptr)) { qseecom_dmabuf_unmap(sg_ptr, attach, dmabuf); + MAKE_NULL(sg_ptr, attach, dmabuf); + } return -ENOMEM; } @@ -8314,10 +8342,13 @@ static int qseecom_release(struct inode *inode, struct file *file) break; case QSEECOM_SECURE_SERVICE: case QSEECOM_GENERIC: - if (data->client.dmabuf) + if (data->client.dmabuf) { qseecom_vaddr_unmap(data->client.sb_virt, data->client.sgt, data->client.attach, data->client.dmabuf); + MAKE_NULL(data->client.sgt, data->client.attach, + data->client.dmabuf); + } break; case QSEECOM_UNAVAILABLE_CLIENT_APP: break;