Blame SOURCES/0003-Prevent-integer-overflows-in-capability-checks.patch

cc8519
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
88d513
From: Frediano Ziglio <fziglio@redhat.com>
88d513
Date: Mon, 28 Nov 2016 13:15:58 +0000
88d513
Subject: [PATCH] Prevent integer overflows in capability checks
88d513
88d513
The limits for capabilities are specified using 32 bit unsigned integers.
88d513
This could cause possible integer overflows causing buffer overflows.
88d513
For instance the sum of num_common_caps and num_caps can be 0 avoiding
88d513
additional checks.
88d513
As the link message is now capped to 4096 and the capabilities are
88d513
contained in the link message, this commit limits the capabilities
88d513
to 1024 (capabilities are expressed in number of uint32_t items).
88d513
88d513
Signed-off-by: Frediano Ziglio <fziglio@redhat.com>
88d513
---
cc8519
 server/reds.c | 8 ++++++++
cc8519
 1 file changed, 8 insertions(+)
88d513
88d513
diff --git a/server/reds.c b/server/reds.c
cc8519
index 86a33d5..c639aa3 100644
88d513
--- a/server/reds.c
88d513
+++ b/server/reds.c
cc8519
@@ -2113,6 +2113,14 @@ static void reds_handle_read_link_done(void *opaque)
cc8519
     num_caps = link_mess->num_common_caps + link_mess->num_channel_caps;
cc8519
     caps = (uint32_t *)((uint8_t *)link_mess + link_mess->caps_offset);
88d513
 
88d513
+    /* Prevent integer overflows. Currently we defined only 13 capabilities,
88d513
+     * I expect 1024 to be valid for quite a lot time */
88d513
+    if (link_mess->num_channel_caps > 1024 || link_mess->num_common_caps > 1024) {
88d513
+        reds_send_link_error(link, SPICE_LINK_ERR_INVALID_DATA);
88d513
+        reds_link_free(link);
88d513
+        return;
88d513
+    }
88d513
+
88d513
     if (num_caps && (num_caps * sizeof(uint32_t) + link_mess->caps_offset >
88d513
                      link->link_header.size ||
88d513
                      link_mess->caps_offset < sizeof(*link_mess))) {