Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8961749e authored by Tim Smith's avatar Tim Smith Committed by David Howells
Browse files

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: default avatarTim Smith <tim@electronghost.co.uk>
Signed-off-by: default avatarDavid Howells <dhowells@redhat.com>
parent 38dbfb59
Loading
Loading
Loading
Loading
+1 −24
Original line number Diff line number Diff line
@@ -180,16 +180,7 @@ int rxrpc_recvmsg(struct kiocb *iocb, struct socket *sock,
		if (copy > len - copied)
			copy = len - copied;

		if (skb->ip_summed == CHECKSUM_UNNECESSARY ||
		    skb->ip_summed == CHECKSUM_PARTIAL) {
			ret = skb_copy_datagram_iovec(skb, offset,
						      msg->msg_iov, copy);
		} else {
			ret = skb_copy_and_csum_datagram_iovec(skb, offset,
							       msg->msg_iov);
			if (ret == -EINVAL)
				goto csum_copy_error;
		}
		ret = skb_copy_datagram_iovec(skb, offset, msg->msg_iov, copy);

		if (ret < 0)
			goto copy_error;
@@ -348,20 +339,6 @@ int rxrpc_recvmsg(struct kiocb *iocb, struct socket *sock,
	_leave(" = %d", ret);
	return ret;

csum_copy_error:
	_debug("csum error");
	release_sock(&rx->sk);
	if (continue_call)
		rxrpc_put_call(continue_call);
	rxrpc_kill_skb(skb);
	if (!(flags & MSG_PEEK)) {
		if (skb_dequeue(&rx->sk.sk_receive_queue) != skb)
			BUG();
	}
	skb_kill_datagram(&rx->sk, skb, flags);
	rxrpc_put_call(call);
	return -EAGAIN;

wait_interrupted:
	ret = sock_intr_errno(timeo);
wait_error: