mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-10 21:23:58 +01:00
Handle config options for AF_UNIX hidden services rendservice.c
This commit is contained in:
parent
03d6a31716
commit
6564291601
@ -308,10 +308,26 @@ rend_add_service(rend_service_t *service)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** Return a new rend_service_port_config_t with its path set to
|
||||||
|
* <b>socket_path</b> or empty if <b>socket_path</b> is NULL */
|
||||||
|
static rend_service_port_config_t *
|
||||||
|
rend_service_port_config_new(const char *socket_path)
|
||||||
|
{
|
||||||
|
if (!socket_path)
|
||||||
|
return tor_malloc_zero(sizeof(rend_service_port_config_t));
|
||||||
|
|
||||||
|
const size_t pathlen = strlen(socket_path) + 1;
|
||||||
|
rend_service_port_config_t *conf =
|
||||||
|
tor_malloc_zero(sizeof(rend_service_port_config_t) + pathlen);
|
||||||
|
memcpy(conf->unix_addr, socket_path, pathlen);
|
||||||
|
conf->is_unix_addr = 1;
|
||||||
|
return conf;
|
||||||
|
}
|
||||||
|
|
||||||
/** Parses a real-port to virtual-port mapping and returns a new
|
/** Parses a real-port to virtual-port mapping and returns a new
|
||||||
* rend_service_port_config_t.
|
* rend_service_port_config_t.
|
||||||
*
|
*
|
||||||
* The format is: VirtualPort (IP|RealPort|IP:RealPort)?
|
* The format is: VirtualPort (IP|RealPort|IP:RealPort|'socket':path)?
|
||||||
*
|
*
|
||||||
* IP defaults to 127.0.0.1; RealPort defaults to VirtualPort.
|
* IP defaults to 127.0.0.1; RealPort defaults to VirtualPort.
|
||||||
*/
|
*/
|
||||||
@ -325,6 +341,9 @@ parse_port_config(const char *string)
|
|||||||
tor_addr_t addr;
|
tor_addr_t addr;
|
||||||
const char *addrport;
|
const char *addrport;
|
||||||
rend_service_port_config_t *result = NULL;
|
rend_service_port_config_t *result = NULL;
|
||||||
|
const char *socket_prefix = "socket:";
|
||||||
|
unsigned int is_unix_addr = 0;
|
||||||
|
char *socket_path = NULL;
|
||||||
|
|
||||||
sl = smartlist_new();
|
sl = smartlist_new();
|
||||||
smartlist_split_string(sl, string, " ",
|
smartlist_split_string(sl, string, " ",
|
||||||
@ -347,7 +366,26 @@ parse_port_config(const char *string)
|
|||||||
tor_addr_from_ipv4h(&addr, 0x7F000001u); /* 127.0.0.1 */
|
tor_addr_from_ipv4h(&addr, 0x7F000001u); /* 127.0.0.1 */
|
||||||
} else {
|
} else {
|
||||||
addrport = smartlist_get(sl,1);
|
addrport = smartlist_get(sl,1);
|
||||||
if (strchr(addrport, ':') || strchr(addrport, '.')) {
|
/* If it starts with socket:, try to parse it as a socket path */
|
||||||
|
if (!strcmpstart(addrport, socket_prefix)) {
|
||||||
|
if (strlen(addrport + strlen(socket_prefix)) > 0) {
|
||||||
|
#ifdef HAVE_SYS_UN_H
|
||||||
|
is_unix_addr = 1;
|
||||||
|
socket_path = tor_strdup(addrport + strlen(socket_prefix));
|
||||||
|
#else
|
||||||
|
log_warn(LD_CONFIG,
|
||||||
|
"Hidden service port configuration %s is for an AF_UNIX "
|
||||||
|
"socket, but we have no support available on this platform",
|
||||||
|
escaped(addrport));
|
||||||
|
goto err;
|
||||||
|
#endif /* defined(HAVE_SYS_UN_H) */
|
||||||
|
} else {
|
||||||
|
log_warn(LD_CONFIG,
|
||||||
|
"Empty socket path in hidden service port configuration.");
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
} else if (strchr(addrport, ':') || strchr(addrport, '.')) {
|
||||||
|
/* else try it as an IP:port pair if it has a : or . in it */
|
||||||
if (tor_addr_port_lookup(addrport, &addr, &p)<0) {
|
if (tor_addr_port_lookup(addrport, &addr, &p)<0) {
|
||||||
log_warn(LD_CONFIG,"Unparseable address in hidden service port "
|
log_warn(LD_CONFIG,"Unparseable address in hidden service port "
|
||||||
"configuration.");
|
"configuration.");
|
||||||
@ -366,15 +404,21 @@ parse_port_config(const char *string)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
result = tor_malloc(sizeof(rend_service_port_config_t));
|
/* Allow room for unix_addr */
|
||||||
|
result = rend_service_port_config_new(socket_path);
|
||||||
result->virtual_port = virtport;
|
result->virtual_port = virtport;
|
||||||
/* TODO actually support AF_UNIX here */
|
result->is_unix_addr = is_unix_addr;
|
||||||
result->is_unix_addr = 0;
|
if (!is_unix_addr) {
|
||||||
result->real_port = realport;
|
result->real_port = realport;
|
||||||
tor_addr_copy(&result->real_addr, &addr);
|
tor_addr_copy(&result->real_addr, &addr);
|
||||||
|
result->unix_addr[0] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
err:
|
err:
|
||||||
SMARTLIST_FOREACH(sl, char *, c, tor_free(c));
|
SMARTLIST_FOREACH(sl, char *, c, tor_free(c));
|
||||||
smartlist_free(sl);
|
smartlist_free(sl);
|
||||||
|
if (socket_path) tor_free(socket_path);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user