net: fix uninitialised msghdr->sg_from_iter
authorPavel Begunkov <asml.silence@gmail.com>
Thu, 21 Jul 2022 14:25:46 +0000 (15:25 +0100)
committerJakub Kicinski <kuba@kernel.org>
Fri, 22 Jul 2022 21:52:32 +0000 (14:52 -0700)
Because of how struct msghdr is usually initialised some fields and
sg_from_iter in particular might be left out not initialised, so we
can't safely use it in __zerocopy_sg_from_iter().

For now use the callback only when there is ->msg_ubuf set relying on
the fact that they're used together and we properly zero ->msg_ubuf.

Fixes: ebe73a284f4de8 ("net: Allow custom iter handler in msghdr")
Signed-off-by: Pavel Begunkov <asml.silence@gmail.com>
Message-Id: <ce8b68b41351488f79fd998b032b3c56e9b1cc6c.1658401817.git.asml.silence@gmail.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/core/datagram.c

index 28cdb79..ecbc0f4 100644 (file)
@@ -619,7 +619,7 @@ int __zerocopy_sg_from_iter(struct msghdr *msg, struct sock *sk,
 {
        int frag;
 
-       if (msg && msg->sg_from_iter)
+       if (msg && msg->msg_ubuf && msg->sg_from_iter)
                return msg->sg_from_iter(sk, skb, from, length);
 
        frag = skb_shinfo(skb)->nr_frags;