aboutsummaryrefslogtreecommitdiffstats
path: root/net/unix
diff options
context:
space:
mode:
authorThomas Graf <tgraf@suug.ch>2012-06-26 19:36:10 -0400
committerDavid S. Miller <davem@davemloft.net>2012-06-27 18:36:43 -0400
commit4245375db87767aacaad16f07040b5d89a9056c8 (patch)
tree246bf4a4b41ae1dd28f1b82137b598d4f669120d /net/unix
parentc074da2810c118b3812f32d6754bd9ead2f169e7 (diff)
unix_diag: Do not use RTA_PUT() macros
Also, no need to trim on nlmsg_put() failure, nothing has been added yet. We also want to use nlmsg_end(), nlmsg_new() and nlmsg_free(). Signed-off-by: Thomas Graf <tgraf@suug.ch> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/unix')
-rw-r--r--net/unix/diag.c80
1 files changed, 33 insertions, 47 deletions
diff --git a/net/unix/diag.c b/net/unix/diag.c
index 977ca317550d..a74864eedfcd 100644
--- a/net/unix/diag.c
+++ b/net/unix/diag.c
@@ -8,40 +8,31 @@
8#include <net/af_unix.h> 8#include <net/af_unix.h>
9#include <net/tcp_states.h> 9#include <net/tcp_states.h>
10 10
11#define UNIX_DIAG_PUT(skb, attrtype, attrlen) \
12 RTA_DATA(__RTA_PUT(skb, attrtype, attrlen))
13
14static int sk_diag_dump_name(struct sock *sk, struct sk_buff *nlskb) 11static int sk_diag_dump_name(struct sock *sk, struct sk_buff *nlskb)
15{ 12{
16 struct unix_address *addr = unix_sk(sk)->addr; 13 struct unix_address *addr = unix_sk(sk)->addr;
17 char *s;
18
19 if (addr) {
20 s = UNIX_DIAG_PUT(nlskb, UNIX_DIAG_NAME, addr->len - sizeof(short));
21 memcpy(s, addr->name->sun_path, addr->len - sizeof(short));
22 }
23 14
24 return 0; 15 if (!addr)
16 return 0;
25 17
26rtattr_failure: 18 return nla_put(nlskb, UNIX_DIAG_NAME, addr->len - sizeof(short),
27 return -EMSGSIZE; 19 addr->name->sun_path);
28} 20}
29 21
30static int sk_diag_dump_vfs(struct sock *sk, struct sk_buff *nlskb) 22static int sk_diag_dump_vfs(struct sock *sk, struct sk_buff *nlskb)
31{ 23{
32 struct dentry *dentry = unix_sk(sk)->path.dentry; 24 struct dentry *dentry = unix_sk(sk)->path.dentry;
33 struct unix_diag_vfs *uv;
34 25
35 if (dentry) { 26 if (dentry) {
36 uv = UNIX_DIAG_PUT(nlskb, UNIX_DIAG_VFS, sizeof(*uv)); 27 struct unix_diag_vfs uv = {
37 uv->udiag_vfs_ino = dentry->d_inode->i_ino; 28 .udiag_vfs_ino = dentry->d_inode->i_ino,
38 uv->udiag_vfs_dev = dentry->d_sb->s_dev; 29 .udiag_vfs_dev = dentry->d_sb->s_dev,
30 };
31
32 return nla_put(nlskb, UNIX_DIAG_VFS, sizeof(uv), &uv);
39 } 33 }
40 34
41 return 0; 35 return 0;
42
43rtattr_failure:
44 return -EMSGSIZE;
45} 36}
46 37
47static int sk_diag_dump_peer(struct sock *sk, struct sk_buff *nlskb) 38static int sk_diag_dump_peer(struct sock *sk, struct sk_buff *nlskb)
@@ -56,24 +47,28 @@ static int sk_diag_dump_peer(struct sock *sk, struct sk_buff *nlskb)
56 unix_state_unlock(peer); 47 unix_state_unlock(peer);
57 sock_put(peer); 48 sock_put(peer);
58 49
59 RTA_PUT_U32(nlskb, UNIX_DIAG_PEER, ino); 50 return nla_put_u32(nlskb, UNIX_DIAG_PEER, ino);
60 } 51 }
61 52
62 return 0; 53 return 0;
63rtattr_failure:
64 return -EMSGSIZE;
65} 54}
66 55
67static int sk_diag_dump_icons(struct sock *sk, struct sk_buff *nlskb) 56static int sk_diag_dump_icons(struct sock *sk, struct sk_buff *nlskb)
68{ 57{
69 struct sk_buff *skb; 58 struct sk_buff *skb;
59 struct nlattr *attr;
70 u32 *buf; 60 u32 *buf;
71 int i; 61 int i;
72 62
73 if (sk->sk_state == TCP_LISTEN) { 63 if (sk->sk_state == TCP_LISTEN) {
74 spin_lock(&sk->sk_receive_queue.lock); 64 spin_lock(&sk->sk_receive_queue.lock);
75 buf = UNIX_DIAG_PUT(nlskb, UNIX_DIAG_ICONS, 65
76 sk->sk_receive_queue.qlen * sizeof(u32)); 66 attr = nla_reserve(nlskb, UNIX_DIAG_ICONS,
67 sk->sk_receive_queue.qlen * sizeof(u32));
68 if (!attr)
69 goto errout;
70
71 buf = nla_data(attr);
77 i = 0; 72 i = 0;
78 skb_queue_walk(&sk->sk_receive_queue, skb) { 73 skb_queue_walk(&sk->sk_receive_queue, skb) {
79 struct sock *req, *peer; 74 struct sock *req, *peer;
@@ -94,45 +89,38 @@ static int sk_diag_dump_icons(struct sock *sk, struct sk_buff *nlskb)
94 89
95 return 0; 90 return 0;
96 91
97rtattr_failure: 92errout:
98 spin_unlock(&sk->sk_receive_queue.lock); 93 spin_unlock(&sk->sk_receive_queue.lock);
99 return -EMSGSIZE; 94 return -EMSGSIZE;
100} 95}
101 96
102static int sk_diag_show_rqlen(struct sock *sk, struct sk_buff *nlskb) 97static int sk_diag_show_rqlen(struct sock *sk, struct sk_buff *nlskb)
103{ 98{
104 struct unix_diag_rqlen *rql; 99 struct unix_diag_rqlen rql;
105
106 rql = UNIX_DIAG_PUT(nlskb, UNIX_DIAG_RQLEN, sizeof(*rql));
107 100
108 if (sk->sk_state == TCP_LISTEN) { 101 if (sk->sk_state == TCP_LISTEN) {
109 rql->udiag_rqueue = sk->sk_receive_queue.qlen; 102 rql.udiag_rqueue = sk->sk_receive_queue.qlen;
110 rql->udiag_wqueue = sk->sk_max_ack_backlog; 103 rql.udiag_wqueue = sk->sk_max_ack_backlog;
111 } else { 104 } else {
112 rql->udiag_rqueue = (__u32)unix_inq_len(sk); 105 rql.udiag_rqueue = (u32) unix_inq_len(sk);
113 rql->udiag_wqueue = (__u32)unix_outq_len(sk); 106 rql.udiag_wqueue = (u32) unix_outq_len(sk);
114 } 107 }
115 108
116 return 0; 109 return nla_put(nlskb, UNIX_DIAG_RQLEN, sizeof(rql), &rql);
117
118rtattr_failure:
119 return -EMSGSIZE;
120} 110}
121 111
122static int sk_diag_fill(struct sock *sk, struct sk_buff *skb, struct unix_diag_req *req, 112static int sk_diag_fill(struct sock *sk, struct sk_buff *skb, struct unix_diag_req *req,
123 u32 pid, u32 seq, u32 flags, int sk_ino) 113 u32 pid, u32 seq, u32 flags, int sk_ino)
124{ 114{
125 unsigned char *b = skb_tail_pointer(skb);
126 struct nlmsghdr *nlh; 115 struct nlmsghdr *nlh;
127 struct unix_diag_msg *rep; 116 struct unix_diag_msg *rep;
128 117
129 nlh = nlmsg_put(skb, pid, seq, SOCK_DIAG_BY_FAMILY, sizeof(*rep), 0); 118 nlh = nlmsg_put(skb, pid, seq, SOCK_DIAG_BY_FAMILY, sizeof(*rep),
119 flags);
130 if (!nlh) 120 if (!nlh)
131 goto out_nlmsg_trim; 121 return -EMSGSIZE;
132 nlh->nlmsg_flags = flags;
133 122
134 rep = nlmsg_data(nlh); 123 rep = nlmsg_data(nlh);
135
136 rep->udiag_family = AF_UNIX; 124 rep->udiag_family = AF_UNIX;
137 rep->udiag_type = sk->sk_type; 125 rep->udiag_type = sk->sk_type;
138 rep->udiag_state = sk->sk_state; 126 rep->udiag_state = sk->sk_state;
@@ -163,11 +151,10 @@ static int sk_diag_fill(struct sock *sk, struct sk_buff *skb, struct unix_diag_r
163 sock_diag_put_meminfo(sk, skb, UNIX_DIAG_MEMINFO)) 151 sock_diag_put_meminfo(sk, skb, UNIX_DIAG_MEMINFO))
164 goto out_nlmsg_trim; 152 goto out_nlmsg_trim;
165 153
166 nlh->nlmsg_len = skb_tail_pointer(skb) - b; 154 return nlmsg_end(skb, nlh);
167 return skb->len;
168 155
169out_nlmsg_trim: 156out_nlmsg_trim:
170 nlmsg_trim(skb, b); 157 nlmsg_cancel(skb, nlh);
171 return -EMSGSIZE; 158 return -EMSGSIZE;
172} 159}
173 160
@@ -272,15 +259,14 @@ static int unix_diag_get_exact(struct sk_buff *in_skb,
272 extra_len = 256; 259 extra_len = 256;
273again: 260again:
274 err = -ENOMEM; 261 err = -ENOMEM;
275 rep = alloc_skb(NLMSG_SPACE((sizeof(struct unix_diag_msg) + extra_len)), 262 rep = nlmsg_new(sizeof(struct unix_diag_msg) + extra_len, GFP_KERNEL);
276 GFP_KERNEL);
277 if (!rep) 263 if (!rep)
278 goto out; 264 goto out;
279 265
280 err = sk_diag_fill(sk, rep, req, NETLINK_CB(in_skb).pid, 266 err = sk_diag_fill(sk, rep, req, NETLINK_CB(in_skb).pid,
281 nlh->nlmsg_seq, 0, req->udiag_ino); 267 nlh->nlmsg_seq, 0, req->udiag_ino);
282 if (err < 0) { 268 if (err < 0) {
283 kfree_skb(rep); 269 nlmsg_free(rep);
284 extra_len += 256; 270 extra_len += 256;
285 if (extra_len >= PAGE_SIZE) 271 if (extra_len >= PAGE_SIZE)
286 goto out; 272 goto out;