linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/1] xen-netfront: do not cast grant table reference to signed short
@ 2016-10-31  5:38 Dongli Zhang
  2016-10-31  7:47 ` [Xen-devel] " Jan Beulich
  2016-10-31 20:06 ` David Miller
  0 siblings, 2 replies; 5+ messages in thread
From: Dongli Zhang @ 2016-10-31  5:38 UTC (permalink / raw)
  To: linux-kernel, xen-devel, netdev; +Cc: boris.ostrovsky, david.vrabel, jgross

While grant reference is of type uint32_t, xen-netfront erroneously casts
it to signed short in BUG_ON().

This would lead to the xen domU panic during boot-up or migration when it
is attached with lots of paravirtual devices.

Signed-off-by: Dongli Zhang <dongli.zhang@oracle.com>
---
 drivers/net/xen-netfront.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/drivers/net/xen-netfront.c b/drivers/net/xen-netfront.c
index e17879d..189a28d 100644
--- a/drivers/net/xen-netfront.c
+++ b/drivers/net/xen-netfront.c
@@ -304,7 +304,7 @@ static void xennet_alloc_rx_buffers(struct netfront_queue *queue)
 		queue->rx_skbs[id] = skb;
 
 		ref = gnttab_claim_grant_reference(&queue->gref_rx_head);
-		BUG_ON((signed short)ref < 0);
+		WARN_ON_ONCE(IS_ERR_VALUE((unsigned long)ref));
 		queue->grant_rx_ref[id] = ref;
 
 		page = skb_frag_page(&skb_shinfo(skb)->frags[0]);
@@ -428,7 +428,7 @@ static void xennet_tx_setup_grant(unsigned long gfn, unsigned int offset,
 	id = get_id_from_freelist(&queue->tx_skb_freelist, queue->tx_skbs);
 	tx = RING_GET_REQUEST(&queue->tx, queue->tx.req_prod_pvt++);
 	ref = gnttab_claim_grant_reference(&queue->gref_tx_head);
-	BUG_ON((signed short)ref < 0);
+	WARN_ON_ONCE(IS_ERR_VALUE((unsigned long)ref));
 
 	gnttab_grant_foreign_access_ref(ref, queue->info->xbdev->otherend_id,
 					gfn, GNTMAP_readonly);
-- 
2.7.4

^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [Xen-devel] [PATCH 1/1] xen-netfront: do not cast grant table reference to signed short
  2016-10-31  5:38 [PATCH 1/1] xen-netfront: do not cast grant table reference to signed short Dongli Zhang
@ 2016-10-31  7:47 ` Jan Beulich
  2016-10-31 20:06 ` David Miller
  1 sibling, 0 replies; 5+ messages in thread
From: Jan Beulich @ 2016-10-31  7:47 UTC (permalink / raw)
  To: Dongli Zhang
  Cc: david.vrabel, xen-devel, boris.ostrovsky, Juergen Gross,
	linux-kernel, netdev

>>> On 31.10.16 at 06:38, <dongli.zhang@oracle.com> wrote:
> --- a/drivers/net/xen-netfront.c
> +++ b/drivers/net/xen-netfront.c
> @@ -304,7 +304,7 @@ static void xennet_alloc_rx_buffers(struct netfront_queue *queue)
>  		queue->rx_skbs[id] = skb;
>  
>  		ref = gnttab_claim_grant_reference(&queue->gref_rx_head);
> -		BUG_ON((signed short)ref < 0);
> +		WARN_ON_ONCE(IS_ERR_VALUE((unsigned long)ref));

You really need to cast to plain (or signed) long here - casting to
unsigned long will work only in 32-bit configurations, as otherwise
you lose the sign of the value.

And then just issuing a warning here is insufficient, I think: Either
you follow David's line of thought assuming that no failure here is
possible at all (in which case the BUG_ON() can be ditched without
replacement), or you follow your original one (which matches mine)
that we can't exclude an error here because of a bug elsewhere,
in which case this either needs to stay BUG_ON() or should be
followed by some form of bailing out (so that the bad ref won't get
stored, preventing its later use from causing further damage).

Jan

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 1/1] xen-netfront: do not cast grant table reference to signed short
  2016-10-31  5:38 [PATCH 1/1] xen-netfront: do not cast grant table reference to signed short Dongli Zhang
  2016-10-31  7:47 ` [Xen-devel] " Jan Beulich
@ 2016-10-31 20:06 ` David Miller
  1 sibling, 0 replies; 5+ messages in thread
