summaryrefslogtreecommitdiffstats
path: root/ldpd/control.c
diff options
context:
space:
mode:
authorRenato Westphal <renato@opensourcerouting.org>2017-04-19 03:03:35 +0200
committerRenato Westphal <renato@opensourcerouting.org>2017-04-26 15:36:30 +0200
commit274f5abf24fd5c9c79dce4102c3dfa583a791559 (patch)
tree7c67de88798a29e37beea6424ca2b73c5aa8f124 /ldpd/control.c
parentldpd: remove two unused imsg types (diff)
downloadfrr-274f5abf24fd5c9c79dce4102c3dfa583a791559.tar.xz
frr-274f5abf24fd5c9c79dce4102c3dfa583a791559.zip
ldpd: simplify initialization of the child processes
In order to have separate ASLR/cookies per process, ldpd calls exec() in the child processes after fork() (this is also known as the fork+exec model). This is an important security feature but it makes the initialization of the child processes a bit more complicated as they're not a copy of the parent anymore, so all parameters given via command line are lost. To solve this problem, we were creating an argv array by hand with all necessary parameters and providing it to the exec() syscall. This works but it's a very ugly solution. This patch introduces a different approach to solve the problem: send an IMSG_INIT message to the child processes with all parameters they need in order to initialize properly. This makes adding additional initialization parameters much more convenient and less error prone. Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
Diffstat (limited to 'ldpd/control.c')
-rw-r--r--ldpd/control.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/ldpd/control.c b/ldpd/control.c
index 5c530e1b7..d40e0342c 100644
--- a/ldpd/control.c
+++ b/ldpd/control.c
@@ -37,7 +37,7 @@ struct ctl_conns ctl_conns;
static int control_fd;
int
-control_init(void)
+control_init(char *path)
{
struct sockaddr_un s_un;
int fd;
@@ -51,28 +51,28 @@ control_init(void)
memset(&s_un, 0, sizeof(s_un));
s_un.sun_family = AF_UNIX;
- strlcpy(s_un.sun_path, ctl_sock_path, sizeof(s_un.sun_path));
+ strlcpy(s_un.sun_path, path, sizeof(s_un.sun_path));
- if (unlink(ctl_sock_path) == -1)
+ if (unlink(path) == -1)
if (errno != ENOENT) {
- log_warn("%s: unlink %s", __func__, ctl_sock_path);
+ log_warn("%s: unlink %s", __func__, path);
close(fd);
return (-1);
}
old_umask = umask(S_IXUSR|S_IXGRP|S_IWOTH|S_IROTH|S_IXOTH);
if (bind(fd, (struct sockaddr *)&s_un, sizeof(s_un)) == -1) {
- log_warn("%s: bind: %s", __func__, ctl_sock_path);
+ log_warn("%s: bind: %s", __func__, path);
close(fd);
umask(old_umask);
return (-1);
}
umask(old_umask);
- if (chmod(ctl_sock_path, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) == -1) {
+ if (chmod(path, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP) == -1) {
log_warn("%s: chmod", __func__);
close(fd);
- (void)unlink(ctl_sock_path);
+ (void)unlink(path);
return (-1);
}
@@ -93,11 +93,11 @@ control_listen(void)
}
void
-control_cleanup(void)
+control_cleanup(char *path)
{
accept_del(control_fd);
close(control_fd);
- unlink(ctl_sock_path);
+ unlink(path);
}
/* ARGSUSED */