diff options
| -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 fbcac76fdc0d..4102de1022ee 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, | |||
| 641 | 641 | ||
| 642 | case SO_BINDTODEVICE: | 642 | case SO_BINDTODEVICE: |
| 643 | if (optlen > IFNAMSIZ) | 643 | if (optlen > IFNAMSIZ) |
| 644 | optlen=IFNAMSIZ; | 644 | optlen = IFNAMSIZ; |
| 645 | if (copy_from_user(devname, optval, optlen)) { | ||
| 646 | res = -EFAULT; | ||
| 647 | break; | ||
| 648 | } | ||
| 649 | 645 | ||
| 650 | dev = dev_get_by_name(&init_net, devname); | 646 | if (copy_from_user(devname, optval, optlen)) { |
| 651 | if (dev == NULL) { | 647 | res = -EFAULT; |
| 652 | res = -ENODEV; | ||
| 653 | break; | 648 | break; |
| 654 | } | 649 | } |
| 655 | 650 | ||
| @@ -657,12 +652,18 @@ static int ax25_setsockopt(struct socket *sock, int level, int optname, | |||
| 657 | (sock->state != SS_UNCONNECTED || | 652 | (sock->state != SS_UNCONNECTED || |
| 658 | sk->sk_state == TCP_LISTEN)) { | 653 | sk->sk_state == TCP_LISTEN)) { |
| 659 | res = -EADDRNOTAVAIL; | 654 | res = -EADDRNOTAVAIL; |
| 660 | dev_put(dev); | 655 | break; |
| 656 | } | ||
| 657 | |||
| 658 | dev = dev_get_by_name(&init_net, devname); | ||
| 659 | if (!dev) { | ||
| 660 | res = -ENODEV; | ||
| 661 | break; | 661 | break; |
| 662 | } | 662 | } |
| 663 | 663 | ||
| 664 | ax25->ax25_dev = ax25_dev_ax25dev(dev); | 664 | ax25->ax25_dev = ax25_dev_ax25dev(dev); |
| 665 | ax25_fillin_cb(ax25, ax25->ax25_dev); | 665 | ax25_fillin_cb(ax25, ax25->ax25_dev); |
| 666 | dev_put(dev); | ||
| 666 | break; | 667 | break; |
| 667 | 668 | ||
| 668 | default: | 669 | default: |
