Commit b47030c7 authored by Eric W. Biederman's avatar Eric W. Biederman Committed by David S. Miller

af_netlink: Add needed scm_destroy after scm_send.

scm_send occasionally allocates state in the scm_cookie, so I have
modified netlink_sendmsg to guarantee that when scm_send succeeds
scm_destory will be called to free that state.
Signed-off-by: default avatarEric W. Biederman <ebiederm@xmission.com>
Reviewed-by: default avatarDaniel Lezcano <daniel.lezcano@free.fr>
Acked-by: default avatarPavel Emelyanov <xemul@openvz.org>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 109f6e39
...@@ -1323,19 +1323,23 @@ static int netlink_sendmsg(struct kiocb *kiocb, struct socket *sock, ...@@ -1323,19 +1323,23 @@ static int netlink_sendmsg(struct kiocb *kiocb, struct socket *sock,
if (msg->msg_flags&MSG_OOB) if (msg->msg_flags&MSG_OOB)
return -EOPNOTSUPP; return -EOPNOTSUPP;
if (NULL == siocb->scm) if (NULL == siocb->scm) {
siocb->scm = &scm; siocb->scm = &scm;
memset(&scm, 0, sizeof(scm));
}
err = scm_send(sock, msg, siocb->scm); err = scm_send(sock, msg, siocb->scm);
if (err < 0) if (err < 0)
return err; return err;
if (msg->msg_namelen) { if (msg->msg_namelen) {
err = -EINVAL;
if (addr->nl_family != AF_NETLINK) if (addr->nl_family != AF_NETLINK)
return -EINVAL; goto out;
dst_pid = addr->nl_pid; dst_pid = addr->nl_pid;
dst_group = ffs(addr->nl_groups); dst_group = ffs(addr->nl_groups);
err = -EPERM;
if (dst_group && !netlink_capable(sock, NL_NONROOT_SEND)) if (dst_group && !netlink_capable(sock, NL_NONROOT_SEND))
return -EPERM; goto out;
} else { } else {
dst_pid = nlk->dst_pid; dst_pid = nlk->dst_pid;
dst_group = nlk->dst_group; dst_group = nlk->dst_group;
...@@ -1387,6 +1391,7 @@ static int netlink_sendmsg(struct kiocb *kiocb, struct socket *sock, ...@@ -1387,6 +1391,7 @@ static int netlink_sendmsg(struct kiocb *kiocb, struct socket *sock,
err = netlink_unicast(sk, skb, dst_pid, msg->msg_flags&MSG_DONTWAIT); err = netlink_unicast(sk, skb, dst_pid, msg->msg_flags&MSG_DONTWAIT);
out: out:
scm_destroy(siocb->scm);
return err; return err;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment