]> xenbits.xensource.com Git - people/aperard/centos-package-xen.git/commitdiff
Imported XSA-134,135,136
authorGeorge Dunlap <george.dunlap@eu.citrix.com>
Mon, 1 Jun 2015 11:01:40 +0000 (12:01 +0100)
committerGeorge Dunlap <george.dunlap@eu.citrix.com>
Tue, 9 Jun 2015 16:07:14 +0000 (17:07 +0100)
Embargoed until 2015 June 11 1200 UTC

Signed-off-by: George Dunlap <george.dunlap@eu.citrix.com>
SOURCES/xen-queue.am
SOURCES/xsa135-qemut-1.patch [new file with mode: 0644]
SOURCES/xsa135-qemut-2.patch [new file with mode: 0644]
SOURCES/xsa135-qemuu-4.5-1.patch [new file with mode: 0644]
SOURCES/xsa135-qemuu-4.5-2.patch [new file with mode: 0644]
SPECS/xen.spec

index b8f9438135b76f61ceed56b4d3d58cdc4c336381..c119afa6821627f26661aace3aec75fb01eae268 100644 (file)
@@ -891,7 +891,71 @@ index 0cb6ee1..70202e8 100644
 1.9.1
 
 
-From fd2516d6c9a5816f17bbe3bbadce8d4ffcd3c855 Mon Sep 17 00:00:00 2001
+From 8df95318fde4be67647c8ba557c9afdb91e74009 Mon Sep 17 00:00:00 2001
+From: George Dunlap <george.dunlap@eu.citrix.com>
+Date: Mon, 1 Jun 2015 11:47:24 +0100
+Subject: [PATCH] gnttab: add missing version check to GNTTABOP_swap_grant_ref
+ handling
+
+... avoiding NULL derefs when the version to use wasn't set yet (via
+GNTTABOP_setup_table or GNTTABOP_set_version).
+
+This is XSA-134.
+
+Signed-off-by: Jan Beulich <jbeulich@suse.com>
+Acked-by: Ian Campbell <ian.campbell@citrix.com>
+---
+ xen/common/grant_table.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/xen/common/grant_table.c b/xen/common/grant_table.c
+index 107b000..34e1c25 100644
+--- a/xen/common/grant_table.c
++++ b/xen/common/grant_table.c
+@@ -2393,6 +2393,9 @@ __gnttab_swap_grant_ref(grant_ref_t ref_a, grant_ref_t ref_b)
+     spin_lock(&gt->lock);
++    if ( gt->gt_version == 0 )
++        PIN_FAIL(out, GNTST_general_error, "grant table not yet set up\n");
++
+     /* Bounds check on the grant refs */
+     if ( unlikely(ref_a >= nr_grant_entries(d->grant_table)))
+         PIN_FAIL(out, GNTST_bad_gntref, "Bad ref-a (%d).\n", ref_a);
+-- 
+1.9.1
+
+
+From b1d22106579832b31b496dd632ee4bf065a12d40 Mon Sep 17 00:00:00 2001
+From: George Dunlap <george.dunlap@eu.citrix.com>
+Date: Tue, 9 Jun 2015 12:07:14 +0100
+Subject: [PATCH] x86/traps: loop in the correct direction in compat_iret()
+
+This is XSA-136.
+
+Reviewed-by: Jan Beulich <jbeulich@suse.com>
+---
+ xen/arch/x86/x86_64/compat/traps.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/xen/arch/x86/x86_64/compat/traps.c b/xen/arch/x86/x86_64/compat/traps.c
+index 5f0ea0a..0b78445 100644
+--- a/xen/arch/x86/x86_64/compat/traps.c
++++ b/xen/arch/x86/x86_64/compat/traps.c
+@@ -119,7 +119,7 @@ unsigned int compat_iret(void)
+         }
+         else if ( ksp > regs->_esp )
+         {
+-            for (i = 9; i > 0; ++i)
++            for ( i = 9; i > 0; --i )
+             {
+                 rc |= __get_user(x, (u32 *)regs->rsp + i);
+                 rc |= __put_user(x, (u32 *)(unsigned long)ksp + i);
+-- 
+1.9.1
+
+
+From 5f4c3c14e993b8ee4ffb96c10af1b835d603f7bb Mon Sep 17 00:00:00 2001
 From: Wen Congyang <wency@cn.fujitsu.com>
 Date: Thu, 23 Apr 2015 15:06:13 +0100
 Subject: [PATCH] tools: libxl: pass correct file to qemu if we use blktap2
@@ -949,7 +1013,7 @@ index 4dbfddc..d855fc6 100644
 1.9.1
 
 
-From 0804f67899b0422ad87f2eb8cb55cd03d8607101 Mon Sep 17 00:00:00 2001
+From 462e99a97e40ffce8ac5f369331542f4fb220bfe Mon Sep 17 00:00:00 2001
 From: George Dunlap <george.dunlap@eu.citrix.com>
 Date: Thu, 23 Apr 2015 15:06:13 +0100
 Subject: [PATCH] it: George Dunlap <george.dunlap@eu.citrix.com>
@@ -1020,7 +1084,7 @@ index d855fc6..44c3db0 100644
 1.9.1
 
 
-From 7c93e25a0a54f56a957627251c8b4728f3cb3056 Mon Sep 17 00:00:00 2001
+From 21c18afea6b2aa700d30037f046eddfe9784facd Mon Sep 17 00:00:00 2001
 From: George Dunlap <george.dunlap@eu.citrix.com>
 Date: Thu, 23 Apr 2015 15:06:13 +0100
 Subject: [PATCH] Revert "libxl: prefer qdisk over blktap when choosing disk
@@ -1057,7 +1121,7 @@ index 29ed547..0f9fe2d 100644
 1.9.1
 
 
-From 39a0f30238d15c123deada9a1ab21ac3e55c4753 Mon Sep 17 00:00:00 2001
+From 0125042dc60081badc0e6dbd60bfae06e30149c0 Mon Sep 17 00:00:00 2001
 From: George Dunlap <george.dunlap@eu.citrix.com>
 Date: Thu, 23 Apr 2015 15:06:13 +0100
 Subject: [PATCH] xen-centos-disable-CFLAGS-for-qemu.patch
@@ -1082,7 +1146,7 @@ index 6610a8d..86d8a58 100644
 1.9.1
 
 
-From ed68bc247dabdee4e87abb3036155f3b962af1c8 Mon Sep 17 00:00:00 2001
+From 7a72d67cc0a3231cd173531f1e64721ff567451b Mon Sep 17 00:00:00 2001
 From: George Dunlap <george.dunlap@eu.citrix.com>
 Date: Thu, 23 Apr 2015 15:06:13 +0100
 Subject: [PATCH] Adapt libxl to use blktap 2.5 v0.9.2
diff --git a/SOURCES/xsa135-qemut-1.patch b/SOURCES/xsa135-qemut-1.patch
new file mode 100644 (file)
index 0000000..3775f7c
--- /dev/null
@@ -0,0 +1,92 @@
+pcnet: fix Negative array index read\r
+    \r
+From: Gonglei <arei.gonglei@huawei.com>\r
+\r
+s->xmit_pos maybe assigned to a negative value (-1),\r
+but in this branch variable s->xmit_pos as an index to\r
+array s->buffer. Let's add a check for s->xmit_pos.\r
+    \r
+upstream-commit-id: 7b50d00911ddd6d56a766ac5671e47304c20a21b\r
+\r
+Signed-off-by: Gonglei <arei.gonglei@huawei.com>\r
+Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>\r
+Reviewed-by: Jason Wang <jasowang@redhat.com>\r
+Reviewed-by: Jason Wang <jasowang@redhat.com>\r
+Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>\r
+\r
+diff --git a/hw/pcnet.c b/hw/pcnet.c\r
+index 7cc0637..9f3e1cc 100644\r
+--- a/hw/pcnet.c\r
++++ b/hw/pcnet.c\r
+@@ -1250,7 +1250,7 @@ static void pcnet_transmit(PCNetState *s)\r
+     target_phys_addr_t xmit_cxda = 0;\r
+     int count = CSR_XMTRL(s)-1;\r
+     int add_crc = 0;\r
+-\r
++    int bcnt;\r
+     s->xmit_pos = -1;\r
\r
+     if (!CSR_TXON(s)) {\r
+@@ -1276,34 +1276,39 @@ static void pcnet_transmit(PCNetState *s)\r
+             if (BCR_SWSTYLE(s) != 1)\r
+                 add_crc = GET_FIELD(tmd.status, TMDS, ADDFCS);\r
+         }\r
++\r
++        if (s->xmit_pos < 0) {\r
++            goto txdone;\r
++        }\r
++\r
++        bcnt = 4096 - GET_FIELD(tmd.length, TMDL, BCNT);\r
++        s->phys_mem_read(s->dma_opaque, PHYSADDR(s, tmd.tbadr),\r
++                         s->buffer + s->xmit_pos, bcnt, CSR_BSWP(s));\r
++        s->xmit_pos += bcnt;\r
++\r
+         if (!GET_FIELD(tmd.status, TMDS, ENP)) {\r
+-            int bcnt = 4096 - GET_FIELD(tmd.length, TMDL, BCNT);\r
+-            s->phys_mem_read(s->dma_opaque, PHYSADDR(s, tmd.tbadr),\r
+-                             s->buffer + s->xmit_pos, bcnt, CSR_BSWP(s));\r
+-            s->xmit_pos += bcnt;\r
+-        } else if (s->xmit_pos >= 0) {\r
+-            int bcnt = 4096 - GET_FIELD(tmd.length, TMDL, BCNT);\r
+-            s->phys_mem_read(s->dma_opaque, PHYSADDR(s, tmd.tbadr),\r
+-                             s->buffer + s->xmit_pos, bcnt, CSR_BSWP(s));\r
+-            s->xmit_pos += bcnt;\r
++            goto txdone;\r
++        }\r
+ #ifdef PCNET_DEBUG\r
+-            printf("pcnet_transmit size=%d\n", s->xmit_pos);\r
++        printf("pcnet_transmit size=%d\n", s->xmit_pos);\r
+ #endif\r
+-            if (CSR_LOOP(s)) {\r
+-                if (BCR_SWSTYLE(s) == 1)\r
+-                    add_crc = !GET_FIELD(tmd.status, TMDS, NOFCS);\r
+-                s->looptest = add_crc ? PCNET_LOOPTEST_CRC : PCNET_LOOPTEST_NOCRC;\r
+-                pcnet_receive(s, s->buffer, s->xmit_pos);\r
+-                s->looptest = 0;\r
+-            } else\r
+-                if (s->vc)\r
+-                    qemu_send_packet(s->vc, s->buffer, s->xmit_pos);\r
+-\r
+-            s->csr[0] &= ~0x0008;   /* clear TDMD */\r
+-            s->csr[4] |= 0x0004;    /* set TXSTRT */\r
+-            s->xmit_pos = -1;\r
++        if (CSR_LOOP(s)) {\r
++            if (BCR_SWSTYLE(s) == 1)\r
++                add_crc = !GET_FIELD(tmd.status, TMDS, NOFCS);\r
++            s->looptest = add_crc ? PCNET_LOOPTEST_CRC : PCNET_LOOPTEST_NOCRC;\r
++            pcnet_receive(s, s->buffer, s->xmit_pos);\r
++            s->looptest = 0;\r
++        } else {\r
++            if (s->vc) {\r
++                qemu_send_packet(s->vc, s->buffer, s->xmit_pos);\r
++            }\r
+         }\r
\r
++        s->csr[0] &= ~0x0008;   /* clear TDMD */\r
++        s->csr[4] |= 0x0004;    /* set TXSTRT */\r
++        s->xmit_pos = -1;\r
++\r
++    txdone:\r
+         SET_FIELD(&tmd.status, TMDS, OWN, 0);\r
+         TMDSTORE(&tmd, PHYSADDR(s,CSR_CXDA(s)));\r
+         if (!CSR_TOKINTD(s) || (CSR_LTINTEN(s) && GET_FIELD(tmd.status, TMDS, LTINT)))\r
diff --git a/SOURCES/xsa135-qemut-2.patch b/SOURCES/xsa135-qemut-2.patch
new file mode 100644 (file)
index 0000000..e2a6985
--- /dev/null
@@ -0,0 +1,45 @@
+>From 2630672ab22255de252f877709851c0557a1c647 Mon Sep 17 00:00:00 2001\r
+From: Petr Matousek <pmatouse@redhat.com>\r
+Date: Sun, 24 May 2015 10:53:44 +0200\r
+Subject: [PATCH] pcnet: force the buffer access to be in bounds during tx\r
+\r
+4096 is the maximum length per TMD and it is also currently the size of\r
+the relay buffer pcnet driver uses for sending the packet data to QEMU\r
+for further processing. With packet spanning multiple TMDs it can\r
+happen that the overall packet size will be bigger than sizeof(buffer),\r
+which results in memory corruption.\r
+\r
+Fix this by only allowing to queue maximum sizeof(buffer) bytes.\r
+\r
+This is CVE-2015-3209.\r
+\r
+Signed-off-by: Petr Matousek <pmatouse@redhat.com>\r
+Reported-by: Matt Tait <matttait@google.com>\r
+Reviewed-by: Peter Maydell <peter.maydell@linaro.org>\r
+Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>\r
+---\r
+ hw/pcnet.c | 8 ++++++++\r
+ 1 file changed, 8 insertions(+)\r
+\r
+diff --git a/hw/pcnet.c b/hw/pcnet.c\r
+index bdfd38f..6d32e4c 100644\r
+--- a/hw/pcnet.c\r
++++ b/hw/pcnet.c\r
+@@ -1241,6 +1241,14 @@ static void pcnet_transmit(PCNetState *s)\r
+         }\r
+\r
+         bcnt = 4096 - GET_FIELD(tmd.length, TMDL, BCNT);\r
++\r
++        /* if multi-tmd packet outsizes s->buffer then skip it silently.\r
++           Note: this is not what real hw does */\r
++        if (s->xmit_pos + bcnt > sizeof(s->buffer)) {\r
++           s->xmit_pos = -1;\r
++           goto txdone;\r
++        }\r
++\r
+         s->phys_mem_read(s->dma_opaque, PHYSADDR(s, tmd.tbadr),\r
+                          s->buffer + s->xmit_pos, bcnt, CSR_BSWP(s));\r
+         s->xmit_pos += bcnt;\r
+-- \r
+2.1.0\r
+\r
diff --git a/SOURCES/xsa135-qemuu-4.5-1.patch b/SOURCES/xsa135-qemuu-4.5-1.patch
new file mode 100644 (file)
index 0000000..460d831
--- /dev/null
@@ -0,0 +1,94 @@
+pcnet: fix Negative array index read\r
+    \r
+From: Gonglei <arei.gonglei@huawei.com>\r
+\r
+s->xmit_pos maybe assigned to a negative value (-1),\r
+but in this branch variable s->xmit_pos as an index to\r
+array s->buffer. Let's add a check for s->xmit_pos.\r
+    \r
+upstream-commit-id: 7b50d00911ddd6d56a766ac5671e47304c20a21b\r
+\r
+Signed-off-by: Gonglei <arei.gonglei@huawei.com>\r
+Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>\r
+Reviewed-by: Jason Wang <jasowang@redhat.com>\r
+Reviewed-by: Jason Wang <jasowang@redhat.com>\r
+Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>\r
+\r
+diff --git a/hw/net/pcnet.c b/hw/net/pcnet.c\r
+index d344c15..f409b92 100644\r
+--- a/hw/net/pcnet.c\r
++++ b/hw/net/pcnet.c\r
+@@ -1212,7 +1212,7 @@ static void pcnet_transmit(PCNetState *s)\r
+     hwaddr xmit_cxda = 0;\r
+     int count = CSR_XMTRL(s)-1;\r
+     int add_crc = 0;\r
+-\r
++    int bcnt;\r
+     s->xmit_pos = -1;\r
\r
+     if (!CSR_TXON(s)) {\r
+@@ -1247,35 +1247,40 @@ static void pcnet_transmit(PCNetState *s)\r
+             s->xmit_pos = -1;\r
+             goto txdone;\r
+         }\r
++\r
++        if (s->xmit_pos < 0) {\r
++            goto txdone;\r
++        }\r
++\r
++        bcnt = 4096 - GET_FIELD(tmd.length, TMDL, BCNT);\r
++        s->phys_mem_read(s->dma_opaque, PHYSADDR(s, tmd.tbadr),\r
++                         s->buffer + s->xmit_pos, bcnt, CSR_BSWP(s));\r
++        s->xmit_pos += bcnt;\r
++        \r
+         if (!GET_FIELD(tmd.status, TMDS, ENP)) {\r
+-            int bcnt = 4096 - GET_FIELD(tmd.length, TMDL, BCNT);\r
+-            s->phys_mem_read(s->dma_opaque, PHYSADDR(s, tmd.tbadr),\r
+-                             s->buffer + s->xmit_pos, bcnt, CSR_BSWP(s));\r
+-            s->xmit_pos += bcnt;\r
+-        } else if (s->xmit_pos >= 0) {\r
+-            int bcnt = 4096 - GET_FIELD(tmd.length, TMDL, BCNT);\r
+-            s->phys_mem_read(s->dma_opaque, PHYSADDR(s, tmd.tbadr),\r
+-                             s->buffer + s->xmit_pos, bcnt, CSR_BSWP(s));\r
+-            s->xmit_pos += bcnt;\r
++            goto txdone;\r
++        }\r
++\r
+ #ifdef PCNET_DEBUG\r
+-            printf("pcnet_transmit size=%d\n", s->xmit_pos);\r
++        printf("pcnet_transmit size=%d\n", s->xmit_pos);\r
+ #endif\r
+-            if (CSR_LOOP(s)) {\r
+-                if (BCR_SWSTYLE(s) == 1)\r
+-                    add_crc = !GET_FIELD(tmd.status, TMDS, NOFCS);\r
+-                s->looptest = add_crc ? PCNET_LOOPTEST_CRC : PCNET_LOOPTEST_NOCRC;\r
+-                pcnet_receive(qemu_get_queue(s->nic), s->buffer, s->xmit_pos);\r
+-                s->looptest = 0;\r
+-            } else\r
+-                if (s->nic)\r
+-                    qemu_send_packet(qemu_get_queue(s->nic), s->buffer,\r
+-                                     s->xmit_pos);\r
+-\r
+-            s->csr[0] &= ~0x0008;   /* clear TDMD */\r
+-            s->csr[4] |= 0x0004;    /* set TXSTRT */\r
+-            s->xmit_pos = -1;\r
++        if (CSR_LOOP(s)) {\r
++            if (BCR_SWSTYLE(s) == 1)\r
++                add_crc = !GET_FIELD(tmd.status, TMDS, NOFCS);\r
++            s->looptest = add_crc ? PCNET_LOOPTEST_CRC : PCNET_LOOPTEST_NOCRC;\r
++            pcnet_receive(qemu_get_queue(s->nic), s->buffer, s->xmit_pos);\r
++            s->looptest = 0;\r
++        } else {\r
++            if (s->nic) {\r
++                qemu_send_packet(qemu_get_queue(s->nic), s->buffer,\r
++                                 s->xmit_pos);\r
++            }\r
+         }\r
\r
++        s->csr[0] &= ~0x0008;   /* clear TDMD */\r
++        s->csr[4] |= 0x0004;    /* set TXSTRT */\r
++        s->xmit_pos = -1;\r
++\r
+     txdone:\r
+         SET_FIELD(&tmd.status, TMDS, OWN, 0);\r
+         TMDSTORE(&tmd, PHYSADDR(s,CSR_CXDA(s)));\r
diff --git a/SOURCES/xsa135-qemuu-4.5-2.patch b/SOURCES/xsa135-qemuu-4.5-2.patch
new file mode 100644 (file)
index 0000000..21b719e
--- /dev/null
@@ -0,0 +1,45 @@
+>From 2630672ab22255de252f877709851c0557a1c647 Mon Sep 17 00:00:00 2001\r
+From: Petr Matousek <pmatouse@redhat.com>\r
+Date: Sun, 24 May 2015 10:53:44 +0200\r
+Subject: [PATCH] pcnet: force the buffer access to be in bounds during tx\r
+\r
+4096 is the maximum length per TMD and it is also currently the size of\r
+the relay buffer pcnet driver uses for sending the packet data to QEMU\r
+for further processing. With packet spanning multiple TMDs it can\r
+happen that the overall packet size will be bigger than sizeof(buffer),\r
+which results in memory corruption.\r
+\r
+Fix this by only allowing to queue maximum sizeof(buffer) bytes.\r
+\r
+This is CVE-2015-3209.\r
+\r
+Signed-off-by: Petr Matousek <pmatouse@redhat.com>\r
+Reported-by: Matt Tait <matttait@google.com>\r
+Reviewed-by: Peter Maydell <peter.maydell@linaro.org>\r
+Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>\r
+---\r
+ hw/net/pcnet.c | 8 ++++++++\r
+ 1 file changed, 8 insertions(+)\r
+\r
+diff --git a/hw/net/pcnet.c b/hw/net/pcnet.c\r
+index bdfd38f..6d32e4c 100644\r
+--- a/hw/net/pcnet.c\r
++++ b/hw/net/pcnet.c\r
+@@ -1241,6 +1241,14 @@ static void pcnet_transmit(PCNetState *s)\r
+         }\r
+\r
+         bcnt = 4096 - GET_FIELD(tmd.length, TMDL, BCNT);\r
++\r
++        /* if multi-tmd packet outsizes s->buffer then skip it silently.\r
++           Note: this is not what real hw does */\r
++        if (s->xmit_pos + bcnt > sizeof(s->buffer)) {\r
++           s->xmit_pos = -1;\r
++           goto txdone;\r
++        }\r
++\r
+         s->phys_mem_read(s->dma_opaque, PHYSADDR(s, tmd.tbadr),\r
+                          s->buffer + s->xmit_pos, bcnt, CSR_BSWP(s));\r
+         s->xmit_pos += bcnt;\r
+-- \r
+2.1.0\r
+\r
index fb619fa77bc8b612d7acd75b450ecf9c83ec0d35..11f1aee8ae72c65afe8c55b72d97851e72a629e8 100644 (file)
@@ -19,7 +19,7 @@
 Summary: Xen is a virtual machine monitor
 Name:    xen
 Version: 4.4.2
