Peter Hutterer e6bf129
From 73d6e888c6058b28a0e87ab65aa4172b17d8327d Mon Sep 17 00:00:00 2001
Peter Hutterer e6bf129
From: Peter Hutterer <peter.hutterer@who-t.net>
Peter Hutterer e6bf129
Date: Mon, 19 Dec 2022 10:34:29 +1000
Peter Hutterer e6bf129
Subject: [PATCH xserver] Fix some indentation issues
Peter Hutterer e6bf129
Peter Hutterer e6bf129
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Peter Hutterer e6bf129
---
Peter Hutterer e6bf129
 dix/dispatch.c | 22 +++++++++++-----------
Peter Hutterer e6bf129
 1 file changed, 11 insertions(+), 11 deletions(-)
Peter Hutterer e6bf129
Peter Hutterer e6bf129
diff --git a/dix/dispatch.c b/dix/dispatch.c
Peter Hutterer e6bf129
index 210df75c63..e38a8fecaa 100644
Peter Hutterer e6bf129
--- a/dix/dispatch.c
Peter Hutterer e6bf129
+++ b/dix/dispatch.c
Peter Hutterer e6bf129
@@ -492,10 +492,10 @@ Dispatch(void)
Peter Hutterer e6bf129
         if (!WaitForSomething(clients_are_ready()))
Peter Hutterer e6bf129
             continue;
Peter Hutterer e6bf129
Peter Hutterer e6bf129
-       /*****************
Peter Hutterer e6bf129
-	*  Handle events in round robin fashion, doing input between
Peter Hutterer e6bf129
-	*  each round
Peter Hutterer e6bf129
-	*****************/
Peter Hutterer e6bf129
+        /*****************
Peter Hutterer e6bf129
+         *  Handle events in round robin fashion, doing input between
Peter Hutterer e6bf129
+         *  each round
Peter Hutterer e6bf129
+         *****************/
Peter Hutterer e6bf129
Peter Hutterer e6bf129
         if (!dispatchException && clients_are_ready()) {
Peter Hutterer e6bf129
             client = SmartScheduleClient();
Peter Hutterer e6bf129
@@ -3657,11 +3657,11 @@ ProcInitialConnection(ClientPtr client)
Peter Hutterer e6bf129
     prefix = (xConnClientPrefix *) ((char *)stuff + sz_xReq);
Peter Hutterer e6bf129
     order = prefix->byteOrder;
Peter Hutterer e6bf129
     if (order != 'l' && order != 'B' && order != 'r' && order != 'R')
Peter Hutterer e6bf129
-	return client->noClientException = -1;
Peter Hutterer e6bf129
+        return client->noClientException = -1;
Peter Hutterer e6bf129
     if (((*(char *) &whichbyte) && (order == 'B' || order == 'R')) ||
Peter Hutterer e6bf129
-	(!(*(char *) &whichbyte) && (order == 'l' || order == 'r'))) {
Peter Hutterer e6bf129
-	client->swapped = TRUE;
Peter Hutterer e6bf129
-	SwapConnClientPrefix(prefix);
Peter Hutterer e6bf129
+        (!(*(char *) &whichbyte) && (order == 'l' || order == 'r'))) {
Peter Hutterer e6bf129
+        client->swapped = TRUE;
Peter Hutterer e6bf129
+        SwapConnClientPrefix(prefix);
Peter Hutterer e6bf129
     }
Peter Hutterer e6bf129
     stuff->reqType = 2;
Peter Hutterer e6bf129
     stuff->length += bytes_to_int32(prefix->nbytesAuthProto) +
Peter Hutterer e6bf129
@@ -3670,7 +3670,7 @@ ProcInitialConnection(ClientPtr client)
Peter Hutterer e6bf129
         swaps(&stuff->length);
Peter Hutterer e6bf129
     }
Peter Hutterer e6bf129
     if (order == 'r' || order == 'R') {
Peter Hutterer e6bf129
-	client->local = FALSE;
Peter Hutterer e6bf129
+        client->local = FALSE;
Peter Hutterer e6bf129
     }
Peter Hutterer e6bf129
     ResetCurrentRequest(client);
Peter Hutterer e6bf129
     return Success;
Peter Hutterer e6bf129
@@ -3781,8 +3781,8 @@ ProcEstablishConnection(ClientPtr client)
Peter Hutterer e6bf129
     auth_string = auth_proto + pad_to_int32(prefix->nbytesAuthProto);
Peter Hutterer e6bf129
Peter Hutterer e6bf129
     if ((client->req_len << 2) != sz_xReq + sz_xConnClientPrefix +
Peter Hutterer e6bf129
-	pad_to_int32(prefix->nbytesAuthProto) +
Peter Hutterer e6bf129
-	pad_to_int32(prefix->nbytesAuthString))
Peter Hutterer e6bf129
+            pad_to_int32(prefix->nbytesAuthProto) +
Peter Hutterer e6bf129
+            pad_to_int32(prefix->nbytesAuthString))
Peter Hutterer e6bf129
         reason = "Bad length";
Peter Hutterer e6bf129
     else if ((prefix->majorVersion != X_PROTOCOL) ||
Peter Hutterer e6bf129
         (prefix->minorVersion != X_PROTOCOL_REVISION))
Peter Hutterer e6bf129
--
Peter Hutterer e6bf129
2.39.0
Peter Hutterer e6bf129
Peter Hutterer e6bf129
From f69280ddcdd3115ee4717f22e85e0f43569b60dd Mon Sep 17 00:00:00 2001
Peter Hutterer e6bf129
From: Peter Hutterer <peter.hutterer@who-t.net>
Peter Hutterer e6bf129
Date: Tue, 20 Dec 2022 11:40:16 +1000
Peter Hutterer e6bf129
Subject: [PATCH xserver] dix: localize two variables
Peter Hutterer e6bf129
Peter Hutterer e6bf129
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Peter Hutterer e6bf129
---
Peter Hutterer e6bf129
 dix/dispatch.c | 8 ++++----
Peter Hutterer e6bf129
 1 file changed, 4 insertions(+), 4 deletions(-)
Peter Hutterer e6bf129
Peter Hutterer e6bf129
diff --git a/dix/dispatch.c b/dix/dispatch.c
Peter Hutterer e6bf129
index c651c3d887..92be773e6c 100644
Peter Hutterer e6bf129
--- a/dix/dispatch.c
Peter Hutterer e6bf129
+++ b/dix/dispatch.c
Peter Hutterer e6bf129
@@ -3766,14 +3766,11 @@ int
Peter Hutterer e6bf129
 ProcEstablishConnection(ClientPtr client)
