OSDN Git Service

soc: hab: add more return error checking
authorYajun Li <yajunl@codeaurora.org>
Tue, 18 Sep 2018 06:24:24 +0000 (14:24 +0800)
committerYajun Li <yajunl@codeaurora.org>
Fri, 21 Sep 2018 09:25:46 +0000 (17:25 +0800)
If the exported buffer has been freed in other threads,
dma_buf_get maybe return error, therefore need error
checking here.

Change-Id: Ic1674cada8dc6e0d6b09d75abf695a68896b8bff
Signed-off-by: Yajun Li <yajunl@codeaurora.org>
drivers/soc/qcom/hab/hab_mem_linux.c

index da41536..428d3e7 100644 (file)
@@ -79,6 +79,7 @@ static int habmem_get_dma_pages_from_va(unsigned long address,
        vma = find_vma(current->mm, address);
        if (!vma || !vma->vm_file) {
                pr_err("cannot find vma\n");
+               rc = -EBADF;
                goto err;
        }
 
@@ -86,6 +87,7 @@ static int habmem_get_dma_pages_from_va(unsigned long address,
        fd = iterate_fd(current->files, 0, match_file, vma->vm_file);
        if (fd == 0) {
                pr_err("iterate_fd failed\n");
+               rc = -EBADF;
                goto err;
        }
 
@@ -93,10 +95,16 @@ static int habmem_get_dma_pages_from_va(unsigned long address,
        page_offset = offset/PAGE_SIZE;
 
        dmabuf = dma_buf_get(fd - 1);
+       if (IS_ERR_OR_NULL(dmabuf)) {
+               pr_err("dma_buf_get failed fd %d ret %pK\n", fd, dmabuf);
+               rc = -EBADF;
+               goto err;
+       }
 
        attach = dma_buf_attach(dmabuf, hab_driver.dev);
        if (IS_ERR_OR_NULL(attach)) {
                pr_err("dma_buf_attach failed\n");
+               rc = -EBADF;
                goto err;
        }
 
@@ -104,6 +112,7 @@ static int habmem_get_dma_pages_from_va(unsigned long address,
 
        if (IS_ERR_OR_NULL(sg_table)) {
                pr_err("dma_buf_map_attachment failed\n");
+               rc = -EBADF;
                goto err;
        }
 
@@ -154,12 +163,16 @@ static int habmem_get_dma_pages_from_fd(int32_t fd,
        int i, j, rc = 0;
 
        dmabuf = dma_buf_get(fd);
-       if (IS_ERR(dmabuf))
-               return PTR_ERR(dmabuf);
+       if (IS_ERR_OR_NULL(dmabuf)) {
+               pr_err("dma_buf_get failed fd %d ret %pK\n", fd, dmabuf);
+               rc = -EBADF;
+               goto err;
+       }
 
        attach = dma_buf_attach(dmabuf, hab_driver.dev);
        if (IS_ERR_OR_NULL(attach)) {
                pr_err("dma_buf_attach failed\n");
+               rc = -EBADF;
                goto err;
        }
 
@@ -167,6 +180,7 @@ static int habmem_get_dma_pages_from_fd(int32_t fd,
 
        if (IS_ERR_OR_NULL(sg_table)) {
                pr_err("dma_buf_map_attachment failed\n");
+               rc = -EBADF;
                goto err;
        }