aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--net/core/datagram.c13
1 files changed, 7 insertions, 6 deletions
diff --git a/net/core/datagram.c b/net/core/datagram.c
index f4947e737f34..d797baa69e43 100644
--- a/net/core/datagram.c
+++ b/net/core/datagram.c
@@ -760,7 +760,7 @@ int skb_copy_and_csum_datagram_msg(struct sk_buff *skb,
760 760
761 if (msg_data_left(msg) < chunk) { 761 if (msg_data_left(msg) < chunk) {
762 if (__skb_checksum_complete(skb)) 762 if (__skb_checksum_complete(skb))
763 goto csum_error; 763 return -EINVAL;
764 if (skb_copy_datagram_msg(skb, hlen, msg, chunk)) 764 if (skb_copy_datagram_msg(skb, hlen, msg, chunk))
765 goto fault; 765 goto fault;
766 } else { 766 } else {
@@ -768,15 +768,16 @@ int skb_copy_and_csum_datagram_msg(struct sk_buff *skb,
768 if (skb_copy_and_csum_datagram(skb, hlen, &msg->msg_iter, 768 if (skb_copy_and_csum_datagram(skb, hlen, &msg->msg_iter,
769 chunk, &csum)) 769 chunk, &csum))
770 goto fault; 770 goto fault;
771 if (csum_fold(csum)) 771
772 goto csum_error; 772 if (csum_fold(csum)) {
773 iov_iter_revert(&msg->msg_iter, chunk);
774 return -EINVAL;
775 }
776
773 if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE)) 777 if (unlikely(skb->ip_summed == CHECKSUM_COMPLETE))
774 netdev_rx_csum_fault(skb->dev); 778 netdev_rx_csum_fault(skb->dev);
775 } 779 }
776 return 0; 780 return 0;
777csum_error:
778 iov_iter_revert(&msg->msg_iter, chunk);
779 return -EINVAL;
780fault: 781fault:
781 return -EFAULT; 782 return -EFAULT;
782} 783}