From e356fafe02c3ce32bad9b8d96ae9cfd6fcbb40a9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Philippe=20Mathieu-Daud=C3=A9?= Date: Wed, 31 Jul 2019 18:45:29 +0100 Subject: [PATCH 5/5] Fix heap overflow in ip_reass on big packet input MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit RH-Author: Philippe Mathieu-Daudé Message-id: <20190731184529.21905-2-philmd@redhat.com> Patchwork-id: 89820 O-Subject: [RHEL-8.1.0 qemu-kvm PATCH 1/1] Fix heap overflow in ip_reass on big packet input Bugzilla: 1734750 RH-Acked-by: Marc-André Lureau RH-Acked-by: Stefan Hajnoczi RH-Acked-by: Thomas Huth From: Samuel Thibault When the first fragment does not fit in the preallocated buffer, q will already be pointing to the ext buffer, so we mustn't try to update it. Signed-off-by: Samuel Thibault (cherry picked from libslirp commit 126c04acbabd7ad32c2b018fe10dfac2a3bc1210) Signed-off-by: Philippe Mathieu-Daudé Signed-off-by: Danilo C. L. de Paula --- slirp/ip_input.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/slirp/ip_input.c b/slirp/ip_input.c index 348e1dc..07d8808 100644 --- a/slirp/ip_input.c +++ b/slirp/ip_input.c @@ -334,6 +334,8 @@ insert: q = fp->frag_link.next; m = dtom(slirp, q); + int was_ext = m->m_flags & M_EXT; + q = (struct ipasfrag *) q->ipf_next; while (q != (struct ipasfrag*)&fp->frag_link) { struct mbuf *t = dtom(slirp, q); @@ -356,7 +358,7 @@ insert: * the old buffer (in the mbuf), so we must point ip * into the new buffer. */ - if (m->m_flags & M_EXT) { + if (!was_ext && m->m_flags & M_EXT) { int delta = (char *)q - m->m_dat; q = (struct ipasfrag *)(m->m_ext + delta); } -- 1.8.3.1