From e7cb5bd64ad49c4c25f662983db78de03df87542 Mon Sep 17 00:00:00 2001 From: matt335672 <30179339+matt335672@users.noreply.github.com> Date: Wed, 31 Mar 2021 11:31:41 +0100 Subject: [PATCH] Allow DISPLAY=:0 for chansrv and in other modules --- sesman/chansrv/chansrv.c | 96 ++++++++++++--------------------- sesman/chansrv/pcsc/xrdp_pcsc.c | 12 +++-- xrdpapi/xrdpapi.c | 10 ++-- 3 files changed, 50 insertions(+), 68 deletions(-) diff --git a/sesman/chansrv/chansrv.c b/sesman/chansrv/chansrv.c index 4bca525e..5a96f9b8 100644 --- a/sesman/chansrv/chansrv.c +++ b/sesman/chansrv/chansrv.c @@ -17,6 +17,8 @@ * limitations under the License. */ +#include + #if defined(HAVE_CONFIG_H) #include #endif @@ -61,7 +63,7 @@ static tbus g_thread_done_event = 0; struct config_chansrv *g_cfg = NULL; -int g_display_num = 0; +int g_display_num = -1; int g_cliprdr_chan_id = -1; /* cliprdr */ int g_rdpsnd_chan_id = -1; /* rdpsnd */ int g_rdpdr_chan_id = -1; /* rdpdr */ @@ -1559,61 +1561,30 @@ x_server_fatal_handler(void) /*****************************************************************************/ static int -get_display_num_from_display(char *display_text) +get_display_num_from_display(const char *display_text) { - int index; - int mode; - int host_index; - int disp_index; - int scre_index; - char host[256]; - char disp[256]; - char scre[256]; + int rv = -1; + const char *p; - g_memset(host, 0, 256); - g_memset(disp, 0, 256); - g_memset(scre, 0, 256); - - index = 0; - host_index = 0; - disp_index = 0; - scre_index = 0; - mode = 0; - - while (display_text[index] != 0) + /* Skip over the hostname part of the DISPLAY */ + if ((p = g_strchr(display_text, ':')) != NULL) { - if (display_text[index] == ':') + ++p; /* Skip the ':' */ + + /* Cater for the (still supported) double-colon. See + * https://www.x.org/releases/X11R7.7/doc/libX11/libX11/libX11.html */ + if (*p == ':') { - mode = 1; - } - else if (display_text[index] == '.') - { - mode = 2; - } - else if (mode == 0) - { - host[host_index] = display_text[index]; - host_index++; - } - else if (mode == 1) - { - disp[disp_index] = display_text[index]; - disp_index++; - } - else if (mode == 2) - { - scre[scre_index] = display_text[index]; - scre_index++; + ++p; } - index++; + if (isdigit(*p)) + { + rv = g_atoi(p); + } } - host[host_index] = 0; - disp[disp_index] = 0; - scre[scre_index] = 0; - g_display_num = g_atoi(disp); - return 0; + return rv; } /*****************************************************************************/ @@ -1728,7 +1699,7 @@ main(int argc, char **argv) char text[256]; const char *config_path; char log_path[256]; - char *display_text; + const char *display_text; char log_file[256]; enum logReturns error; struct log_config *logconfig; @@ -1743,6 +1714,21 @@ main(int argc, char **argv) return 1; } + display_text = g_getenv("DISPLAY"); + if (display_text == NULL) + { + g_writeln("DISPLAY is not set"); + main_cleanup(); + return 1; + } + g_display_num = get_display_num_from_display(display_text); + if (g_display_num < 0) + { + g_writeln("Unable to get display from DISPLAY='%s'", display_text); + main_cleanup(); + return 1; + } + /* * The user is unable at present to override the sysadmin-provided * sesman.ini location */ @@ -1755,11 +1741,6 @@ main(int argc, char **argv) config_dump(g_cfg); pid = g_getpid(); - display_text = g_getenv("DISPLAY"); - if (display_text != NULL) - { - get_display_num_from_display(display_text); - } /* starting logging subsystem */ g_snprintf(log_file, 255, "%s/xrdp-chansrv.%d.log", log_path, g_display_num); @@ -1813,13 +1794,6 @@ main(int argc, char **argv) LOG_DEVEL(LOG_LEVEL_INFO, "main: DISPLAY env var set to %s", display_text); - if (g_display_num == 0) - { - LOG_DEVEL(LOG_LEVEL_ERROR, "main: error, display is zero"); - main_cleanup(); - return 1; - } - LOG_DEVEL(LOG_LEVEL_INFO, "main: using DISPLAY %d", g_display_num); g_snprintf(text, 255, "xrdp_chansrv_%8.8x_main_term", pid); g_term_event = g_create_wait_obj(text); diff --git a/sesman/chansrv/pcsc/xrdp_pcsc.c b/sesman/chansrv/pcsc/xrdp_pcsc.c index a6ea874a..cf958dbb 100644 --- a/sesman/chansrv/pcsc/xrdp_pcsc.c +++ b/sesman/chansrv/pcsc/xrdp_pcsc.c @@ -194,6 +194,10 @@ get_display_num_from_display(const char *display_text) } else if (mode == 1) { + if (display_text[index] < '0' || display_text[index] > '9') + { + return -1; + } disp[disp_index] = display_text[index]; disp_index++; } @@ -209,7 +213,7 @@ get_display_num_from_display(const char *display_text) scre[scre_index] = 0; LLOGLN(10, ("get_display_num_from_display: host [%s] disp [%s] scre [%s]", host, disp, scre)); - rv = atoi(disp); + rv = (disp_index== 0) ? -1 : atoi(disp); return rv; } @@ -253,10 +257,10 @@ connect_to_chansrv(void) return 1; } dis = get_display_num_from_display(xrdp_display); - if (dis < 10) + if (dis < 0) { - /* DISPLAY must be > 9 */ - LLOGLN(0, ("connect_to_chansrv: error, display not > 9 %d", dis)); + LLOGLN(0, ("connect_to_chansrv: error, don't understand DISPLAY='%s'", + xrdp_display)); return 1; } g_sck = socket(PF_LOCAL, SOCK_STREAM, 0); diff --git a/xrdpapi/xrdpapi.c b/xrdpapi/xrdpapi.c index db1a1a7d..11198e28 100644 --- a/xrdpapi/xrdpapi.c +++ b/xrdpapi/xrdpapi.c @@ -120,9 +120,9 @@ WTSVirtualChannelOpenEx(unsigned int SessionId, const char *pVirtualName, wts->display_num = get_display_num_from_display(display_text); } - if (wts->display_num <= 0) + if (wts->display_num < 0) { - LOG(LOG_LEVEL_ERROR, "WTSVirtualChannelOpenEx: fatal error; display is <= 0"); + LOG(LOG_LEVEL_ERROR, "WTSVirtualChannelOpenEx: fatal error; invalid DISPLAY"); free(wts); return NULL; } @@ -552,6 +552,10 @@ get_display_num_from_display(char *display_text) } else if (mode == 1) { + if (display_text[index] < '0' || display_text[index] > '9') + { + return -1; + } disp[disp_index] = display_text[index]; disp_index++; } @@ -559,5 +563,5 @@ get_display_num_from_display(char *display_text) } disp[disp_index] = 0; - return atoi(disp); + return (disp_index== 0) ? -1 : atoi(disp); }