Skip to content
Snippets Groups Projects
Commit e25f9c57 authored by David Vasek's avatar David Vasek Committed by Daniel Salzman
Browse files

server: strict server startup (exit if any port binding fails)

Use of NET_BIND_NONLOCAL (i.e. IP*_BINDANY or IP_FREEBIND) is still present
as a fallback when bind() returns EADDRNOTAVAIL.
parent 76faa30a
No related branches found
No related tags found
No related merge requests found
......@@ -507,10 +507,13 @@ static int configure_sockets(conf_t *conf, server_t *s)
iface_t *new_if = server_init_iface(&addr, size_udp, size_tcp,
tcp_reuseport);
if (new_if != NULL) {
memcpy(&newlist[real_nifs++], new_if, sizeof(*newlist));
free(new_if);
if (new_if == NULL) {
free(rundir);
return KNOT_ERROR;
}
memcpy(&newlist[real_nifs++], new_if, sizeof(*newlist));
free(new_if);
conf_val_next(&listen_val);
}
free(rundir);
......@@ -525,10 +528,12 @@ static int configure_sockets(conf_t *conf, server_t *s)
log_info("binding to XDP interface %s", addr_str);
iface_t *new_if = server_init_xdp_iface(&addr, &thread_id);
if (new_if != NULL) {
memcpy(&newlist[real_nifs++], new_if, sizeof(*newlist));
free(new_if);
if (new_if == NULL) {
return KNOT_ERROR;
}
memcpy(&newlist[real_nifs++], new_if, sizeof(*newlist));
free(new_if);
conf_val_next(&lisxdp_val);
}
assert(real_nifs <= nifs);
......@@ -930,7 +935,7 @@ int server_reload(server_t *server)
log_reconfigure(conf());
}
if (full || (flags & CONF_IO_FRLD_SRV)) {
server_reconfigure(conf(), server);
(void)server_reconfigure(conf(), server);
warn_server_reconfigure(conf(), server);
stats_reconfigure(conf(), server);
}
......@@ -1034,10 +1039,10 @@ static int reconfigure_timer_db(conf_t *conf, server_t *server)
return ret;
}
void server_reconfigure(conf_t *conf, server_t *server)
int server_reconfigure(conf_t *conf, server_t *server)
{
if (conf == NULL || server == NULL) {
return;
return KNOT_EINVAL;
}
int ret;
......@@ -1064,6 +1069,7 @@ void server_reconfigure(conf_t *conf, server_t *server)
if ((ret = configure_sockets(conf, server)) != KNOT_EOK) {
log_error("failed to configure server sockets (%s)",
knot_strerror(ret));
return ret;
}
}
......@@ -1084,6 +1090,8 @@ void server_reconfigure(conf_t *conf, server_t *server)
log_error("failed to reconfigure Timer DB (%s)",
knot_strerror(ret));
}
return KNOT_EOK;
}
void server_update_zones(conf_t *conf, server_t *server)
......
......@@ -160,8 +160,10 @@ void server_stop(server_t *server);
* \brief Server reconfiguration routine.
*
* Routine for dynamic server reconfiguration.
*
* \return Error code, KNOT_EOK if success.
*/
void server_reconfigure(conf_t *conf, server_t *server);
int server_reconfigure(conf_t *conf, server_t *server);
/*!
* \brief Reconfigure zone database.
......
......@@ -493,9 +493,17 @@ int main(int argc, char **argv)
return EXIT_FAILURE;
}
/* Reconfigure server interfaces.
/* Reconfigure server workers, interfaces, and databases.
* @note This MUST be done before we drop privileges. */
server_reconfigure(conf(), &server);
ret = server_reconfigure(conf(), &server);
if (ret != KNOT_EOK) {
log_fatal("failed to configure server");
server_wait(&server);
server_deinit(&server);
conf_free(conf());
log_close();
return EXIT_FAILURE;
}
/* Alter privileges. */
int uid, gid;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment