diff options
author | Ralf Baechle <ralf@linux-mips.org> | 2009-09-28 12:26:28 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2009-09-28 12:26:28 -0700 |
commit | 2f72291d3d0e440f9343c7b97dc233c1a122165a (patch) | |
tree | f2cdcf5bfd4b44387751c6339cf996e8ef455559 /net/ax25 | |
parent | d1f8297a96b0d70f17704296a6666468f2087ce6 (diff) | |
download | kernel-mfld-blackbay-2f72291d3d0e440f9343c7b97dc233c1a122165a.tar.gz kernel-mfld-blackbay-2f72291d3d0e440f9343c7b97dc233c1a122165a.tar.bz2 kernel-mfld-blackbay-2f72291d3d0e440f9343c7b97dc233c1a122165a.zip |
ax25: Add missing dev_put in ax25_setsockopt
ax25_setsockopt SO_BINDTODEVICE is missing a dev_put call in case of
success. Re-order code to fix this bug. While at it also reformat two
lines of code to comply with the Linux coding style.
Initial patch by Jarek Poplawski <jarkao2@gmail.com>.
Reported-by: Bernard Pidoux F6BVP <f6bvp@free.fr>
Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ax25')
-rw-r--r-- | net/ax25/af_ax25.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/net/ax25/af_ax25.c b/net/ax25/af_ax25.c index fbcac76fdc0..4102de1022e 100644 --- a/net/ax25/af_ax25.c +++ b/net/ax25/af_ax25.c @@ -641,15 +641,10 @@ static int ax25_setsockopt(struct socket *sock, int level, int optname, case SO_BINDTODEVICE: if (optlen > IFNAMSIZ) - optlen=IFNAMSIZ; - if (copy_from_user(devname, optval, optlen)) { - res = -EFAULT; - break; - } + optlen = IFNAMSIZ; - dev = dev_get_by_name(&init_net, devname); - if (dev == NULL) { - res = -ENODEV; + if (copy_from_user(devname, optval, optlen)) { + res = -EFAULT; break; } @@ -657,12 +652,18 @@ static int ax25_setsockopt(struct socket *sock, int level, int optname, (sock->state != SS_UNCONNECTED || sk->sk_state == TCP_LISTEN)) { res = -EADDRNOTAVAIL; - dev_put(dev); + break; + } + + dev = dev_get_by_name(&init_net, devname); + if (!dev) { + res = -ENODEV; break; } ax25->ax25_dev = ax25_dev_ax25dev(dev); ax25_fillin_cb(ax25, ax25->ax25_dev); + dev_put(dev); break; default: |