/* netname "." is special: a "top-level name" */
- if(netname && !strcmp(netname, ".")) {
+ if(netname && (!*netname || !strcmp(netname, "."))) {
free(netname);
netname = NULL;
}
+ if(netname && (strpbrk(netname, "\\/") || *netname == '.')) {
+ fprintf(stderr, "Invalid character in netname!\n");
+ return false;
+ }
+
return true;
}
{"KeyExpire", VAR_SERVER},
{"LocalDiscovery", VAR_SERVER},
{"MACExpire", VAR_SERVER},
+ {"MaxOutputBufferSize", VAR_SERVER},
{"MaxTimeout", VAR_SERVER},
{"Mode", VAR_SERVER},
{"Name", VAR_SERVER},
{"PrivateKey", VAR_SERVER | VAR_OBSOLETE},
{"PrivateKeyFile", VAR_SERVER},
{"ProcessPriority", VAR_SERVER},
+ {"Proxy", VAR_SERVER},
{"ReplayWindow", VAR_SERVER},
{"StrictSubnets", VAR_SERVER},
{"TunnelServer", VAR_SERVER},
{"UDPRcvBuf", VAR_SERVER},
{"UDPSndBuf", VAR_SERVER},
+ {"VDEGroup", VAR_SERVER},
+ {"VDEPort", VAR_SERVER},
/* Host configuration */
{"Address", VAR_HOST | VAR_MULTIPLE},
{"Cipher", VAR_SERVER | VAR_HOST},
{"ClampMSS", VAR_SERVER | VAR_HOST},
{"Compression", VAR_SERVER | VAR_HOST},
{"Digest", VAR_SERVER | VAR_HOST},
+ {"ECDSAPublicKey", VAR_HOST},
+ {"ECDSAPublicKeyFile", VAR_SERVER | VAR_HOST},
{"IndirectData", VAR_SERVER | VAR_HOST},
{"MACLength", VAR_SERVER | VAR_HOST},
{"PMTU", VAR_SERVER | VAR_HOST},
{"PMTUDiscovery", VAR_SERVER | VAR_HOST},
{"Port", VAR_HOST},
- {"PublicKey", VAR_SERVER | VAR_HOST | VAR_OBSOLETE},
+ {"PublicKey", VAR_HOST | VAR_OBSOLETE},
{"PublicKeyFile", VAR_SERVER | VAR_HOST | VAR_OBSOLETE},
{"Subnet", VAR_HOST | VAR_MULTIPLE},
{"TCPOnly", VAR_SERVER | VAR_HOST},
+ {"Weight", VAR_HOST},
{NULL, 0}
};
}
bool check_id(const char *name) {
+ if(!name || !*name)
+ return false;
+
for(int i = 0; i < strlen(name); i++) {
if(!isalnum(name[i]) && name[i] != '_')
return false;