netback: don't store invalid vif pointer
authorJan Beulich <JBeulich@suse.com>
Tue, 9 Dec 2014 11:47:04 +0000 (11:47 +0000)
committerDavid S. Miller <davem@davemloft.net>
Tue, 9 Dec 2014 23:30:08 +0000 (18:30 -0500)
When xenvif_alloc() fails, it returns a non-NULL error indicator. To
avoid eventual races, we shouldn't store that into struct backend_info
as readers of it only check for NULL.

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Acked-by: Ian Campbell <ian.campbell@citrix.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/xen-netback/xenbus.c

index fab0d4b42f58fca511dc447b62ea91607732ba81..d44cd19169bdd64a6044d1fc4fcf6a9a4a7ab357 100644 (file)
@@ -404,6 +404,7 @@ static int backend_create_xenvif(struct backend_info *be)
        int err;
        long handle;
        struct xenbus_device *dev = be->dev;
+       struct xenvif *vif;
 
        if (be->vif != NULL)
                return 0;
@@ -414,13 +415,13 @@ static int backend_create_xenvif(struct backend_info *be)
                return (err < 0) ? err : -EINVAL;
        }
 
-       be->vif = xenvif_alloc(&dev->dev, dev->otherend_id, handle);
-       if (IS_ERR(be->vif)) {
-               err = PTR_ERR(be->vif);
-               be->vif = NULL;
+       vif = xenvif_alloc(&dev->dev, dev->otherend_id, handle);
+       if (IS_ERR(vif)) {
+               err = PTR_ERR(vif);
                xenbus_dev_fatal(dev, err, "creating interface");
                return err;
        }
+       be->vif = vif;
 
        kobject_uevent(&dev->dev.kobj, KOBJ_ONLINE);
        return 0;