aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Gabriel <mike.gabriel@das-netzwerkteam.de>2018-08-24 11:55:24 +0200
committerMike Gabriel <mike.gabriel@das-netzwerkteam.de>2018-08-24 11:55:24 +0200
commit930bd283339d899aa0e2e521521ec56959f2a72c (patch)
tree1f123a90eb1ef9dc7e39ccdc6f97f07f89ae2e4e
parentfad80bc4fda7edec2b6a7c19dcd1a03600646fec (diff)
parent30a96273380a53320c8950f945b1f52c111337ce (diff)
downloadnx-libs-930bd283339d899aa0e2e521521ec56959f2a72c.tar.gz
nx-libs-930bd283339d899aa0e2e521521ec56959f2a72c.tar.bz2
nx-libs-930bd283339d899aa0e2e521521ec56959f2a72c.zip
Merge branch 'uli42-pr/decode_options' into 3.6.x
Attributes GH PR #725: https://github.com/ArcticaProject/nx-libs/pull/725
-rw-r--r--nx-X11/programs/Xserver/hw/nxagent/Args.c63
-rw-r--r--nx-X11/programs/Xserver/hw/nxagent/man/nxagent.15
2 files changed, 54 insertions, 14 deletions
diff --git a/nx-X11/programs/Xserver/hw/nxagent/Args.c b/nx-X11/programs/Xserver/hw/nxagent/Args.c
index 262c1dfdb..801ee0b22 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/Args.c
+++ b/nx-X11/programs/Xserver/hw/nxagent/Args.c
@@ -1037,17 +1037,52 @@ int ddxProcessArgument(int argc, char *argv[], int i)
return 0;
}
-static void nxagentParseOptions(char *name, char *value)
+/* copy from nxcomp's Loop.cpp */
+static int
+hexval(char c) {
+ if ((c >= '0') && (c <= '9'))
+ return c - '0';
+ if ((c >= 'a') && (c <= 'f'))
+ return c - 'a' + 10;
+ if ((c >= 'A') && (c <= 'F'))
+ return c - 'A' + 10;
+ return -1;
+}
+
+static void
+URLDecodeInPlace(char *str)
+{
+ if (str) {
+ char *to = str;
+ while (str[0])
+ {
+ if ((str[0] == '%') &&
+ (hexval(str[1]) >= 0) &&
+ (hexval(str[2]) >= 0))
+ {
+ *(to++) = hexval(str[1]) * 16 + hexval(str[2]);
+ str += 3;
+ }
+ else
+ *(to++) = *(str++);
+ }
+ *to = '\0';
+ }
+}
+
+static void nxagentParseSingleOption(char *name, char *value)
{
int size, argc;
char *argv[2] = { NULL, NULL };
#ifdef TEST
- fprintf(stderr, "nxagentParseOptions: Processing option '%s' = '%s'.\n",
+ fprintf(stderr, "nxagentParseSingleOption: Processing option '%s' = '%s'.\n",
validateString(name), validateString(value));
#endif
+ URLDecodeInPlace(value);
+
if (!strcmp(name, "kbtype") ||
!strcmp(name, "keyboard") ||
!strcmp(name, "id") ||
@@ -1081,7 +1116,7 @@ static void nxagentParseOptions(char *name, char *value)
if (nxagentReconnectTrap == True)
{
#ifdef DEBUG
- fprintf(stderr, "nxagentParseOptions: Ignoring option 'render' at reconnection.\n");
+ fprintf(stderr, "nxagentParseSingleOption: Ignoring option 'render' at reconnection.\n");
#endif
}
else if (nxagentRenderEnable == UNDEFINED)
@@ -1113,7 +1148,7 @@ static void nxagentParseOptions(char *name, char *value)
if (nxagentReconnectTrap == True)
{
#ifdef DEBUG
- fprintf(stderr, "nxagentParseOptions: Ignoring option 'fullscreen' at reconnection.\n");
+ fprintf(stderr, "nxagentParseSingleOption: Ignoring option 'fullscreen' at reconnection.\n");
#endif
}
else if (!strcmp(value, "1"))
@@ -1283,7 +1318,7 @@ static void nxagentParseOptions(char *name, char *value)
if (nxagentReconnectTrap == True)
{
#ifdef DEBUG
- fprintf(stderr, "nxagentParseOptions: Ignoring option 'autodpi' at reconnection.\n");
+ fprintf(stderr, "nxagentParseSingleOption: Ignoring option 'autodpi' at reconnection.\n");
#endif
}
else if (!strcmp(value, "0"))
@@ -1368,7 +1403,7 @@ static void nxagentParseOptions(char *name, char *value)
if ((errno) && (0 == sleep_parse))
{
- fprintf(stderr, "nxagentParseOptions: Unable to convert value [%s] of option [%s]. "
+ fprintf(stderr, "nxagentParseSingleOption: Unable to convert value [%s] of option [%s]. "
"Ignoring option.\n",
validateString(value), validateString(name));
@@ -1379,7 +1414,7 @@ static void nxagentParseOptions(char *name, char *value)
{
sleep_parse = UINT_MAX;
- fprintf(stderr, "nxagentParseOptions: Warning: value [%s] of option [%s] "
+ fprintf(stderr, "nxagentParseSingleOption: Warning: value [%s] of option [%s] "
"out of range, clamped to [%lu].\n",
validateString(value), validateString(name), sleep_parse);
}
@@ -1388,7 +1423,7 @@ static void nxagentParseOptions(char *name, char *value)
{
sleep_parse = 0;
- fprintf(stderr, "nxagentParseOptions: Warning: value [%s] of option [%s] "
+ fprintf(stderr, "nxagentParseSingleOption: Warning: value [%s] of option [%s] "
"out of range, clamped to [%lu].\n",
validateString(value), validateString(name), sleep_parse);
}
@@ -1427,7 +1462,7 @@ static void nxagentParseOptions(char *name, char *value)
if ((errno) && (0 == tolerance_parse))
{
- fprintf(stderr, "nxagentParseOptions: Unable to convert value [%s] of option [%s]. "
+ fprintf(stderr, "nxagentParseSingleOption: Unable to convert value [%s] of option [%s]. "
"Ignoring option.\n",
validateString(value), validateString(name));
@@ -1438,7 +1473,7 @@ static void nxagentParseOptions(char *name, char *value)
{
tolerance_parse = UINT_MAX;
- fprintf(stderr, "nxagentParseOptions: Warning: value [%s] of option [%s] "
+ fprintf(stderr, "nxagentParseSingleOption: Warning: value [%s] of option [%s] "
"out of range, clamped to [%lu].\n",
validateString(value), validateString(name), tolerance_parse);
}
@@ -1447,7 +1482,7 @@ static void nxagentParseOptions(char *name, char *value)
{
tolerance_parse = 0;
- fprintf(stderr, "nxagentParseOptions: Warning: value [%s] of option [%s] "
+ fprintf(stderr, "nxagentParseSingleOption: Warning: value [%s] of option [%s] "
"out of range, clamped to [%lu].\n",
validateString(value), validateString(name), tolerance_parse);
}
@@ -1460,7 +1495,7 @@ static void nxagentParseOptions(char *name, char *value)
case ToleranceChecksBypass:
break;
default:
- fprintf(stderr, "nxagentParseOptions: Warning: value [%s] of "
+ fprintf(stderr, "nxagentParseSingleOption: Warning: value [%s] of "
"option [%s] unknown, will be mapped to "
"\"Bypass\" [%u] value internally.\n",
validateString(value), validateString(name),
@@ -1495,7 +1530,7 @@ static void nxagentParseOptions(char *name, char *value)
else
{
#ifdef DEBUG
- fprintf(stderr, "nxagentParseOptions: Ignored option [%s] with value [%s].\n",
+ fprintf(stderr, "nxagentParseSingleOption: Ignored option [%s] with value [%s].\n",
validateString(name), validateString(value));
#endif
@@ -1563,7 +1598,7 @@ static void nxagentParseOptionString(char *string)
value = NULL;
}
- nxagentParseOptions(option, value);
+ nxagentParseSingleOption(option, value);
}
}
diff --git a/nx-X11/programs/Xserver/hw/nxagent/man/nxagent.1 b/nx-X11/programs/Xserver/hw/nxagent/man/nxagent.1
index b9c81cdb4..6a0bfc103 100644
--- a/nx-X11/programs/Xserver/hw/nxagent/man/nxagent.1
+++ b/nx-X11/programs/Xserver/hw/nxagent/man/nxagent.1
@@ -480,6 +480,11 @@ As <proxy-port> you can pick an arbitrary (unused) TCP port or Unix
socket file path. This is the port / socket that you have to connect to
with the \fBnxproxy\fR application.
.PP
+The right hand side of an option (the part following the "=" character)
+can include URL encoded characters. It is required to URL encode at
+least "," (as %2D) and "=" (as %3D) to avoid wrong parsing of the
+options string.
+.PP
Available \fBnxagent\fR options (as an addition to nx/nx options supported
by nxcomp already):
.TP 8