]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/commitdiff
sock: fix sg page frag coalescing in sk_alloc_sg
authorDaniel Borkmann <daniel@iogearbox.net>
Mon, 23 Jul 2018 20:37:54 +0000 (22:37 +0200)
committerStefan Bader <stefan.bader@canonical.com>
Fri, 1 Mar 2019 13:20:22 +0000 (14:20 +0100)
BugLink: http://bugs.launchpad.net/bugs/1814813
[ Upstream commit 144fe2bfd236dc814eae587aea7e2af03dbdd755 ]

Current sg coalescing logic in sk_alloc_sg() (latter is used by tls and
sockmap) is not quite correct in that we do fetch the previous sg entry,
however the subsequent check whether the refilled page frag from the
socket is still the same as from the last entry with prior offset and
length matching the start of the current buffer is comparing always the
first sg list entry instead of the prior one.

Fixes: 3c4d7559159b ("tls: kernel TLS support")
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Dave Watson <davejwatson@fb.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: Kamal Mostafa <kamal@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
net/tls/tls_sw.c

index 4dc40f882c32490c8463a891317fd48fb8d71861..b1d2a9892d0ea18cd0075b702dfc1aaaba7309c2 100644 (file)
@@ -119,9 +119,10 @@ static int alloc_sg(struct sock *sk, int len, struct scatterlist *sg,
                pfrag->offset += use;
 
                sge = sg + num_elem - 1;
-               if (num_elem > first_coalesce && sg_page(sg) == pfrag->page &&
-                   sg->offset + sg->length == orig_offset) {
-                       sg->length += use;
+
+               if (num_elem > first_coalesce && sg_page(sge) == pfrag->page &&
+                   sge->offset + sge->length == orig_offset) {
+                       sge->length += use;
                } else {
                        sge++;
                        sg_unmark_end(sge);