Skip to content

Commit

Permalink
lib: mgmtd: fix too early daemon detach of mgmtd
Browse files Browse the repository at this point in the history
Correct FRR startup counts on a daemon's vty socket to be open when the
parent process exits. The parent process waits for `frr_check_detach()`
to be called by the child before exiting. The problem is when the
`FRR_MANUAL_VTY_START` flag is set the vty socket was not opened but
`frr_check_detach()` was called anyway.

Instead add a bool option for `frr_check_detach()` to be called when the
socket is opened with `frr_vty_serv_start()`, and do so when "manually"
calling said function (i.e., when FRR_MANUAL_VTY_START is set).

The `FRR_MANUAL_VTY_START` flag is only set by mgmtd. The reason we
wait to open the vty socket is so that mgmtd can parse the various
daemon specific config files it has taken over, after the event loop has
started, but before we receive any possible new config from `vtysh`.

fixes #16362

Signed-off-by: Christian Hopps <[email protected]>
(cherry picked from commit be9a6fc)
  • Loading branch information
choppsv1 authored and mergify[bot] committed Jul 24, 2024
1 parent e612bc5 commit 3284a73
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 15 deletions.
30 changes: 17 additions & 13 deletions lib/libfrr.c
Original file line number Diff line number Diff line change
Expand Up @@ -1035,7 +1035,17 @@ void frr_config_fork(void)
zlog_tls_buffer_init();
}

void frr_vty_serv_start(void)
static void frr_check_detach(void)
{
if (nodetach_term || nodetach_daemon)
return;

if (daemon_ctl_sock != -1)
close(daemon_ctl_sock);
daemon_ctl_sock = -1;
}

void frr_vty_serv_start(bool check_detach)
{
/* allow explicit override of vty_path in the future
* (not currently set anywhere) */
Expand All @@ -1058,6 +1068,9 @@ void frr_vty_serv_start(void)
}

vty_serv_start(di->vty_addr, di->vty_port, di->vty_path);

if (check_detach)
frr_check_detach();
}

void frr_vty_serv_stop(void)
Expand All @@ -1068,16 +1081,6 @@ void frr_vty_serv_stop(void)
unlink(di->vty_path);
}

static void frr_check_detach(void)
{
if (nodetach_term || nodetach_daemon)
return;

if (daemon_ctl_sock != -1)
close(daemon_ctl_sock);
daemon_ctl_sock = -1;
}

static void frr_terminal_close(int isexit)
{
int nullfd;
Expand Down Expand Up @@ -1163,7 +1166,7 @@ void frr_run(struct event_loop *master)
char instanceinfo[64] = "";

if (!(di->flags & FRR_MANUAL_VTY_START))
frr_vty_serv_start();
frr_vty_serv_start(false);

if (di->instance)
snprintf(instanceinfo, sizeof(instanceinfo), "instance %u ",
Expand Down Expand Up @@ -1201,7 +1204,8 @@ void frr_run(struct event_loop *master)
close(nullfd);
}

frr_check_detach();
if (!(di->flags & FRR_MANUAL_VTY_START))
frr_check_detach();
}

/* end fixed stderr startup logging */
Expand Down
2 changes: 1 addition & 1 deletion lib/libfrr.h
Original file line number Diff line number Diff line change
Expand Up @@ -200,7 +200,7 @@ extern void frr_config_fork(void);

extern void frr_run(struct event_loop *master);
extern void frr_detach(void);
extern void frr_vty_serv_start(void);
extern void frr_vty_serv_start(bool check_detach);
extern void frr_vty_serv_stop(void);

extern bool frr_zclient_addr(struct sockaddr_storage *sa, socklen_t *sa_len,
Expand Down
2 changes: 1 addition & 1 deletion lib/vty.c
Original file line number Diff line number Diff line change
Expand Up @@ -3486,7 +3486,7 @@ static void vty_mgmt_server_connected(struct mgmt_fe_client *client,

/* Start or stop listening for vty connections */
if (connected)
frr_vty_serv_start();
frr_vty_serv_start(true);
else
frr_vty_serv_stop();
}
Expand Down

0 comments on commit 3284a73

Please sign in to comment.