aboutsummaryrefslogtreecommitdiffstats
path: root/net/netlink
diff options
context:
space:
mode:
Diffstat (limited to 'net/netlink')
-rw-r--r--net/netlink/af_netlink.c27
1 files changed, 14 insertions, 13 deletions
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c
index 478181d53c55..c8f35b5d2ee9 100644
--- a/net/netlink/af_netlink.c
+++ b/net/netlink/af_netlink.c
@@ -1362,17 +1362,8 @@ static int netlink_sendmsg(struct kiocb *kiocb, struct socket *sock,
1362 1362
1363 NETLINK_CB(skb).pid = nlk->pid; 1363 NETLINK_CB(skb).pid = nlk->pid;
1364 NETLINK_CB(skb).dst_group = dst_group; 1364 NETLINK_CB(skb).dst_group = dst_group;
1365 NETLINK_CB(skb).loginuid = audit_get_loginuid(current);
1366 NETLINK_CB(skb).sessionid = audit_get_sessionid(current);
1367 security_task_getsecid(current, &(NETLINK_CB(skb).sid));
1368 memcpy(NETLINK_CREDS(skb), &siocb->scm->creds, sizeof(struct ucred)); 1365 memcpy(NETLINK_CREDS(skb), &siocb->scm->creds, sizeof(struct ucred));
1369 1366
1370 /* What can I do? Netlink is asynchronous, so that
1371 we will have to save current capabilities to
1372 check them, when this message will be delivered
1373 to corresponding kernel module. --ANK (980802)
1374 */
1375
1376 err = -EFAULT; 1367 err = -EFAULT;
1377 if (memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len)) { 1368 if (memcpy_fromiovec(skb_put(skb, len), msg->msg_iov, len)) {
1378 kfree_skb(skb); 1369 kfree_skb(skb);
@@ -1407,7 +1398,7 @@ static int netlink_recvmsg(struct kiocb *kiocb, struct socket *sock,
1407 int noblock = flags&MSG_DONTWAIT; 1398 int noblock = flags&MSG_DONTWAIT;
1408 size_t copied; 1399 size_t copied;
1409 struct sk_buff *skb, *data_skb; 1400 struct sk_buff *skb, *data_skb;
1410 int err; 1401 int err, ret;
1411 1402
1412 if (flags&MSG_OOB) 1403 if (flags&MSG_OOB)
1413 return -EOPNOTSUPP; 1404 return -EOPNOTSUPP;
@@ -1470,8 +1461,13 @@ static int netlink_recvmsg(struct kiocb *kiocb, struct socket *sock,
1470 1461
1471 skb_free_datagram(sk, skb); 1462 skb_free_datagram(sk, skb);
1472 1463
1473 if (nlk->cb && atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf / 2) 1464 if (nlk->cb && atomic_read(&sk->sk_rmem_alloc) <= sk->sk_rcvbuf / 2) {
1474 netlink_dump(sk); 1465 ret = netlink_dump(sk);
1466 if (ret) {
1467 sk->sk_err = ret;
1468 sk->sk_error_report(sk);
1469 }
1470 }
1475 1471
1476 scm_recv(sock, msg, siocb->scm, flags); 1472 scm_recv(sock, msg, siocb->scm, flags);
1477out: 1473out:
@@ -1736,6 +1732,7 @@ int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
1736 struct netlink_callback *cb; 1732 struct netlink_callback *cb;
1737 struct sock *sk; 1733 struct sock *sk;
1738 struct netlink_sock *nlk; 1734 struct netlink_sock *nlk;
1735 int ret;
1739 1736
1740 cb = kzalloc(sizeof(*cb), GFP_KERNEL); 1737 cb = kzalloc(sizeof(*cb), GFP_KERNEL);
1741 if (cb == NULL) 1738 if (cb == NULL)
@@ -1764,9 +1761,13 @@ int netlink_dump_start(struct sock *ssk, struct sk_buff *skb,
1764 nlk->cb = cb; 1761 nlk->cb = cb;
1765 mutex_unlock(nlk->cb_mutex); 1762 mutex_unlock(nlk->cb_mutex);
1766 1763
1767 netlink_dump(sk); 1764 ret = netlink_dump(sk);
1765
1768 sock_put(sk); 1766 sock_put(sk);
1769 1767
1768 if (ret)
1769 return ret;
1770
1770 /* We successfully started a dump, by returning -EINTR we 1771 /* We successfully started a dump, by returning -EINTR we
1771 * signal not to send ACK even if it was requested. 1772 * signal not to send ACK even if it was requested.
1772 */ 1773 */