make vsock config accept -1 for cid and port

linux/vm_sockets.h defines VMADDR_CID_ANY and VMADDR_PORT_ANY (both
equal to -1U) for vsock cid and port respectively. This change aims to
add the capability to parse negative cid and port numbers for vsock from
the config and pass them to the kernel.

Allows for valid configurations such as "port=vsock://-1:3389" to be
correctly processed, but will parse port and cid inputs like "---1" to
"-", which should currently get silently turned into 0 by atoi inside
g_sck_vsock_bind_address. Inputs that do not contain "-" get parsed as
by xrdp_listen_parse_integer.
This commit is contained in:
Belinsky-L-V 2019-11-12 21:58:36 +03:00
parent 8e10f0820c
commit a2fd7c09fa

View File

@ -356,6 +356,53 @@ xrdp_listen_parse_integer(char *strout, int strout_max,
return count;
}
/*****************************************************************************/
static int
xrdp_listen_parse_vsock(char *strout, int strout_max,
const char *strin, int strin_max)
{
int count;
int in;
int strin_index;
int strout_index;
strin_index = 0;
strout_index = 0;
in = 0;
count = 0;
while ((strin_index < strin_max) && (strout_index < strout_max))
{
if (in)
{
if ((strin[strin_index] >= '0') && (strin[strin_index] <= '9'))
{
strout[strout_index++] = strin[strin_index++];
count++;
continue;
}
else
{
break;
}
}
else
{
if (((strin[strin_index] >= '0') && (strin[strin_index] <= '9')) ||
(strin[strin_index] == '-'))
{
in = 1;
strout[strout_index++] = strin[strin_index++];
count++;
continue;
}
}
strin_index++;
count++;
}
strout[strout_index] = 0;
return count;
}
/*****************************************************************************/
static int
xrdp_listen_parse_ipv4(char *strout, int strout_max,
@ -559,10 +606,10 @@ xrdp_listen_pp(struct xrdp_listen *self, int *index,
{
str += 8;
lindex += 8;
bytes = xrdp_listen_parse_integer(address, 128, str, str_end - str);
bytes = xrdp_listen_parse_vsock(address, 128, str, str_end - str);
str += bytes;
lindex += bytes;
bytes = xrdp_listen_parse_integer(port, 128, str, str_end - str);
bytes = xrdp_listen_parse_vsock(port, 128, str, str_end - str);
str += bytes;
lindex += bytes;
*mode = TRANS_MODE_VSOCK;