Blame SOURCES/0001-xkb-Drop-check-for-XkbSetMapResizeTypes.patch

55d6a0
From 36bcef5e5fd175e95ed4e0a014f6b1d8598b719d Mon Sep 17 00:00:00 2001
55d6a0
From: Ray Strode <rstrode@redhat.com>
55d6a0
Date: Mon, 4 Oct 2021 14:27:54 -0400
55d6a0
Subject: [PATCH] xkb: Drop check for XkbSetMapResizeTypes
55d6a0
55d6a0
Commit 446ff2d3177087b8173fa779fa5b77a2a128988b added checks to
55d6a0
prevalidate the size of incoming SetMap requests.
55d6a0
55d6a0
That commit checks for the XkbSetMapResizeTypes flag to be set before
55d6a0
allowing key types data to be processed.
55d6a0
55d6a0
key types data can be changed or even just sent wholesale unchanged
55d6a0
without the number of key types changing, however. The check for
55d6a0
XkbSetMapResizeTypes rejects those legitimate requests. In particular,
55d6a0
XkbChangeMap never sets XkbSetMapResizeTypes and so always fails now
55d6a0
any time XkbKeyTypesMask is in the changed mask.
55d6a0
55d6a0
This commit drops the check for XkbSetMapResizeTypes in flags when
55d6a0
prevalidating the request length.
55d6a0
---
55d6a0
 xkb/xkb.c | 26 ++++++++++++--------------
55d6a0
 1 file changed, 12 insertions(+), 14 deletions(-)
55d6a0
55d6a0
diff --git a/xkb/xkb.c b/xkb/xkb.c
55d6a0
index 183d6ffa1..62dee9cb6 100644
55d6a0
--- a/xkb/xkb.c
55d6a0
+++ b/xkb/xkb.c
55d6a0
@@ -2378,75 +2378,73 @@ SetVirtualModMap(XkbSrvInfoPtr xkbi,
55d6a0
         }
55d6a0
         changes->map.first_vmodmap_key = first;
55d6a0
         changes->map.num_vmodmap_keys = (last - first) + 1;
55d6a0
     }
55d6a0
     return (char *) wire;
55d6a0
 }
55d6a0
 
55d6a0
 #define _add_check_len(new) \
55d6a0
     if (len > UINT32_MAX - (new) || len > req_len - (new)) goto bad; \
55d6a0
     else len += new
55d6a0
 
55d6a0
 /**
55d6a0
  * Check the length of the SetMap request
55d6a0
  */
55d6a0
 static int
55d6a0
 _XkbSetMapCheckLength(xkbSetMapReq *req)
55d6a0
 {
55d6a0
     size_t len = sz_xkbSetMapReq, req_len = req->length << 2;
55d6a0
     xkbKeyTypeWireDesc *keytype;
55d6a0
     xkbSymMapWireDesc *symmap;
55d6a0
     BOOL preserve;
55d6a0
     int i, map_count, nSyms;
55d6a0
 
55d6a0
     if (req_len < len)
55d6a0
         goto bad;
55d6a0
     /* types */
55d6a0
     if (req->present & XkbKeyTypesMask) {
55d6a0
         keytype = (xkbKeyTypeWireDesc *)(req + 1);
55d6a0
         for (i = 0; i < req->nTypes; i++) {
55d6a0
             _add_check_len(XkbPaddedSize(sz_xkbKeyTypeWireDesc));
55d6a0
-            if (req->flags & XkbSetMapResizeTypes) {
55d6a0
-                _add_check_len(keytype->nMapEntries
55d6a0
-                               * sz_xkbKTSetMapEntryWireDesc);
55d6a0
-                preserve = keytype->preserve;
55d6a0
-                map_count = keytype->nMapEntries;
55d6a0
-                if (preserve) {
55d6a0
-                    _add_check_len(map_count * sz_xkbModsWireDesc);
55d6a0
-                }
55d6a0
-                keytype += 1;
55d6a0
-                keytype = (xkbKeyTypeWireDesc *)
55d6a0
-                          ((xkbKTSetMapEntryWireDesc *)keytype + map_count);
55d6a0
-                if (preserve)
55d6a0
-                    keytype = (xkbKeyTypeWireDesc *)
55d6a0
-                              ((xkbModsWireDesc *)keytype + map_count);
55d6a0
+            _add_check_len(keytype->nMapEntries
55d6a0
+                           * sz_xkbKTSetMapEntryWireDesc);
55d6a0
+            preserve = keytype->preserve;
55d6a0
+            map_count = keytype->nMapEntries;
55d6a0
+            if (preserve) {
55d6a0
+                _add_check_len(map_count * sz_xkbModsWireDesc);
55d6a0
             }
55d6a0
+            keytype += 1;
55d6a0
+            keytype = (xkbKeyTypeWireDesc *)
55d6a0
+                      ((xkbKTSetMapEntryWireDesc *)keytype + map_count);
55d6a0
+            if (preserve)
55d6a0
+                keytype = (xkbKeyTypeWireDesc *)
55d6a0
+                          ((xkbModsWireDesc *)keytype + map_count);
55d6a0
         }
55d6a0
     }
55d6a0
     /* syms */
55d6a0
     if (req->present & XkbKeySymsMask) {
55d6a0
         symmap = (xkbSymMapWireDesc *)((char *)req + len);
55d6a0
         for (i = 0; i < req->nKeySyms; i++) {
55d6a0
             _add_check_len(sz_xkbSymMapWireDesc);
55d6a0
             nSyms = symmap->nSyms;
55d6a0
             _add_check_len(nSyms*sizeof(CARD32));
55d6a0
             symmap += 1;
55d6a0
             symmap = (xkbSymMapWireDesc *)((CARD32 *)symmap + nSyms);
55d6a0
         }
55d6a0
     }
55d6a0
     /* actions */
55d6a0
     if (req->present & XkbKeyActionsMask) {
55d6a0
         _add_check_len(req->totalActs * sz_xkbActionWireDesc 
55d6a0
                        + XkbPaddedSize(req->nKeyActs));
55d6a0
     }
55d6a0
     /* behaviours */
55d6a0
     if (req->present & XkbKeyBehaviorsMask) {
55d6a0
         _add_check_len(req->totalKeyBehaviors * sz_xkbBehaviorWireDesc);
55d6a0
     }
55d6a0
     /* vmods */
55d6a0
     if (req->present & XkbVirtualModsMask) {
55d6a0
         _add_check_len(XkbPaddedSize(Ones(req->virtualMods)));
55d6a0
     }
55d6a0
     /* explicit */
55d6a0
     if (req->present & XkbExplicitComponentsMask) {
55d6a0
         /* two bytes per non-zero explicit componen */
55d6a0
         _add_check_len(XkbPaddedSize(req->totalKeyExplicit * sizeof(CARD16)));
55d6a0
-- 
55d6a0
2.32.0
55d6a0