From: yuan linyu <linyu.y...@alcatel-sbell.com.cn> Signed-off-by: yuan linyu <linyu.y...@alcatel-sbell.com.cn> --- net/netlink/af_netlink.c | 54 +++++++++++++++++++++--------------------------- 1 file changed, 23 insertions(+), 31 deletions(-)
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index b9e0ee4..37ce0d3 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c @@ -533,14 +533,16 @@ static int netlink_insert(struct sock *sk, u32 portid) lock_sock(sk); - err = nlk_sk(sk)->portid == portid ? 0 : -EBUSY; - if (nlk_sk(sk)->bound) + if (nlk_sk(sk)->bound) { + err = nlk_sk(sk)->portid == portid ? 0 : -EBUSY; goto err; + } - err = -ENOMEM; if (BITS_PER_LONG > 32 && - unlikely(atomic_read(&table->hash.nelems) >= UINT_MAX)) + unlikely(atomic_read(&table->hash.nelems) >= UINT_MAX)) { + err = -ENOMEM; goto err; + } nlk_sk(sk)->portid = portid; sock_hold(sk); @@ -1585,8 +1587,8 @@ static int netlink_setsockopt(struct socket *sock, int level, int optname, { struct sock *sk = sock->sk; struct netlink_sock *nlk = nlk_sk(sk); - unsigned int val = 0; - int err; + unsigned int val; + int err = 0; if (level != SOL_NETLINK) return -ENOPROTOOPT; @@ -1601,7 +1603,6 @@ static int netlink_setsockopt(struct socket *sock, int level, int optname, nlk->flags |= NETLINK_F_RECV_PKTINFO; else nlk->flags &= ~NETLINK_F_RECV_PKTINFO; - err = 0; break; case NETLINK_ADD_MEMBERSHIP: case NETLINK_DROP_MEMBERSHIP: { @@ -1623,8 +1624,6 @@ static int netlink_setsockopt(struct socket *sock, int level, int optname, netlink_table_ungrab(); if (optname == NETLINK_DROP_MEMBERSHIP && nlk->netlink_unbind) nlk->netlink_unbind(sock_net(sk), val); - - err = 0; break; } case NETLINK_BROADCAST_ERROR: @@ -1632,7 +1631,6 @@ static int netlink_setsockopt(struct socket *sock, int level, int optname, nlk->flags |= NETLINK_F_BROADCAST_SEND_ERROR; else nlk->flags &= ~NETLINK_F_BROADCAST_SEND_ERROR; - err = 0; break; case NETLINK_NO_ENOBUFS: if (val) { @@ -1642,7 +1640,6 @@ static int netlink_setsockopt(struct socket *sock, int level, int optname, } else { nlk->flags &= ~NETLINK_F_RECV_NO_ENOBUFS; } - err = 0; break; case NETLINK_LISTEN_ALL_NSID: if (!ns_capable(sock_net(sk)->user_ns, CAP_NET_BROADCAST)) @@ -1652,21 +1649,18 @@ static int netlink_setsockopt(struct socket *sock, int level, int optname, nlk->flags |= NETLINK_F_LISTEN_ALL_NSID; else nlk->flags &= ~NETLINK_F_LISTEN_ALL_NSID; - err = 0; break; case NETLINK_CAP_ACK: if (val) nlk->flags |= NETLINK_F_CAP_ACK; else nlk->flags &= ~NETLINK_F_CAP_ACK; - err = 0; break; case NETLINK_EXT_ACK: if (val) nlk->flags |= NETLINK_F_EXT_ACK; else nlk->flags &= ~NETLINK_F_EXT_ACK; - err = 0; break; default: err = -ENOPROTOOPT; @@ -1679,7 +1673,7 @@ static int netlink_getsockopt(struct socket *sock, int level, int optname, { struct sock *sk = sock->sk; struct netlink_sock *nlk = nlk_sk(sk); - int len, val, err; + int len, val, err = 0; if (level != SOL_NETLINK) return -ENOPROTOOPT; @@ -1698,7 +1692,6 @@ static int netlink_getsockopt(struct socket *sock, int level, int optname, if (put_user(len, optlen) || put_user(val, optval)) return -EFAULT; - err = 0; break; case NETLINK_BROADCAST_ERROR: if (len < sizeof(int)) @@ -1708,7 +1701,6 @@ static int netlink_getsockopt(struct socket *sock, int level, int optname, if (put_user(len, optlen) || put_user(val, optval)) return -EFAULT; - err = 0; break; case NETLINK_NO_ENOBUFS: if (len < sizeof(int)) @@ -1718,12 +1710,10 @@ static int netlink_getsockopt(struct socket *sock, int level, int optname, if (put_user(len, optlen) || put_user(val, optval)) return -EFAULT; - err = 0; break; case NETLINK_LIST_MEMBERSHIPS: { int pos, idx, shift; - err = 0; netlink_lock_table(); for (pos = 0; pos * 8 < nlk->ngroups; pos += sizeof(u32)) { if (len - pos < sizeof(u32)) @@ -1750,7 +1740,6 @@ static int netlink_getsockopt(struct socket *sock, int level, int optname, if (put_user(len, optlen) || put_user(val, optval)) return -EFAULT; - err = 0; break; case NETLINK_EXT_ACK: if (len < sizeof(int)) @@ -1759,7 +1748,6 @@ static int netlink_getsockopt(struct socket *sock, int level, int optname, val = nlk->flags & NETLINK_F_EXT_ACK ? 1 : 0; if (put_user(len, optlen) || put_user(val, optval)) return -EFAULT; - err = 0; break; default: err = -ENOPROTOOPT; @@ -1805,15 +1793,17 @@ static int netlink_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) return err; if (msg->msg_namelen) { - err = -EINVAL; - if (addr->nl_family != AF_NETLINK) + if (addr->nl_family != AF_NETLINK) { + err = -EINVAL; goto out; + } dst_portid = addr->nl_pid; dst_group = ffs(addr->nl_groups); - err = -EPERM; if ((dst_group || dst_portid) && - !netlink_allowed(sock, NL_CFG_F_NONROOT_SEND)) + !netlink_allowed(sock, NL_CFG_F_NONROOT_SEND)) { + err = -EPERM; goto out; + } netlink_skb_flags |= NETLINK_SKB_DST; } else { dst_portid = nlk->dst_portid; @@ -1829,22 +1819,24 @@ static int netlink_sendmsg(struct socket *sock, struct msghdr *msg, size_t len) smp_rmb(); } - err = -EMSGSIZE; - if (len > sk->sk_sndbuf - 32) + if (len > sk->sk_sndbuf - 32) { + err = -EMSGSIZE; goto out; - err = -ENOBUFS; + } skb = netlink_alloc_large_skb(len, dst_group); - if (skb == NULL) + if (skb == NULL) { + err = -ENOBUFS; goto out; + } NETLINK_CB(skb).portid = nlk->portid; NETLINK_CB(skb).dst_group = dst_group; NETLINK_CB(skb).creds = scm.creds; NETLINK_CB(skb).flags = netlink_skb_flags; - err = -EFAULT; if (memcpy_from_msg(skb_put(skb, len), msg, len)) { kfree_skb(skb); + err = -EFAULT; goto out; } @@ -2711,7 +2703,7 @@ static int __init netlink_proto_init(void) int i; int err = proto_register(&netlink_proto, 0); - if (err != 0) + if (err) goto out; BUILD_BUG_ON(sizeof(struct netlink_skb_parms) > FIELD_SIZEOF(struct sk_buff, cb)); -- 2.7.4