diff options
author | Tim Smith <tim@electronghost.co.uk> | 2014-02-07 13:58:43 -0500 |
---|---|---|
committer | David Howells <dhowells@redhat.com> | 2014-02-07 13:58:43 -0500 |
commit | 8961749e5f498d91ded20dc797bb77aa366bca2e (patch) | |
tree | 08c688b2a90f43617e18c0efc26f308722a89e53 | |
parent | 38dbfb59d1175ef458d006556061adeaa8751b72 (diff) |
af_rxrpc: Remove incorrect checksum calculation from rxrpc_recvmsg()
The UDP checksum was already verified in rxrpc_data_ready() - which calls
skb_checksum_complete() - as the RxRPC packet header contains no checksum of
its own. Subsequent calls to skb_copy_and_csum_datagram_iovec() are thus
redundant and are, in any case, being passed only a subset of the UDP payload -
so the checksum will always fail if that path is taken.
So there is no need to check skb->ip_summed in rxrpc_recvmsg(), and no need for
the csum_copy_error: exit path.
Signed-off-by: Tim Smith <tim@electronghost.co.uk>
Signed-off-by: David Howells <dhowells@redhat.com>
-rw-r--r-- | net/rxrpc/ar-recvmsg.c | 25 |
1 files changed, 1 insertions, 24 deletions
diff --git a/net/rxrpc/ar-recvmsg.c b/net/rxrpc/ar-recvmsg.c index 34b5490dde65..e9aaa65c0778 100644 --- a/net/rxrpc/ar-recvmsg.c +++ b/net/rxrpc/ar-recvmsg.c | |||
@@ -180,16 +180,7 @@ int rxrpc_recvmsg(struct kiocb *iocb, struct socket *sock, | |||
180 | if (copy > len - copied) | 180 | if (copy > len - copied) |
181 | copy = len - copied; | 181 | copy = len - copied; |
182 | 182 | ||
183 | if (skb->ip_summed == CHECKSUM_UNNECESSARY || | 183 | ret = skb_copy_datagram_iovec(skb, offset, msg->msg_iov, copy); |
184 | skb->ip_summed == CHECKSUM_PARTIAL) { | ||
185 | ret = skb_copy_datagram_iovec(skb, offset, | ||
186 | msg->msg_iov, copy); | ||
187 | } else { | ||
188 | ret = skb_copy_and_csum_datagram_iovec(skb, offset, | ||
189 | msg->msg_iov); | ||
190 | if (ret == -EINVAL) | ||
191 | goto csum_copy_error; | ||
192 | } | ||
193 | 184 | ||
194 | if (ret < 0) | 185 | if (ret < 0) |
195 | goto copy_error; | 186 | goto copy_error; |
@@ -348,20 +339,6 @@ copy_error: | |||
348 | _leave(" = %d", ret); | 339 | _leave(" = %d", ret); |
349 | return ret; | 340 | return ret; |
350 | 341 | ||
351 | csum_copy_error: | ||
352 | _debug("csum error"); | ||
353 | release_sock(&rx->sk); | ||
354 | if (continue_call) | ||
355 | rxrpc_put_call(continue_call); | ||
356 | rxrpc_kill_skb(skb); | ||
357 | if (!(flags & MSG_PEEK)) { | ||
358 | if (skb_dequeue(&rx->sk.sk_receive_queue) != skb) | ||
359 | BUG(); | ||
360 | } | ||
361 | skb_kill_datagram(&rx->sk, skb, flags); | ||
362 | rxrpc_put_call(call); | ||
363 | return -EAGAIN; | ||
364 | |||
365 | wait_interrupted: | 342 | wait_interrupted: |
366 | ret = sock_intr_errno(timeo); | 343 | ret = sock_intr_errno(timeo); |
367 | wait_error: | 344 | wait_error: |