From: David Miller @ 2016-10-31 20:06 UTC (permalink / raw)
  To: dongli.zhang
  Cc: linux-kernel, xen-devel, netdev, boris.ostrovsky, david.vrabel, jgross

From: Dongli Zhang <dongli.zhang@oracle.com>
Date: Mon, 31 Oct 2016 13:38:29 +0800

> While grant reference is of type uint32_t, xen-netfront erroneously casts
> it to signed short in BUG_ON().
> 
> This would lead to the xen domU panic during boot-up or migration when it
> is attached with lots of paravirtual devices.
> 
> Signed-off-by: Dongli Zhang <dongli.zhang@oracle.com>

Since this is consistent with how the macros in linux/err.h handle "is
this an error" checks, this change looks good to me.

Applied, thanks.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 1/1] xen-netfront: do not cast grant table reference to signed short
  2016-11-01  4:46 Dongli Zhang
@ 2016-11-01 14:50 ` David Miller
  0 siblings, 0 replies; 5+ messages in thread
From: David Miller @ 2016-11-01 14:50 UTC (permalink / raw)
  To: dongli.zhang
  Cc: JBeulich, boris.ostrovsky, jgross, netdev, xen-devel,
	david.vrabel, linux-kernel

From: Dongli Zhang <dongli.zhang@oracle.com>
Date: Mon, 31 Oct 2016 21:46:09 -0700 (PDT)

> David, I am very sorry for this error and I will be careful the next time.
> Would you please let me know if I should resend a new patch or an incremental
> based on previous one at 
> https://git.kernel.org/cgit/linux/kernel/git/davem/net.git?

Incremental, please.

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH 1/1] xen-netfront: do not cast grant table reference to signed short
@ 2016-11-01  4:46 Dongli Zhang
  2016-11-01 14:50 ` David Miller
  0 siblings, 1 reply; 5+ messages in thread
From: Dongli Zhang @ 2016-11-01  4:46 UTC (permalink / raw)
  To: davem, JBeulich
  Cc: boris.ostrovsky, jgross, netdev, xen-devel, david.vrabel, linux-kernel

Hi David and Jan,

I did more testing on the code. Casting to either (long) or (unsigned long)
would be fine.

However, there is still an issue that ref is of type uint32_t and
IS_ERR_VALUE((unsigned long)ref) would not return true when ref=-ENOSPC (or
other error code).

IS_ERR_VALUE((long)ref) would return false as well.

The solution is to cast ref to (int) first as follows:

-   BUG_ON((signed short)ref < 0);
+   WARN_ON_ONCE(IS_ERR_VALUE((unsigned long)(int)ref));


David, I am very sorry for this error and I will be careful the next time.
Would you please let me know if I should resend a new patch or an incremental
based on previous one at 
https://git.kernel.org/cgit/linux/kernel/git/davem/net.git?

Thank you very much!

Dongli Zhang


----- Original Message -----
From: davem@davemloft.net
To: dongli.zhang@oracle.com
Cc: linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org, netdev@vger.kernel.org, boris.ostrovsky@oracle.com, david.vrabel@citrix.com, jgross@suse.com
Sent: Tuesday, November 1, 2016 4:06:27 AM GMT +08:00 Beijing / Chongqing / Hong Kong / Urumqi
Subject: Re: [PATCH 1/1] xen-netfront: do not cast grant table reference to signed short

From: Dongli Zhang <dongli.zhang@oracle.com>
Date: Mon, 31 Oct 2016 13:38:29 +0800

> While grant reference is of type uint32_t, xen-netfront erroneously casts
> it to signed short in BUG_ON().
> 
> This would lead to the xen domU panic during boot-up or migration when it
> is attached with lots of paravirtual devices.
> 
> Signed-off-by: Dongli Zhang <dongli.zhang@oracle.com>

Since this is consistent with how the macros in linux/err.h handle "is
this an error" checks, this change looks good to me.

Applied, thanks.

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2016-11-01 14:50 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-10-31  5:38 [PATCH 1/1] xen-netfront: do not cast grant table reference to signed short Dongli Zhang
2016-10-31  7:47 ` [Xen-devel] " Jan Beulich
2016-10-31 20:06 ` David Miller
2016-11-01  4:46 Dongli Zhang
2016-11-01 14:50 ` David Miller

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).