9ae3a8
From 00e16a0908803bf1e796864511862067a763e95e Mon Sep 17 00:00:00 2001
9ae3a8
From: Miroslav Rezanina <mrezanin@redhat.com>
9ae3a8
Date: Thu, 23 Oct 2014 09:19:24 +0200
9ae3a8
Subject: [PATCH 1/9] slirp: udp: fix NULL pointer dereference because of
9ae3a8
 uninitialized socket
9ae3a8
9ae3a8
Message-id: <1414055964-27479-1-git-send-email-mrezanin@redhat.com>
9ae3a8
Patchwork-id: 61832
9ae3a8
O-Subject: [RHEL-7.1 qemu-kvm PATCH] slirp: udp: fix NULL pointer dereference because of uninitialized socket
9ae3a8
Bugzilla: 1144820
9ae3a8
RH-Acked-by: Petr Matousek <pmatouse@redhat.com>
9ae3a8
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
9ae3a8
RH-Acked-by: Amos Kong <akong@redhat.com>
9ae3a8
9ae3a8
From: Petr Matousek <pmatouse@redhat.com>
9ae3a8
9ae3a8
When guest sends udp packet with source port and source addr 0,
9ae3a8
uninitialized socket is picked up when looking for matching and already
9ae3a8
created udp sockets, and later passed to sosendto() where NULL pointer
9ae3a8
dereference is hit during so->slirp->vnetwork_mask.s_addr access.
9ae3a8
9ae3a8
Fix this by checking that the socket is not just a socket stub.
9ae3a8
9ae3a8
This is CVE-2014-3640.
9ae3a8
9ae3a8
Signed-off-by: Petr Matousek <pmatouse@redhat.com>
9ae3a8
Reported-by: Xavier Mehrenberger <xavier.mehrenberger@airbus.com>
9ae3a8
Reported-by: Stephane Duverger <stephane.duverger@eads.net>
9ae3a8
Reviewed-by: Jan Kiszka <jan.kiszka@siemens.com>
9ae3a8
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
9ae3a8
Reviewed-by: Michael Tokarev <mjt@tls.msk.ru>
9ae3a8
Message-id: 20140918063537.GX9321@dhcp-25-225.brq.redhat.com
9ae3a8
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
9ae3a8
(cherry picked from commit 01f7cecf0037997cb0e58ec0d56bf9b5a6f7cb2a)
9ae3a8
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
9ae3a8
---
9ae3a8
 slirp/udp.c | 2 +-
9ae3a8
 1 file changed, 1 insertion(+), 1 deletion(-)
9ae3a8
9ae3a8
diff --git a/slirp/udp.c b/slirp/udp.c
9ae3a8
index b105f87..2188176 100644
9ae3a8
--- a/slirp/udp.c
9ae3a8
+++ b/slirp/udp.c
9ae3a8
@@ -152,7 +152,7 @@ udp_input(register struct mbuf *m, int iphlen)
9ae3a8
 	 * Locate pcb for datagram.
9ae3a8
 	 */
9ae3a8
 	so = slirp->udp_last_so;
9ae3a8
-	if (so->so_lport != uh->uh_sport ||
9ae3a8
+	if (so == &slirp->udb || so->so_lport != uh->uh_sport ||
9ae3a8
 	    so->so_laddr.s_addr != ip->ip_src.s_addr) {
9ae3a8
 		struct socket *tmp;
9ae3a8
 
9ae3a8
-- 
9ae3a8
1.8.3.1
9ae3a8