[PATCH 5/7] dix: Extend initial connection handshake for forwarding proxies
walter harms
wharms at bfs.de
Fri Sep 21 01:21:56 PDT 2012
Am 20.09.2012 22:56, schrieb Adam Jackson:
> Forwarding proxies like sshd will appear to be local, even though they
> aren't really. This leads to weird behaviour for extensions that truly
> require running under the same OS services as the client, like MIT-SHM
> and DRI2.
>
> Add two new legal values for the initial connection's byteOrder field,
> 'r' and 'R'. These act like 'l' and 'B' respectively, but have the side
> effect of forcing the client to be treated as non-local. Forwarding
> proxies should attempt to munge the first packet of the connection
> accordingly; older servers will reject connections thusly munged, so the
> proxy should fall back to passthrough if the munged connection attempt
> fails.
>
> Reviewed-by: Daniel Stone <daniel at fooishbar.org>
> Signed-off-by: Adam Jackson <ajax at redhat.com>
> ---
> dix/dispatch.c | 19 ++++++++++++-------
> os/connection.c | 10 +++++-----
> 2 files changed, 17 insertions(+), 12 deletions(-)
>
> diff --git a/dix/dispatch.c b/dix/dispatch.c
> index 0ce10c2..2df1a6e 100644
> --- a/dix/dispatch.c
> +++ b/dix/dispatch.c
> @@ -3499,14 +3499,16 @@ ProcInitialConnection(ClientPtr client)
> REQUEST(xReq);
> xConnClientPrefix *prefix;
> int whichbyte = 1;
> + char order;
>
> - prefix = (xConnClientPrefix *) ((char *) stuff + sz_xReq);
> - if ((prefix->byteOrder != 'l') && (prefix->byteOrder != 'B'))
> - return client->noClientException = -1;
> - if (((*(char *) &whichbyte) && (prefix->byteOrder == 'B')) ||
> - (!(*(char *) &whichbyte) && (prefix->byteOrder == 'l'))) {
> - client->swapped = TRUE;
> - SwapConnClientPrefix(prefix);
> + prefix = (xConnClientPrefix *) ((char *)stuff + sz_xReq);
> + order = prefix->byteOrder;
> + if (order != 'l' && order != 'B' && order != 'r' && order != 'R')
> + return client->noClientException = -1;
> + if (((*(char *) &whichbyte) && (order == 'B' || order == 'R')) ||
> + (!(*(char *) &whichbyte) && (order == 'l' || order == 'r'))) {
> + client->swapped = TRUE;
> + SwapConnClientPrefix(prefix);
> }
this is hard to read, is it possible to have *(char *) &whichbyte in a tmp var ?
re,
wh
> stuff->reqType = 2;
> stuff->length += bytes_to_int32(prefix->nbytesAuthProto) +
> @@ -3514,6 +3516,9 @@ ProcInitialConnection(ClientPtr client)
> if (client->swapped) {
> swaps(&stuff->length);
> }
> + if (order == 'r' || order == 'R') {
> + client->local = FALSE;
> + }
> ResetCurrentRequest(client);
> return Success;
> }
> diff --git a/os/connection.c b/os/connection.c
> index d27116a..4561caa 100644
> --- a/os/connection.c
> +++ b/os/connection.c
> @@ -894,7 +894,7 @@ ErrorConnMax(XtransConnInfo trans_conn)
> xConnSetupPrefix csp;
> char pad[3] = { 0, 0, 0 };
> struct iovec iov[3];
> - char byteOrder = 0;
> + char order = 0;
> int whichbyte = 1;
> struct timeval waittime;
> fd_set mask;
> @@ -907,15 +907,15 @@ ErrorConnMax(XtransConnInfo trans_conn)
> FD_SET(fd, &mask);
> (void) Select(fd + 1, &mask, NULL, NULL, &waittime);
> /* try to read the byte-order of the connection */
> - (void) _XSERVTransRead(trans_conn, &byteOrder, 1);
> - if ((byteOrder == 'l') || (byteOrder == 'B')) {
> + (void) _XSERVTransRead(trans_conn, &order, 1);
> + if (order == 'l' || order == 'B' || order == 'r' || order == 'R') {
> csp.success = xFalse;
> csp.lengthReason = sizeof(NOROOM) - 1;
> csp.length = (sizeof(NOROOM) + 2) >> 2;
> csp.majorVersion = X_PROTOCOL;
> csp.minorVersion = X_PROTOCOL_REVISION;
> - if (((*(char *) &whichbyte) && (byteOrder == 'B')) ||
> - (!(*(char *) &whichbyte) && (byteOrder == 'l'))) {
> + if (((*(char *) &whichbyte) && (order == 'B' || order == 'R')) ||
> + (!(*(char *) &whichbyte) && (order == 'l' || order == 'r'))) {
> swaps(&csp.majorVersion);
> swaps(&csp.minorVersion);
> swaps(&csp.length);
More information about the xorg-devel
mailing list