From: Kees Cook <keescook@chromium.org>
To: "Gustavo A. R. Silva" <gustavoars@kernel.org>
Cc: "Sumit Semwal" <sumit.semwal@linaro.org>,
"Gustavo Padovan" <gustavo@padovan.org>,
"Christian König" <christian.koenig@amd.com>,
"Arvind Yadav" <Arvind.Yadav@amd.com>,
linux-media@vger.kernel.org, dri-devel@lists.freedesktop.org,
linaro-mm-sig@lists.linaro.org, linux-kernel@vger.kernel.org,
linux-hardening@vger.kernel.org
Subject: Re: [PATCH][next] dma-buf: Fix NULL pointer dereference in dma_fence_enable_sw_signaling()
Date: Wed, 11 Oct 2023 09:03:58 -0700 [thread overview]
Message-ID: <202310110903.FE533CBCD@keescook> (raw)
In-Reply-To: <ZSarP0/+hG8/87//@work>
On Wed, Oct 11, 2023 at 08:03:43AM -0600, Gustavo A. R. Silva wrote:
> Currently, a NULL pointer dereference will happen in function
> `dma_fence_enable_sw_signaling()` (at line 615), in case `chain`
> is not allocated in `mock_chain()` and this function returns
> `NULL` (at line 86). See below:
>
> drivers/dma-buf/st-dma-fence-chain.c:
> 86 chain = mock_chain(NULL, f, 1);
> 87 if (!chain)
> 88 err = -ENOMEM;
> 89
> 90 dma_fence_enable_sw_signaling(chain);
Instead of the larger patch, should line 88 here just do a "return
-ENOMEM" instead?
-Kees
>
> drivers/dma-buf/dma-fence.c:
> 611 void dma_fence_enable_sw_signaling(struct dma_fence *fence)
> 612 {
> 613 unsigned long flags;
> 614
> 615 spin_lock_irqsave(fence->lock, flags);
> ^^^^^^^^^^^
> |
> NULL pointer reference
> if fence == NULL
>
> 616 __dma_fence_enable_signaling(fence);
> 617 spin_unlock_irqrestore(fence->lock, flags);
> 618 }
>
> Fix this by adding a NULL check before dereferencing `fence` in
> `dma_fence_enable_sw_signaling()`. This will prevent any other NULL
> pointer dereference when the `fence` passed as an argument is `NULL`.
>
> Addresses-Coverity: ("Dereference after null check")
> Fixes: d62c43a953ce ("dma-buf: Enable signaling on fence for selftests")
> Cc: stable@vger.kernel.org
> Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
> ---
> drivers/dma-buf/dma-fence.c | 9 ++++++++-
> include/linux/dma-fence.h | 2 +-
> 2 files changed, 9 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/dma-buf/dma-fence.c b/drivers/dma-buf/dma-fence.c
> index 8aa8f8cb7071..4d2f13560d0f 100644
> --- a/drivers/dma-buf/dma-fence.c
> +++ b/drivers/dma-buf/dma-fence.c
> @@ -607,14 +607,21 @@ static bool __dma_fence_enable_signaling(struct dma_fence *fence)
> * This will request for sw signaling to be enabled, to make the fence
> * complete as soon as possible. This calls &dma_fence_ops.enable_signaling
> * internally.
> + *
> + * Returns 0 on success and a negative error value when @fence is NULL.
> */
> -void dma_fence_enable_sw_signaling(struct dma_fence *fence)
> +int dma_fence_enable_sw_signaling(struct dma_fence *fence)
> {
> unsigned long flags;
>
> + if (!fence)
> + return -EINVAL;
> +
> spin_lock_irqsave(fence->lock, flags);
> __dma_fence_enable_signaling(fence);
> spin_unlock_irqrestore(fence->lock, flags);
> +
> + return 0;
> }
> EXPORT_SYMBOL(dma_fence_enable_sw_signaling);
>
> diff --git a/include/linux/dma-fence.h b/include/linux/dma-fence.h
> index ebe78bd3d121..1e4025e925e6 100644
> --- a/include/linux/dma-fence.h
> +++ b/include/linux/dma-fence.h
> @@ -399,7 +399,7 @@ int dma_fence_add_callback(struct dma_fence *fence,
> dma_fence_func_t func);
> bool dma_fence_remove_callback(struct dma_fence *fence,
> struct dma_fence_cb *cb);
> -void dma_fence_enable_sw_signaling(struct dma_fence *fence);
> +int dma_fence_enable_sw_signaling(struct dma_fence *fence);
>
> /**
> * dma_fence_is_signaled_locked - Return an indication if the fence
> --
> 2.34.1
>
>
--
Kees Cook
WARNING: multiple messages have this Message-ID (diff)
From: Kees Cook <keescook@chromium.org>
To: "Gustavo A. R. Silva" <gustavoars@kernel.org>
Cc: "Gustavo Padovan" <gustavo@padovan.org>,
linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org,
"Christian König" <christian.koenig@amd.com>,
linaro-mm-sig@lists.linaro.org, linux-hardening@vger.kernel.org,
"Arvind Yadav" <Arvind.Yadav@amd.com>,
"Sumit Semwal" <sumit.semwal@linaro.org>,
linux-media@vger.kernel.org
Subject: Re: [PATCH][next] dma-buf: Fix NULL pointer dereference in dma_fence_enable_sw_signaling()
Date: Wed, 11 Oct 2023 09:03:58 -0700 [thread overview]
Message-ID: <202310110903.FE533CBCD@keescook> (raw)
In-Reply-To: <ZSarP0/+hG8/87//@work>
On Wed, Oct 11, 2023 at 08:03:43AM -0600, Gustavo A. R. Silva wrote:
> Currently, a NULL pointer dereference will happen in function
> `dma_fence_enable_sw_signaling()` (at line 615), in case `chain`
> is not allocated in `mock_chain()` and this function returns
> `NULL` (at line 86). See below:
>
> drivers/dma-buf/st-dma-fence-chain.c:
> 86 chain = mock_chain(NULL, f, 1);
> 87 if (!chain)
> 88 err = -ENOMEM;
> 89
> 90 dma_fence_enable_sw_signaling(chain);
Instead of the larger patch, should line 88 here just do a "return
-ENOMEM" instead?
-Kees
>
> drivers/dma-buf/dma-fence.c:
> 611 void dma_fence_enable_sw_signaling(struct dma_fence *fence)
> 612 {
> 613 unsigned long flags;
> 614
> 615 spin_lock_irqsave(fence->lock, flags);
> ^^^^^^^^^^^
> |
> NULL pointer reference
> if fence == NULL
>
> 616 __dma_fence_enable_signaling(fence);
> 617 spin_unlock_irqrestore(fence->lock, flags);
> 618 }
>
> Fix this by adding a NULL check before dereferencing `fence` in
> `dma_fence_enable_sw_signaling()`. This will prevent any other NULL
> pointer dereference when the `fence` passed as an argument is `NULL`.
>
> Addresses-Coverity: ("Dereference after null check")
> Fixes: d62c43a953ce ("dma-buf: Enable signaling on fence for selftests")
> Cc: stable@vger.kernel.org
> Signed-off-by: Gustavo A. R. Silva <gustavoars@kernel.org>
> ---
> drivers/dma-buf/dma-fence.c | 9 ++++++++-
> include/linux/dma-fence.h | 2 +-
> 2 files changed, 9 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/dma-buf/dma-fence.c b/drivers/dma-buf/dma-fence.c
> index 8aa8f8cb7071..4d2f13560d0f 100644
> --- a/drivers/dma-buf/dma-fence.c
> +++ b/drivers/dma-buf/dma-fence.c
> @@ -607,14 +607,21 @@ static bool __dma_fence_enable_signaling(struct dma_fence *fence)
> * This will request for sw signaling to be enabled, to make the fence
> * complete as soon as possible. This calls &dma_fence_ops.enable_signaling
> * internally.
> + *
> + * Returns 0 on success and a negative error value when @fence is NULL.
> */
> -void dma_fence_enable_sw_signaling(struct dma_fence *fence)
> +int dma_fence_enable_sw_signaling(struct dma_fence *fence)
> {
> unsigned long flags;
>
> + if (!fence)
> + return -EINVAL;
> +
> spin_lock_irqsave(fence->lock, flags);
> __dma_fence_enable_signaling(fence);
> spin_unlock_irqrestore(fence->lock, flags);
> +
> + return 0;
> }
> EXPORT_SYMBOL(dma_fence_enable_sw_signaling);
>
> diff --git a/include/linux/dma-fence.h b/include/linux/dma-fence.h
> index ebe78bd3d121..1e4025e925e6 100644
> --- a/include/linux/dma-fence.h
> +++ b/include/linux/dma-fence.h
> @@ -399,7 +399,7 @@ int dma_fence_add_callback(struct dma_fence *fence,
> dma_fence_func_t func);
> bool dma_fence_remove_callback(struct dma_fence *fence,
> struct dma_fence_cb *cb);
> -void dma_fence_enable_sw_signaling(struct dma_fence *fence);
> +int dma_fence_enable_sw_signaling(struct dma_fence *fence);
>
> /**
> * dma_fence_is_signaled_locked - Return an indication if the fence
> --
> 2.34.1
>
>
--
Kees Cook
next prev parent reply other threads:[~2023-10-11 16:04 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-10-11 14:03 [PATCH][next] dma-buf: Fix NULL pointer dereference in dma_fence_enable_sw_signaling() Gustavo A. R. Silva
2023-10-11 14:03 ` Gustavo A. R. Silva
2023-10-11 16:03 ` Kees Cook [this message]
2023-10-11 16:03 ` Kees Cook
2023-10-11 16:13 ` Gustavo A. R. Silva
2023-10-11 16:13 ` Gustavo A. R. Silva
2023-10-12 6:48 ` Christian König
2023-10-12 6:48 ` Christian König
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=202310110903.FE533CBCD@keescook \
--to=keescook@chromium.org \
--cc=Arvind.Yadav@amd.com \
--cc=christian.koenig@amd.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=gustavo@padovan.org \
--cc=gustavoars@kernel.org \
--cc=linaro-mm-sig@lists.linaro.org \
--cc=linux-hardening@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=sumit.semwal@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.