diff mbox

xen-netback: correct return value checks on xenbus_scanf()

Message ID 577E277C02000078000FBEBB@prv-mh.provo.novell.com (mailing list archive)
State New, archived
Headers show

Commit Message

Jan Beulich July 7, 2016, 7:57 a.m. UTC
Only a positive return value indicates success.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
---
 drivers/net/xen-netback/xenbus.c |   26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

Comments

Paul Durrant July 7, 2016, 8:26 a.m. UTC | #1
> -----Original Message-----

> From: Xen-devel [mailto:xen-devel-bounces@lists.xen.org] On Behalf Of Jan

> Beulich

> Sent: 07 July 2016 08:57

> To: Wei Liu

> Cc: xen-devel@lists.xenproject.org; netdev@vger.kernel.org

> Subject: [Xen-devel] [PATCH] xen-netback: correct return value checks on

> xenbus_scanf()

> 

> Only a positive return value indicates success.

> 

> Signed-off-by: Jan Beulich <jbeulich@suse.com>


Reviewed-by: Paul Durrant <paul.durrant@citrix.com>


> ---

>  drivers/net/xen-netback/xenbus.c |   26 +++++++++++++-------------

>  1 file changed, 13 insertions(+), 13 deletions(-)

> 

> --- 4.7-rc6-xenbus_scanf.orig/drivers/net/xen-netback/xenbus.c

> +++ 4.7-rc6-xenbus_scanf/drivers/net/xen-netback/xenbus.c

> @@ -741,7 +741,7 @@ static void xen_mcast_ctrl_changed(struc

>  	int val;

> 

>  	if (xenbus_scanf(XBT_NIL, dev->otherend,

> -			 "request-multicast-control", "%d", &val) < 0)

> +			 "request-multicast-control", "%d", &val) <= 0)

>  		val = 0;

>  	vif->multicast_control = !!val;

>  }

