summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrediano Ziglio <fziglio@redhat.com>2016-12-13 14:40:10 +0000
committerFrediano Ziglio <fziglio@redhat.com>2017-02-06 10:33:22 +0000
commitf66dc643635518e53dfbe5262f814a64eec54e4a (patch)
tree5b576ec5546a76d89cee1d1e409c9295fb06e887
parent1c6517973095a67c8cb57f3550fc1298404ab556 (diff)
Prevent integer overflows in capability checks
The limits for capabilities are specified using 32 bit unsigned integers. This could cause possible integer overflows causing buffer overflows. For instance the sum of num_common_caps and num_caps can be 0 avoiding additional checks. As the link message is now capped to 4096 and the capabilities are contained in the link message limit the capabilities to 1024 (capabilities are expressed in number of uint32_t items). Signed-off-by: Frediano Ziglio <fziglio@redhat.com> Acked-by: Christophe Fergeau <cfergeau@redhat.com>
-rw-r--r--server/reds.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/server/reds.c b/server/reds.c
index 86a33d53..91504544 100644
--- a/server/reds.c
+++ b/server/reds.c
@@ -2110,6 +2110,14 @@ static void reds_handle_read_link_done(void *opaque)
link_mess->num_channel_caps = GUINT32_FROM_LE(link_mess->num_channel_caps);
link_mess->num_common_caps = GUINT32_FROM_LE(link_mess->num_common_caps);
+ /* Prevent DoS. Currently we defined only 13 capabilities,
+ * I expect 1024 to be valid for quite a lot time */
+ if (link_mess->num_channel_caps > 1024 || link_mess->num_common_caps > 1024) {
+ reds_send_link_error(link, SPICE_LINK_ERR_INVALID_DATA);
+ reds_link_free(link);
+ return;
+ }
+
num_caps = link_mess->num_common_caps + link_mess->num_channel_caps;
caps = (uint32_t *)((uint8_t *)link_mess + link_mess->caps_offset);