-Release: 3%{?dist}
+Release: 4%{?dist}
 Group:   Development/Libraries
 License: GPLv2+ and LGPLv2+ and BSD
 URL:     http://xen.org/
@@ -68,6 +68,8 @@ Patch2010: xsa131-qemuu-6.patch
 Patch2011: xsa131-qemuu-7.patch
 Patch2012: xsa131-qemuu-8.patch
 Patch2013: xsa133-qemuu.patch
+Patch2014: xsa135-qemuu-4.5-1.patch
+Patch2015: xsa135-qemuu-4.5-2.patch
 
 Patch3001: xsa126-qemut.patch
 Patch3002: xsa128-qemut.patch
@@ -82,6 +84,8 @@ Patch3010: xsa131-qemut-6.patch
 Patch3011: xsa131-qemut-7.patch
 Patch3012: xsa131-qemut-8.patch
 Patch3013: xsa133-qemut.patch
+Patch3014: xsa135-qemut-1.patch
+Patch3015: xsa135-qemut-2.patch
 
 
 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root
@@ -273,6 +277,8 @@ pushd tools/qemu-xen
 %patch2011 -p1
 %patch2012 -p1
 %patch2013 -p1
+%patch2014 -p1
+%patch2015 -p1
 popd
 
 pushd tools/qemu-xen-traditional
@@ -289,6 +295,8 @@ pushd tools/qemu-xen-traditional
 %patch3011 -p1
 %patch3012 -p1
 %patch3013 -p1
+%patch3014 -p1
+%patch3015 -p1
 popd
 
 # stubdom sources
@@ -796,6 +804,9 @@ rm -rf %{buildroot}
 %endif
 
 %changelog
+* Mon Jun  1 2015 George Dunlap <george.dunlap@eu.citrix.com> - 4.4.2-4.el6.centos
+ - Import XSA-134,135,136
+
 * Mon Jun  1 2015 George Dunlap <george.dunlap@eu.citrix.com> - 4.4.2-3.el6.centos
  - Import XSA-128,129.130,131