提交 15e6cb46 编写于 作者: A Al Viro

make skb_add_data,{_nocache}() and skb_copy_to_page_nocache() advance only on success

Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>
上级 cbbd26b8
...@@ -2809,12 +2809,12 @@ static inline int skb_add_data(struct sk_buff *skb, ...@@ -2809,12 +2809,12 @@ static inline int skb_add_data(struct sk_buff *skb,
if (skb->ip_summed == CHECKSUM_NONE) { if (skb->ip_summed == CHECKSUM_NONE) {
__wsum csum = 0; __wsum csum = 0;
if (csum_and_copy_from_iter(skb_put(skb, copy), copy, if (csum_and_copy_from_iter_full(skb_put(skb, copy), copy,
&csum, from) == copy) { &csum, from)) {
skb->csum = csum_block_add(skb->csum, csum, off); skb->csum = csum_block_add(skb->csum, csum, off);
return 0; return 0;
} }
} else if (copy_from_iter(skb_put(skb, copy), copy, from) == copy) } else if (copy_from_iter_full(skb_put(skb, copy), copy, from))
return 0; return 0;
__skb_trim(skb, off); __skb_trim(skb, off);
......
...@@ -1783,13 +1783,13 @@ static inline int skb_do_copy_data_nocache(struct sock *sk, struct sk_buff *skb, ...@@ -1783,13 +1783,13 @@ static inline int skb_do_copy_data_nocache(struct sock *sk, struct sk_buff *skb,
{ {
if (skb->ip_summed == CHECKSUM_NONE) { if (skb->ip_summed == CHECKSUM_NONE) {
__wsum csum = 0; __wsum csum = 0;
if (csum_and_copy_from_iter(to, copy, &csum, from) != copy) if (!csum_and_copy_from_iter_full(to, copy, &csum, from))
return -EFAULT; return -EFAULT;
skb->csum = csum_block_add(skb->csum, csum, offset); skb->csum = csum_block_add(skb->csum, csum, offset);
} else if (sk->sk_route_caps & NETIF_F_NOCACHE_COPY) { } else if (sk->sk_route_caps & NETIF_F_NOCACHE_COPY) {
if (copy_from_iter_nocache(to, copy, from) != copy) if (!copy_from_iter_full_nocache(to, copy, from))
return -EFAULT; return -EFAULT;
} else if (copy_from_iter(to, copy, from) != copy) } else if (!copy_from_iter_full(to, copy, from))
return -EFAULT; return -EFAULT;
return 0; return 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册