X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=src%2Fnet_setup.c;h=f1a70f344e9c0790f6dbaaaf4dd9aa37e696a8e3;hb=f144971bf2e13baa80e41188546533f73f3cf453;hp=d78912614762a65d9d5e2ec14e2398457cbf2cce;hpb=f41e5faeaae94973ef1040356532afa277ae130f;p=tinc diff --git a/src/net_setup.c b/src/net_setup.c index d7891261..f1a70f34 100644 --- a/src/net_setup.c +++ b/src/net_setup.c @@ -52,10 +52,11 @@ static io_t device_io; devops_t devops; bool device_standby = false; -char *proxyhost; -char *proxyport; -char *proxyuser; -char *proxypass; +char *proxyhost = NULL; +char *proxyport = NULL; +char *proxyuser = NULL; +char *proxypass = NULL; + proxytype_t proxytype; bool autoconnect; bool disablebuggypeers; @@ -231,7 +232,7 @@ static bool read_ecdsa_private_key(void) { return false; } - if(s.st_mode & ~0100700) { + if(s.st_mode & ~0100700u) { logger(DEBUG_ALWAYS, LOG_WARNING, "Warning: insecure file permissions for Ed25519 private key file `%s'!", fname); } @@ -323,7 +324,7 @@ static bool read_rsa_private_key(void) { return false; } - if(s.st_mode & ~0100700) { + if(s.st_mode & ~0100700u) { logger(DEBUG_ALWAYS, LOG_WARNING, "Warning: insecure file permissions for RSA private key file `%s'!", fname); } @@ -435,18 +436,10 @@ char *get_name(void) { } bool setup_myself_reloadable(void) { - char *proxy = NULL; - char *rmode = NULL; - char *fmode = NULL; - char *bmode = NULL; - char *afname = NULL; - char *space; - bool choice; - free(scriptinterpreter); scriptinterpreter = NULL; - get_config_string(lookup_config(config_tree, "ScriptsInterpreter"), &scriptinterpreter); + get_config_string(lookup_config(config_tree, "ScriptsInterpreter"), &scriptinterpreter); free(scriptextension); @@ -454,9 +447,13 @@ bool setup_myself_reloadable(void) { scriptextension = xstrdup(""); } + char *proxy = NULL; + get_config_string(lookup_config(config_tree, "Proxy"), &proxy); if(proxy) { + char *space; + if((space = strchr(proxy, ' '))) { *space++ = 0; } @@ -475,9 +472,22 @@ bool setup_myself_reloadable(void) { proxytype = PROXY_EXEC; } else { logger(DEBUG_ALWAYS, LOG_ERR, "Unknown proxy type %s!", proxy); + free(proxy); return false; } + free(proxyhost); + proxyhost = NULL; + + free(proxyport); + proxyport = NULL; + + free(proxyuser); + proxyuser = NULL; + + free(proxypass); + proxypass = NULL; + switch(proxytype) { case PROXY_NONE: default: @@ -486,10 +496,11 @@ bool setup_myself_reloadable(void) { case PROXY_EXEC: if(!space || !*space) { logger(DEBUG_ALWAYS, LOG_ERR, "Argument expected for proxy type exec!"); + free(proxy); return false; } - proxyhost = xstrdup(space); + proxyhost = xstrdup(space); break; case PROXY_SOCKS4: @@ -502,6 +513,14 @@ bool setup_myself_reloadable(void) { *space++ = 0, proxyport = space; } + if(!proxyhost || !*proxyhost || !proxyport || !*proxyport) { + logger(DEBUG_ALWAYS, LOG_ERR, "Host and port argument expected for proxy!"); + proxyport = NULL; + proxyhost = NULL; + free(proxy); + return false; + } + if(space && (space = strchr(space, ' '))) { *space++ = 0, proxyuser = space; } @@ -510,11 +529,6 @@ bool setup_myself_reloadable(void) { *space++ = 0, proxypass = space; } - if(!proxyhost || !*proxyhost || !proxyport || !*proxyport) { - logger(DEBUG_ALWAYS, LOG_ERR, "Host and port argument expected for proxy!"); - return false; - } - proxyhost = xstrdup(proxyhost); proxyport = xstrdup(proxyport); @@ -532,6 +546,8 @@ bool setup_myself_reloadable(void) { free(proxy); } + bool choice; + if(get_config_bool(lookup_config(config_tree, "IndirectData"), &choice) && choice) { myself->options |= OPTION_INDIRECT; } @@ -555,6 +571,8 @@ bool setup_myself_reloadable(void) { get_config_bool(lookup_config(config_tree, "DirectOnly"), &directonly); get_config_bool(lookup_config(config_tree, "LocalDiscovery"), &localdiscovery); + char *rmode = NULL; + if(get_config_string(lookup_config(config_tree, "Mode"), &rmode)) { if(!strcasecmp(rmode, "router")) { routing_mode = RMODE_ROUTER; @@ -564,12 +582,15 @@ bool setup_myself_reloadable(void) { routing_mode = RMODE_HUB; } else { logger(DEBUG_ALWAYS, LOG_ERR, "Invalid routing mode!"); + free(rmode); return false; } free(rmode); } + char *fmode = NULL; + if(get_config_string(lookup_config(config_tree, "Forwarding"), &fmode)) { if(!strcasecmp(fmode, "off")) { forwarding_mode = FMODE_OFF; @@ -579,6 +600,7 @@ bool setup_myself_reloadable(void) { forwarding_mode = FMODE_KERNEL; } else { logger(DEBUG_ALWAYS, LOG_ERR, "Invalid forwarding mode!"); + free(fmode); return false; } @@ -602,6 +624,8 @@ bool setup_myself_reloadable(void) { get_config_bool(lookup_config(config_tree, "PriorityInheritance"), &priorityinheritance); get_config_bool(lookup_config(config_tree, "DecrementTTL"), &decrement_ttl); + char *bmode = NULL; + if(get_config_string(lookup_config(config_tree, "Broadcast"), &bmode)) { if(!strcasecmp(bmode, "no")) { broadcast_mode = BMODE_NONE; @@ -611,12 +635,21 @@ bool setup_myself_reloadable(void) { broadcast_mode = BMODE_DIRECT; } else { logger(DEBUG_ALWAYS, LOG_ERR, "Invalid broadcast mode!"); + free(bmode); return false; } free(bmode); } + /* Delete all broadcast subnets before re-adding them */ + + for splay_each(subnet_t, s, subnet_tree) { + if(!s->owner) { + splay_delete_node(subnet_tree, node); + } + } + const char *const DEFAULT_BROADCAST_SUBNETS[] = { "ff:ff:ff:ff:ff:ff", "255.255.255.255", "224.0.0.0/4", "ff00::/8" }; for(size_t i = 0; i < sizeof(DEFAULT_BROADCAST_SUBNETS) / sizeof(*DEFAULT_BROADCAST_SUBNETS); i++) { @@ -668,6 +701,8 @@ bool setup_myself_reloadable(void) { maxtimeout = 900; } + char *afname = NULL; + if(get_config_string(lookup_config(config_tree, "AddressFamily"), &afname)) { if(!strcasecmp(afname, "IPv4")) { addressfamily = AF_INET; @@ -677,6 +712,7 @@ bool setup_myself_reloadable(void) { addressfamily = AF_UNSPEC; } else { logger(DEBUG_ALWAYS, LOG_ERR, "Invalid address family!"); + free(afname); return false; } @@ -762,6 +798,7 @@ static bool add_listen_address(char *address, bool bindto) { if(listen_sockets >= MAXSOCKETS) { logger(DEBUG_ALWAYS, LOG_ERR, "Too many listening sockets"); + freeaddrinfo(ai); return false; } @@ -1330,7 +1367,7 @@ void close_network_connections(void) { if(myself && myself->connection) { subnet_update(myself, NULL, false); - connection_del(myself->connection); + free_connection(myself->connection); } for(int i = 0; i < listen_sockets; i++) {