diff options
author | Thomas Graf <tgraf@suug.ch> | 2012-06-26 19:36:10 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-06-27 18:36:43 -0400 |
commit | 4245375db87767aacaad16f07040b5d89a9056c8 (patch) | |
tree | 246bf4a4b41ae1dd28f1b82137b598d4f669120d /net/unix | |
parent | c074da2810c118b3812f32d6754bd9ead2f169e7 (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.c | 80 |
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 | |||
14 | static int sk_diag_dump_name(struct sock *sk, struct sk_buff *nlskb) | 11 | static 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 | ||
26 | rtattr_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 | ||
30 | static int sk_diag_dump_vfs(struct sock *sk, struct sk_buff *nlskb) | 22 | static 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 | |||
43 | rtattr_failure: | ||
44 | return -EMSGSIZE; | ||
45 | } | 36 | } |
46 | 37 | ||
47 | static int sk_diag_dump_peer(struct sock *sk, struct sk_buff *nlskb) | 38 | static 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; |
63 | rtattr_failure: | ||
64 | return -EMSGSIZE; | ||
65 | } | 54 | } |
66 | 55 | ||
67 | static int sk_diag_dump_icons(struct sock *sk, struct sk_buff *nlskb) | 56 | static 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 | ||
97 | rtattr_failure: | 92 | errout: |
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 | ||
102 | static int sk_diag_show_rqlen(struct sock *sk, struct sk_buff *nlskb) | 97 | static 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 | |||
118 | rtattr_failure: | ||
119 | return -EMSGSIZE; | ||
120 | } | 110 | } |
121 | 111 | ||
122 | static int sk_diag_fill(struct sock *sk, struct sk_buff *skb, struct unix_diag_req *req, | 112 | static 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 | ||
169 | out_nlmsg_trim: | 156 | out_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; |
273 | again: | 260 | again: |
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; |