Peter Hutterer e6bf129
 {
Peter Hutterer e6bf129
     const char *reason;
Peter Hutterer e6bf129
-    char *auth_proto, *auth_string;
Peter Hutterer e6bf129
     xConnClientPrefix *prefix;
Peter Hutterer e6bf129
Peter Hutterer e6bf129
     REQUEST(xReq);
Peter Hutterer e6bf129
Peter Hutterer e6bf129
     prefix = (xConnClientPrefix *) ((char *) stuff + sz_xReq);
Peter Hutterer e6bf129
-    auth_proto = (char *) prefix + sz_xConnClientPrefix;
Peter Hutterer e6bf129
-    auth_string = auth_proto + pad_to_int32(prefix->nbytesAuthProto);
Peter Hutterer e6bf129
Peter Hutterer e6bf129
     if ((client->req_len << 2) != sz_xReq + sz_xConnClientPrefix +
Peter Hutterer e6bf129
             pad_to_int32(prefix->nbytesAuthProto) +
Peter Hutterer e6bf129
@@ -3782,12 +3779,15 @@ ProcEstablishConnection(ClientPtr client)
Peter Hutterer e6bf129
     else if ((prefix->majorVersion != X_PROTOCOL) ||
Peter Hutterer e6bf129
         (prefix->minorVersion != X_PROTOCOL_REVISION))
Peter Hutterer e6bf129
         reason = "Protocol version mismatch";
Peter Hutterer e6bf129
-    else
Peter Hutterer e6bf129
+    else {
Peter Hutterer e6bf129
+        char *auth_proto = (char *) prefix + sz_xConnClientPrefix;
Peter Hutterer e6bf129
+        char *auth_string = auth_proto + pad_to_int32(prefix->nbytesAuthProto);
Peter Hutterer e6bf129
         reason = ClientAuthorized(client,
Peter Hutterer e6bf129
                                   (unsigned short) prefix->nbytesAuthProto,
Peter Hutterer e6bf129
                                   auth_proto,
Peter Hutterer e6bf129
                                   (unsigned short) prefix->nbytesAuthString,
Peter Hutterer e6bf129
                                   auth_string);
Peter Hutterer e6bf129
+    }
Peter Hutterer e6bf129
Peter Hutterer e6bf129
     return (SendConnSetup(client, reason));
Peter Hutterer e6bf129
 }
Peter Hutterer e6bf129
--
Peter Hutterer e6bf129
2.39.0
Peter Hutterer e6bf129
Peter Hutterer e6bf129
From 412777664a20dd3561b936c02c96571a756fe9b2 Mon Sep 17 00:00:00 2001
Peter Hutterer e6bf129
From: Peter Hutterer <peter.hutterer@who-t.net>
Peter Hutterer e6bf129
Date: Tue, 20 Dec 2022 10:42:03 +1000
Peter Hutterer e6bf129
Subject: [PATCH xserver] Disallow byte-swapped clients by default
Peter Hutterer e6bf129
Peter Hutterer e6bf129
The X server swapping code is a huge attack surface, much of this code
Peter Hutterer e6bf129
is untested and prone to security issues. The use-case of byte-swapped
Peter Hutterer e6bf129
clients is very niche, so let's disable this by default and allow it
Peter Hutterer e6bf129
only when the respective config option or commandline flag is given.
Peter Hutterer e6bf129
Peter Hutterer e6bf129
For Xorg, this adds the ServerFlag "AllowByteSwappedClients" "on".
Peter Hutterer e6bf129
For all DDX, this adds the commandline options +byteswappedclients and
Peter Hutterer e6bf129
-byteswappedclients to enable or disable, respectively.
Peter Hutterer e6bf129
Peter Hutterer e6bf129
Fixes #1201
Peter Hutterer e6bf129
Peter Hutterer e6bf129
https://gitlab.freedesktop.org/xorg/xserver/-/merge_requests/1029
Peter Hutterer e6bf129
Peter Hutterer e6bf129
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Peter Hutterer e6bf129
---
Peter Hutterer e6bf129
 dix/dispatch.c                 | 4 +++-
Peter Hutterer e6bf129
 hw/xfree86/common/xf86Config.c | 8 ++++++++
Peter Hutterer e6bf129
 hw/xfree86/man/xorg.conf.man   | 2 ++
Peter Hutterer e6bf129
 hw/xwayland/xwayland.pc.in     | 1 +
Peter Hutterer e6bf129
 include/opaque.h               | 2 ++
Peter Hutterer e6bf129
 man/Xserver.man                | 6 ++++++
Peter Hutterer e6bf129
 os/utils.c                     | 9 +++++++++
Peter Hutterer e6bf129
 7 files changed, 31 insertions(+), 1 deletion(-)
Peter Hutterer e6bf129
Peter Hutterer e6bf129
diff --git a/dix/dispatch.c b/dix/dispatch.c
Peter Hutterer e6bf129
index 92be773e6c..9c26753a96 100644
Peter Hutterer e6bf129
--- a/dix/dispatch.c
Peter Hutterer e6bf129
+++ b/dix/dispatch.c
Peter Hutterer e6bf129
@@ -3772,7 +3772,9 @@ ProcEstablishConnection(ClientPtr client)
Peter Hutterer e6bf129
Peter Hutterer e6bf129
     prefix = (xConnClientPrefix *) ((char *) stuff + sz_xReq);
Peter Hutterer e6bf129
Peter Hutterer e6bf129
-    if ((client->req_len << 2) != sz_xReq + sz_xConnClientPrefix +
Peter Hutterer e6bf129
+    if (client->swapped && !AllowByteSwappedClients) {
Peter Hutterer e6bf129
+        reason = "Prohibited client endianess, see the Xserver man page ";
Peter Hutterer e6bf129
+    } else if ((client->req_len << 2) != sz_xReq + sz_xConnClientPrefix +
Peter Hutterer e6bf129
             pad_to_int32(prefix->nbytesAuthProto) +
Peter Hutterer e6bf129
             pad_to_int32(prefix->nbytesAuthString))
Peter Hutterer e6bf129
         reason = "Bad length";
Peter Hutterer e6bf129
diff --git a/hw/xfree86/common/xf86Config.c b/hw/xfree86/common/xf86Config.c
Peter Hutterer e6bf129
index 5d814c1485..41acb25aa2 100644
Peter Hutterer e6bf129
--- a/hw/xfree86/common/xf86Config.c
Peter Hutterer e6bf129
+++ b/hw/xfree86/common/xf86Config.c
Peter Hutterer e6bf129
@@ -646,6 +646,7 @@ typedef enum {
Peter Hutterer e6bf129
     FLAG_MAX_CLIENTS,
Peter Hutterer e6bf129
     FLAG_IGLX,
Peter Hutterer e6bf129
     FLAG_DEBUG,
Peter Hutterer e6bf129
+    FLAG_ALLOW_BYTE_SWAPPED_CLIENTS,
Peter Hutterer e6bf129
 } FlagValues;
Peter Hutterer e6bf129
Peter Hutterer e6bf129
 /**
Peter Hutterer e6bf129
@@ -705,6 +706,8 @@ static OptionInfoRec FlagOptions[] = {
Peter Hutterer e6bf129
      {0}, FALSE},
Peter Hutterer e6bf129
     {FLAG_DEBUG, "Debug", OPTV_STRING,
Peter Hutterer e6bf129
      {0}, FALSE},
Peter Hutterer e6bf129
+    {FLAG_ALLOW_BYTE_SWAPPED_CLIENTS, "AllowByteSwappedClients", OPTV_BOOLEAN,
Peter Hutterer e6bf129
+     {0}, FALSE},
Peter Hutterer e6bf129
     {-1, NULL, OPTV_NONE,
Peter Hutterer e6bf129
      {0}, FALSE},
Peter Hutterer e6bf129
 };
Peter Hutterer e6bf129
@@ -746,6 +749,11 @@ configServerFlags(XF86ConfFlagsPtr flagsconf, XF86OptionPtr layoutopts)
Peter Hutterer e6bf129
         xf86Msg(X_CONFIG, "Ignoring ABI Version\n");
Peter Hutterer e6bf129
     }
Peter Hutterer e6bf129
Peter Hutterer e6bf129
+    xf86GetOptValBool(FlagOptions, FLAG_ALLOW_BYTE_SWAPPED_CLIENTS, &AllowByteSwappedClients);
Peter Hutterer e6bf129
+    if (AllowByteSwappedClients) {
Peter Hutterer e6bf129
+        xf86Msg(X_CONFIG, "Allowing byte-swapped clients\n");
Peter Hutterer e6bf129
+    }
Peter Hutterer e6bf129
+
Peter Hutterer e6bf129
     if (xf86IsOptionSet(FlagOptions, FLAG_AUTO_ADD_DEVICES)) {
Peter Hutterer e6bf129
         xf86GetOptValBool(FlagOptions, FLAG_AUTO_ADD_DEVICES,
Peter Hutterer e6bf129
                           &xf86Info.autoAddDevices);
Peter Hutterer e6bf129
diff --git a/hw/xfree86/man/xorg.conf.man b/hw/xfree86/man/xorg.conf.man
Peter Hutterer e6bf129
index 01b47247ee..d057f26ecd 100644
Peter Hutterer e6bf129
--- a/hw/xfree86/man/xorg.conf.man
Peter Hutterer e6bf129
+++ b/hw/xfree86/man/xorg.conf.man
Peter Hutterer e6bf129
@@ -677,6 +677,8 @@ Possible values are
Peter Hutterer e6bf129
 or
Peter Hutterer e6bf129
 .BR sync .
Peter Hutterer e6bf129
 Unset by default.
Peter Hutterer e6bf129
+.BI "Option \*qAllowByteSwappedClients\*q  \*q" boolean \*q
Peter Hutterer e6bf129
+Allow clients with a different byte-order than the server. Disabled by default.
Peter Hutterer e6bf129
 .SH "MODULE SECTION"
Peter Hutterer e6bf129
 The
Peter Hutterer e6bf129
 .B Module
Peter Hutterer e6bf129
diff --git a/include/opaque.h b/include/opaque.h
Peter Hutterer e6bf129
index 256261c2ad..398d4b4e51 100644
Peter Hutterer e6bf129
--- a/include/opaque.h
Peter Hutterer e6bf129
+++ b/include/opaque.h
Peter Hutterer e6bf129
@@ -74,4 +74,6 @@ extern _X_EXPORT Bool bgNoneRoot;
Peter Hutterer e6bf129
 extern _X_EXPORT Bool CoreDump;
Peter Hutterer e6bf129
 extern _X_EXPORT Bool NoListenAll;
Peter Hutterer e6bf129
Peter Hutterer e6bf129
+extern _X_EXPORT Bool AllowByteSwappedClients;
Peter Hutterer e6bf129
+
Peter Hutterer e6bf129
 #endif                          /* OPAQUE_H */
Peter Hutterer e6bf129
diff --git a/man/Xserver.man b/man/Xserver.man
Peter Hutterer e6bf129
index 764bd1d907..e7adf9eb35 100644
Peter Hutterer e6bf129
--- a/man/Xserver.man
Peter Hutterer e6bf129
+++ b/man/Xserver.man
Peter Hutterer e6bf129
@@ -114,6 +114,12 @@ pattern.   This is the default unless -retro or -wr is specified.
Peter Hutterer e6bf129
 .B \-bs
Peter Hutterer e6bf129
 disables backing store support on all screens.
Peter Hutterer e6bf129
 .TP 8
Peter Hutterer e6bf129
+.B \+byteswappedclients
Peter Hutterer e6bf129
+Allow connections from clients with an endianess different to that of the server.
Peter Hutterer e6bf129
+.TP 8
Peter Hutterer e6bf129
+.B \-byteswappedclients
Peter Hutterer e6bf129
+Prohibit connections from clients with an endianess different to that of the server.
Peter Hutterer e6bf129
+.TP 8
Peter Hutterer e6bf129
 .B \-c
Peter Hutterer e6bf129
 turns off key-click.
Peter Hutterer e6bf129
 .TP 8
Peter Hutterer e6bf129
diff --git a/os/utils.c b/os/utils.c
Peter Hutterer e6bf129
index fe94912f34..405bf7d8b4 100644
Peter Hutterer e6bf129
--- a/os/utils.c
Peter Hutterer e6bf129
+++ b/os/utils.c
Peter Hutterer e6bf129
@@ -189,6 +189,8 @@ Bool CoreDump;
Peter Hutterer e6bf129
Peter Hutterer e6bf129
 Bool enableIndirectGLX = FALSE;
Peter Hutterer e6bf129
Peter Hutterer e6bf129
+Bool AllowByteSwappedClients = FALSE;
Peter Hutterer e6bf129
+
Peter Hutterer e6bf129
 #ifdef PANORAMIX
Peter Hutterer e6bf129
 Bool PanoramiXExtensionDisabledHack = FALSE;
Peter Hutterer e6bf129
 #endif
Peter Hutterer e6bf129
@@ -523,6 +525,8 @@ UseMsg(void)
Peter Hutterer e6bf129
     ErrorF("-br                    create root window with black background\n");
Peter Hutterer e6bf129
     ErrorF("+bs                    enable any backing store support\n");
Peter Hutterer e6bf129
     ErrorF("-bs                    disable any backing store support\n");
Peter Hutterer e6bf129
+    ErrorF("+byteswappedclients    Allow clients with endianess different to that of the server\n");
Peter Hutterer e6bf129
+    ErrorF("-byteswappedclients    Prohibit clients with endianess different to that of the server\n");
Peter Hutterer e6bf129
     ErrorF("-c                     turns off key-click\n");
Peter Hutterer e6bf129
     ErrorF("c #                    key-click volume (0-100)\n");
Peter Hutterer e6bf129
     ErrorF("-cc int                default color visual class\n");
Peter Hutterer e6bf129
@@ -720,6 +724,11 @@ ProcessCommandLine(int argc, char *argv[])
Peter Hutterer e6bf129
             else
Peter Hutterer e6bf129
                 UseMsg();
Peter Hutterer e6bf129
         }
Peter Hutterer e6bf129
+        else if (strcmp(argv[i], "-byteswappedclients") == 0) {
Peter Hutterer e6bf129
+            AllowByteSwappedClients = FALSE;
Peter Hutterer e6bf129
+        } else if (strcmp(argv[i], "+byteswappedclients") == 0) {
Peter Hutterer e6bf129
+            AllowByteSwappedClients = TRUE;
Peter Hutterer e6bf129
+        }
Peter Hutterer e6bf129
         else if (strcmp(argv[i], "-br") == 0);  /* default */
Peter Hutterer e6bf129
         else if (strcmp(argv[i], "+bs") == 0)
Peter Hutterer e6bf129
             enableBackingStore = TRUE;
Peter Hutterer e6bf129
--
Peter Hutterer e6bf129
2.39.0
Peter Hutterer e6bf129