rtnetlink: Fix error handling in do_setlink()
authorDavid Howells <dhowells@redhat.com>
Fri, 21 May 2010 02:25:27 +0000 (02:25 +0000)
committerDavid S. Miller <davem@davemloft.net>
Mon, 24 May 2010 06:11:08 +0000 (23:11 -0700)
Commit c02db8c6290bb992442fec1407643c94cc414375:

Author:  Chris Wright <chrisw@sous-sol.org>
Date:    Sun May 16 01:05:45 2010 -0700
Subject: rtnetlink: make SR-IOV VF interface symmetric

adds broken error handling to do_setlink() in net/core/rtnetlink.c.  The
problem is the following chunk of code:

if (tb[IFLA_VFINFO_LIST]) {
struct nlattr *attr;
int rem;
nla_for_each_nested(attr, tb[IFLA_VFINFO_LIST], rem) {
if (nla_type(attr) != IFLA_VF_INFO)
  ----> goto errout;
err = do_setvfinfo(dev, attr);
if (err < 0)
goto errout;
modified = 1;
}
}

which can get to errout without setting err, resulting in the following error:

net/core/rtnetlink.c: In function 'do_setlink':
net/core/rtnetlink.c:904: warning: 'err' may be used uninitialized in this function

Change the code to return -EINVAL in this case.  Note that this might not be
the appropriate error though.

Signed-off-by: David Howells <dhowells@redhat.com>
cc: Chris Wright <chrisw@sous-sol.org>
cc: David S. Miller <davem@davemloft.net>
Acked-by: Chris Wright <chrisw@sous-sol.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/rtnetlink.c

index e4b9870e4706f7f4cf3e84b798f752c7e972f2fb..7ab86f3a1ea45e3d8c31a2df846b9e62024a1b88 100644 (file)
@@ -1199,8 +1199,10 @@ static int do_setlink(struct net_device *dev, struct ifinfomsg *ifm,
                struct nlattr *attr;
                int rem;
                nla_for_each_nested(attr, tb[IFLA_VFINFO_LIST], rem) {
-                       if (nla_type(attr) != IFLA_VF_INFO)
+                       if (nla_type(attr) != IFLA_VF_INFO) {
+                               err = -EINVAL;
                                goto errout;
+                       }
                        err = do_setvfinfo(dev, attr);
                        if (err < 0)
                                goto errout;