From: Willem de Bruijn <will...@google.com>

Do not use uarg->zerocopy outside msg_zerocopy. In other paths the
field is not explicitly initialized and aliases another field.

Those paths have only one reference so do not need this intermediate
variable. Call uarg->callback directly.

Fixes: 1f8b977ab32d ("sock: enable MSG_ZEROCOPY")
Signed-off-by: Willem de Bruijn <will...@google.com>
---
 include/linux/skbuff.h | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/include/linux/skbuff.h b/include/linux/skbuff.h
index 8c0708d2e5e6..7594e19bce62 100644
--- a/include/linux/skbuff.h
+++ b/include/linux/skbuff.h
@@ -1273,8 +1273,13 @@ static inline void skb_zcopy_clear(struct sk_buff *skb, 
bool zerocopy)
        struct ubuf_info *uarg = skb_zcopy(skb);
 
        if (uarg) {
-               uarg->zerocopy = uarg->zerocopy && zerocopy;
-               sock_zerocopy_put(uarg);
+               if (uarg->callback == sock_zerocopy_callback) {
+                       uarg->zerocopy = uarg->zerocopy && zerocopy;
+                       sock_zerocopy_put(uarg);
+               } else {
+                       uarg->callback(uarg, zerocopy);
+               }
+
                skb_shinfo(skb)->tx_flags &= ~SKBTX_ZEROCOPY_FRAG;
        }
 }
-- 
2.14.0.434.g98096fd7a8-goog

Reply via email to