> @@ -890,7 +890,7 @@ static void connect(struct backend_info

>  	err = xenbus_scanf(XBT_NIL, dev->otherend,

>  			   "multi-queue-num-queues",

>  			   "%u", &requested_num_queues);

> -	if (err < 0) {

> +	if (err <= 0) {

>  		requested_num_queues = 1; /* Fall back to single queue */

>  	} else if (requested_num_queues > xenvif_max_queues) {

>  		/* buggy or malicious guest */

> @@ -1056,7 +1056,7 @@ static int connect_data_rings(struct bac

>  	if (err < 0) {

>  		err = xenbus_scanf(XBT_NIL, xspath,

>  				   "event-channel", "%u", &tx_evtchn);

> -		if (err < 0) {

> +		if (err <= 0) {

>  			xenbus_dev_fatal(dev, err,

>  					 "reading %s/event-channel(-tx/rx)",

>  					 xspath);

> @@ -1092,10 +1092,10 @@ static int read_xenbus_vif_flags(struct

>  	err = xenbus_scanf(XBT_NIL, dev->otherend, "request-rx-copy",

> "%u",

>  			   &rx_copy);

>  	if (err == -ENOENT) {

> -		err = 0;

> +		err = 1;

>  		rx_copy = 0;

>  	}

> -	if (err < 0) {

> +	if (err <= 0) {

>  		xenbus_dev_fatal(dev, err, "reading %s/request-rx-copy",

>  				 dev->otherend);

>  		return err;

> @@ -1104,7 +1104,7 @@ static int read_xenbus_vif_flags(struct

>  		return -EOPNOTSUPP;

> 

>  	if (xenbus_scanf(XBT_NIL, dev->otherend,

> -			 "feature-rx-notify", "%d", &val) < 0)

> +			 "feature-rx-notify", "%d", &val) <= 0)

>  		val = 0;

>  	if (!val) {

>  		/* - Reduce drain timeout to poll more frequently for

> @@ -1116,7 +1116,7 @@ static int read_xenbus_vif_flags(struct

>  	}

> 

>  	if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-sg",

> -			 "%d", &val) < 0)

> +			 "%d", &val) <= 0)

>  		val = 0;

>  	vif->can_sg = !!val;

> 

> @@ -1124,25 +1124,25 @@ static int read_xenbus_vif_flags(struct

>  	vif->gso_prefix_mask = 0;

> 

>  	if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-gso-tcpv4",

> -			 "%d", &val) < 0)

> +			 "%d", &val) <= 0)

>  		val = 0;

>  	if (val)

>  		vif->gso_mask |= GSO_BIT(TCPV4);

> 

>  	if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-gso-tcpv4-

> prefix",

> -			 "%d", &val) < 0)

> +			 "%d", &val) <= 0)

>  		val = 0;

>  	if (val)

>  		vif->gso_prefix_mask |= GSO_BIT(TCPV4);

> 

>  	if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-gso-tcpv6",

> -			 "%d", &val) < 0)

> +			 "%d", &val) <= 0)

>  		val = 0;

>  	if (val)

>  		vif->gso_mask |= GSO_BIT(TCPV6);

> 

>  	if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-gso-tcpv6-

> prefix",

> -			 "%d", &val) < 0)

> +			 "%d", &val) <= 0)

>  		val = 0;

>  	if (val)

>  		vif->gso_prefix_mask |= GSO_BIT(TCPV6);

> @@ -1156,12 +1156,12 @@ static int read_xenbus_vif_flags(struct

>  	}

> 

>  	if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-no-csum-

> offload",

> -			 "%d", &val) < 0)

> +			 "%d", &val) <= 0)

>  		val = 0;

>  	vif->ip_csum = !val;

> 

>  	if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-ipv6-csum-

> offload",

> -			 "%d", &val) < 0)

> +			 "%d", &val) <= 0)

>  		val = 0;

>  	vif->ipv6_csum = !!val;

> 

> 

> 

> 

> 

> _______________________________________________

> Xen-devel mailing list

> Xen-devel@lists.xen.org

> https://lists.xen.org/xen-devel
David Vrabel July 7, 2016, 9:58 a.m. UTC | #2
On 07/07/16 08:57, Jan Beulich wrote:
> Only a positive return value indicates success.

This is not correct.

David
Wei Liu July 7, 2016, 10:35 a.m. UTC | #3
On Thu, Jul 07, 2016 at 10:58:16AM +0100, David Vrabel wrote:
> On 07/07/16 08:57, Jan Beulich wrote:
> > Only a positive return value indicates success.
> 
> This is not correct.
> 

Do you mean the commit message is not correct or the code is not
correct? If it is the formal, do you have any suggestion to fix it?

(I was going to just ack this because Paul already reviewed it)

Wei.

> David
Paul Durrant July 7, 2016, 10:40 a.m. UTC | #4
> -----Original Message-----
> From: netdev-owner@vger.kernel.org [mailto:netdev-
> owner@vger.kernel.org] On Behalf Of Wei Liu
> Sent: 07 July 2016 11:35
> To: David Vrabel
> Cc: Jan Beulich; Wei Liu; xen-devel@lists.xenproject.org;
> netdev@vger.kernel.org
> Subject: Re: [Xen-devel] [PATCH] xen-netback: correct return value checks
> on xenbus_scanf()
> 
> On Thu, Jul 07, 2016 at 10:58:16AM +0100, David Vrabel wrote:
> > On 07/07/16 08:57, Jan Beulich wrote:
> > > Only a positive return value indicates success.
> >
> > This is not correct.
> >

If Xen's vsscanf follows the semantics of scanf(3) then 0 is a failure so I think the comment is correct.

  Paul

> 
> Do you mean the commit message is not correct or the code is not
> correct? If it is the formal, do you have any suggestion to fix it?
> 
> (I was going to just ack this because Paul already reviewed it)
> 
> Wei.
> 
> > David
Paul Durrant July 7, 2016, 10:42 a.m. UTC | #5
> -----Original Message-----
> From: Paul Durrant
> Sent: 07 July 2016 11:41
> To: Wei Liu; David Vrabel
> Cc: Jan Beulich; Wei Liu; xen-devel@lists.xenproject.org;
> netdev@vger.kernel.org
> Subject: RE: [Xen-devel] [PATCH] xen-netback: correct return value checks
> on xenbus_scanf()
> 
> > -----Original Message-----
> > From: netdev-owner@vger.kernel.org [mailto:netdev-
> > owner@vger.kernel.org] On Behalf Of Wei Liu
> > Sent: 07 July 2016 11:35
> > To: David Vrabel
> > Cc: Jan Beulich; Wei Liu; xen-devel@lists.xenproject.org;
> > netdev@vger.kernel.org
> > Subject: Re: [Xen-devel] [PATCH] xen-netback: correct return value checks
> > on xenbus_scanf()
> >
> > On Thu, Jul 07, 2016 at 10:58:16AM +0100, David Vrabel wrote:
> > > On 07/07/16 08:57, Jan Beulich wrote:
> > > > Only a positive return value indicates success.
> > >
> > > This is not correct.
> > >
> 
> If Xen's vsscanf follows the semantics of scanf(3) then 0 is a failure so I think
> the comment is correct.
> 

s/Xen/the kernel/

>   Paul
> 
> >
> > Do you mean the commit message is not correct or the code is not
> > correct? If it is the formal, do you have any suggestion to fix it?
> >
> > (I was going to just ack this because Paul already reviewed it)
> >
> > Wei.
> >
> > > David
David Vrabel July 7, 2016, 10:45 a.m. UTC | #6
On 07/07/16 11:35, Wei Liu wrote:
> On Thu, Jul 07, 2016 at 10:58:16AM +0100, David Vrabel wrote:
>> On 07/07/16 08:57, Jan Beulich wrote:
>>> Only a positive return value indicates success.
>>
>> This is not correct.
>>
> 
> Do you mean the commit message is not correct or the code is not
> correct? If it is the formal, do you have any suggestion to fix it?

This code is correct as-is, thus the commit message is wrong or misleading.

David
Paul Durrant July 7, 2016, 10:55 a.m. UTC | #7
> -----Original Message-----

> From: netdev-owner@vger.kernel.org [mailto:netdev-

> owner@vger.kernel.org] On Behalf Of David Vrabel

> Sent: 07 July 2016 11:45

> To: Wei Liu; David Vrabel

> Cc: xen-devel@lists.xenproject.org; Jan Beulich; netdev@vger.kernel.org

> Subject: Re: [Xen-devel] [PATCH] xen-netback: correct return value checks

> on xenbus_scanf()

> 

> On 07/07/16 11:35, Wei Liu wrote:

> > On Thu, Jul 07, 2016 at 10:58:16AM +0100, David Vrabel wrote:

> >> On 07/07/16 08:57, Jan Beulich wrote:

> >>> Only a positive return value indicates success.

> >>

> >> This is not correct.

> >>

> >

> > Do you mean the commit message is not correct or the code is not

> > correct? If it is the formal, do you have any suggestion to fix it?

> 

> This code is correct as-is, thus the commit message is wrong or misleading.

> 


Is that true? Jan is correct in saying that only >0 is an indicator of success according to the usual semantics of sccanf(). Personally I think the code would be clearer if the checks for failure were < 1 rather than <= 0.

  Paul

> David
Jan Beulich July 7, 2016, 12:21 p.m. UTC | #8
>>> On 07.07.16 at 12:55, <Paul.Durrant@citrix.com> wrote:
>>  -----Original Message-----
>> From: netdev-owner@vger.kernel.org [mailto:netdev-
>> owner@vger.kernel.org] On Behalf Of David Vrabel
>> Sent: 07 July 2016 11:45
>> To: Wei Liu; David Vrabel
>> Cc: xen-devel@lists.xenproject.org; Jan Beulich; netdev@vger.kernel.org 
>> Subject: Re: [Xen-devel] [PATCH] xen-netback: correct return value checks
>> on xenbus_scanf()
>> 
>> On 07/07/16 11:35, Wei Liu wrote:
>> > On Thu, Jul 07, 2016 at 10:58:16AM +0100, David Vrabel wrote:
>> >> On 07/07/16 08:57, Jan Beulich wrote:
>> >>> Only a positive return value indicates success.
>> >>
>> >> This is not correct.
>> >>
>> >
>> > Do you mean the commit message is not correct or the code is not
>> > correct? If it is the formal, do you have any suggestion to fix it?
>> 
>> This code is correct as-is, thus the commit message is wrong or misleading.
> 
> Is that true? Jan is correct in saying that only >0 is an indicator of 
> success according to the usual semantics of sccanf().

As was correctly pointed out, xenbus_scanf(), other than scanf(),
can't return zero right now (which I think has corner cases where
this might be a problem). So if I would get the feeling that a
correction (benign or not at this point in time) would be accepted,
what about "Only a positive return value is guaranteed to indicates
success" as commit description?

> Personally I think the 
> code would be clearer if the checks for failure were < 1 rather than <= 0.

I'd be fine with that, albeit if comparing with any non-zero number
then I think it would better be == or != instead of < or <=.

Jan
diff mbox

Patch

--- 4.7-rc6-xenbus_scanf.orig/drivers/net/xen-netback/xenbus.c
+++ 4.7-rc6-xenbus_scanf/drivers/net/xen-netback/xenbus.c
@@ -741,7 +741,7 @@  static void xen_mcast_ctrl_changed(struc
 	int val;
 
 	if (xenbus_scanf(XBT_NIL, dev->otherend,
-			 "request-multicast-control", "%d", &val) < 0)
+			 "request-multicast-control", "%d", &val) <= 0)
 		val = 0;
 	vif->multicast_control = !!val;
 }
@@ -890,7 +890,7 @@  static void connect(struct backend_info
 	err = xenbus_scanf(XBT_NIL, dev->otherend,
 			   "multi-queue-num-queues",
 			   "%u", &requested_num_queues);
-	if (err < 0) {
+	if (err <= 0) {
 		requested_num_queues = 1; /* Fall back to single queue */
 	} else if (requested_num_queues > xenvif_max_queues) {
 		/* buggy or malicious guest */
@@ -1056,7 +1056,7 @@  static int connect_data_rings(struct bac
 	if (err < 0) {
 		err = xenbus_scanf(XBT_NIL, xspath,
 				   "event-channel", "%u", &tx_evtchn);
-		if (err < 0) {
+		if (err <= 0) {
 			xenbus_dev_fatal(dev, err,
 					 "reading %s/event-channel(-tx/rx)",
 					 xspath);
@@ -1092,10 +1092,10 @@  static int read_xenbus_vif_flags(struct
 	err = xenbus_scanf(XBT_NIL, dev->otherend, "request-rx-copy", "%u",
 			   &rx_copy);
 	if (err == -ENOENT) {
-		err = 0;
+		err = 1;
 		rx_copy = 0;
 	}
-	if (err < 0) {
+	if (err <= 0) {
 		xenbus_dev_fatal(dev, err, "reading %s/request-rx-copy",
 				 dev->otherend);
 		return err;
@@ -1104,7 +1104,7 @@  static int read_xenbus_vif_flags(struct
 		return -EOPNOTSUPP;
 
 	if (xenbus_scanf(XBT_NIL, dev->otherend,
-			 "feature-rx-notify", "%d", &val) < 0)
+			 "feature-rx-notify", "%d", &val) <= 0)
 		val = 0;
 	if (!val) {
 		/* - Reduce drain timeout to poll more frequently for
@@ -1116,7 +1116,7 @@  static int read_xenbus_vif_flags(struct
 	}
 
 	if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-sg",
-			 "%d", &val) < 0)
+			 "%d", &val) <= 0)
 		val = 0;
 	vif->can_sg = !!val;
 
@@ -1124,25 +1124,25 @@  static int read_xenbus_vif_flags(struct
 	vif->gso_prefix_mask = 0;
 
 	if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-gso-tcpv4",
-			 "%d", &val) < 0)
+			 "%d", &val) <= 0)
 		val = 0;
 	if (val)
 		vif->gso_mask |= GSO_BIT(TCPV4);
 
 	if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-gso-tcpv4-prefix",
-			 "%d", &val) < 0)
+			 "%d", &val) <= 0)
 		val = 0;
 	if (val)
 		vif->gso_prefix_mask |= GSO_BIT(TCPV4);
 
 	if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-gso-tcpv6",
-			 "%d", &val) < 0)
+			 "%d", &val) <= 0)
 		val = 0;
 	if (val)
 		vif->gso_mask |= GSO_BIT(TCPV6);
 
 	if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-gso-tcpv6-prefix",
-			 "%d", &val) < 0)
+			 "%d", &val) <= 0)
 		val = 0;
 	if (val)
 		vif->gso_prefix_mask |= GSO_BIT(TCPV6);
@@ -1156,12 +1156,12 @@  static int read_xenbus_vif_flags(struct
 	}
 
 	if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-no-csum-offload",
-			 "%d", &val) < 0)
+			 "%d", &val) <= 0)
 		val = 0;
 	vif->ip_csum = !val;
 
 	if (xenbus_scanf(XBT_NIL, dev->otherend, "feature-ipv6-csum-offload",
-			 "%d", &val) < 0)
+			 "%d", &val) <= 0)
 		val = 0;
 	vif->ipv6_csum = !!val;