net: convert sk_buff.users from atomic_t to refcount_t
refcount_t type and corresponding API should be used instead of atomic_t when the variable is used as a reference counter. This allows to avoid accidental refcounter overflows that might lead to use-after-free situations. Signed-off-by: Elena Reshetova <elena.reshetova@intel.com> Signed-off-by: Hans Liljestrand <ishkamiel@gmail.com> Signed-off-by: Kees Cook <keescook@chromium.org> Signed-off-by: David Windsor <dwindsor@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
这个提交包含在:
@@ -1848,7 +1848,7 @@ static int netlink_sendmsg(struct socket *sock, struct msghdr *msg, size_t len)
|
||||
}
|
||||
|
||||
if (dst_group) {
|
||||
atomic_inc(&skb->users);
|
||||
refcount_inc(&skb->users);
|
||||
netlink_broadcast(sk, skb, dst_portid, dst_group, GFP_KERNEL);
|
||||
}
|
||||
err = netlink_unicast(sk, skb, dst_portid, msg->msg_flags&MSG_DONTWAIT);
|
||||
@@ -2226,7 +2226,7 @@ int __netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
|
||||
struct netlink_sock *nlk;
|
||||
int ret;
|
||||
|
||||
atomic_inc(&skb->users);
|
||||
refcount_inc(&skb->users);
|
||||
|
||||
sk = netlink_lookup(sock_net(ssk), ssk->sk_protocol, NETLINK_CB(skb).portid);
|
||||
if (sk == NULL) {
|
||||
@@ -2431,7 +2431,7 @@ int nlmsg_notify(struct sock *sk, struct sk_buff *skb, u32 portid,
|
||||
int exclude_portid = 0;
|
||||
|
||||
if (report) {
|
||||
atomic_inc(&skb->users);
|
||||
refcount_inc(&skb->users);
|
||||
exclude_portid = portid;
|
||||
}
|
||||
|
||||
|
在新工单中引用
屏蔽一个用户