From 645c1f2aea0af84f607575d25720426cb3130db4 Mon Sep 17 00:00:00 2001 From: Catherine Tower Date: Tue, 23 Aug 2022 18:39:33 -0700 Subject: [PATCH] Ignore whitespace around components of host-and-port specification This is to make the code more tolerant of typos when entering a hostname --- common/rfb/Hostname.h | 24 ++++++++++++++++++++++-- tests/unit/hostport.cxx | 12 ++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/common/rfb/Hostname.h b/common/rfb/Hostname.h index bd68dc02..341f69e1 100644 --- a/common/rfb/Hostname.h +++ b/common/rfb/Hostname.h @@ -20,12 +20,24 @@ #define __RFB_HOSTNAME_H__ #include +#include #include #include #include namespace rfb { + static bool isAllSpace(const char *string) { + if (string == NULL) + return false; + while(*string != '\0') { + if (! isspace(*string)) + return false; + string++; + } + return true; + } + static void getHostAndPort(const char* hi, char** host, int* port, int basePort=5900) { const char* hostStart; const char* hostEnd; @@ -34,6 +46,10 @@ namespace rfb { if (hi == NULL) throw rdr::Exception("NULL host specified"); + // Trim leading whitespace + while(isspace(*hi)) + hi++; + assert(host); assert(port); @@ -44,7 +60,7 @@ namespace rfb { throw rdr::Exception("unmatched [ in host"); portStart = hostEnd + 1; - if (*portStart == '\0') + if (isAllSpace(portStart)) portStart = NULL; } else { hostStart = &hi[0]; @@ -65,6 +81,10 @@ namespace rfb { } } + // Back up past trailing space + while(isspace(*(hostEnd - 1)) && hostEnd > hostStart) + hostEnd--; + if (hostStart == hostEnd) *host = strDup("localhost"); else { @@ -87,7 +107,7 @@ namespace rfb { *port = strtol(portStart + 1, &end, 10); else *port = strtol(portStart + 2, &end, 10); - if (*end != '\0') + if (*end != '\0' && ! isAllSpace(end)) throw rdr::Exception("invalid port specified"); if ((portStart[1] != ':') && (*port < 100)) diff --git a/tests/unit/hostport.cxx b/tests/unit/hostport.cxx index af60643a..6ca5df8f 100644 --- a/tests/unit/hostport.cxx +++ b/tests/unit/hostport.cxx @@ -80,5 +80,17 @@ int main(int argc, char** argv) doTest("[2001:1234::20:1]:100", "2001:1234::20:1", 100); doTest("[2001:1234::20:1]:5901", "2001:1234::20:1", 5901); + doTest(" 1.2.3.4 ", "1.2.3.4", 5900); + doTest(" 1.2.3.4:5901 ", "1.2.3.4", 5901); + doTest(" 1.2.3.4: 5901 ", "1.2.3.4", 5901); + doTest(" 1.2.3.4 :5901 ", "1.2.3.4", 5901); + doTest(" [1.2.3.4]:5902 ", "1.2.3.4", 5902); + doTest(" :5903 ", "localhost", 5903); + doTest(" ::4 ", "localhost", 4); + doTest(" [::1] ", "::1", 5900); + doTest(" 2001:1234::20:1 ", "2001:1234::20:1", 5900); + doTest(" [2001:1234::20:1] ", "2001:1234::20:1", 5900); + doTest(" [2001:1234::20:1]:5905 ", "2001:1234::20:1", 5905); + return 0; } -- 2.39.5