diff options
| author | Renato Westphal <renato@opensourcerouting.org> | 2017-04-19 15:15:56 -0300 |
|---|---|---|
| committer | Renato Westphal <renato@opensourcerouting.org> | 2017-06-05 12:23:18 -0300 |
| commit | b3121cd7d14f28cad53d39d9fbf09b036d3e95c9 (patch) | |
| tree | 7c50b98430e82582c6d1c3e5be784f7d635cdc00 | |
| parent | e75f810c2f6d3322e981c3e50f7d87f181005461 (diff) | |
ldpd: fix segfault after failed initialization
When ldpd fails to start for some reason, like failing to create a pid
file, the child processes call their shutdown functions without being
completely initialized. This patch adds some protections to prevent a
segmentation fault on such circumstances.
Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
| -rw-r--r-- | ldpd/lde.c | 9 | ||||
| -rw-r--r-- | ldpd/ldpe.c | 11 |
2 files changed, 13 insertions, 7 deletions
diff --git a/ldpd/lde.c b/ldpd/lde.c index ed8274bec7..3dfcd8f885 100644 --- a/ldpd/lde.c +++ b/ldpd/lde.c @@ -216,8 +216,10 @@ static void lde_shutdown(void) { /* close pipes */ - msgbuf_clear(&iev_ldpe->ibuf.w); - close(iev_ldpe->ibuf.fd); + if (iev_ldpe) { + msgbuf_clear(&iev_ldpe->ibuf.w); + close(iev_ldpe->ibuf.fd); + } msgbuf_clear(&iev_main->ibuf.w); close(iev_main->ibuf.fd); msgbuf_clear(&iev_main_sync->ibuf.w); @@ -229,7 +231,8 @@ lde_shutdown(void) config_clear(ldeconf); - free(iev_ldpe); + if (iev_ldpe) + free(iev_ldpe); free(iev_main); free(iev_main_sync); diff --git a/ldpd/ldpe.c b/ldpd/ldpe.c index 1248d4f86e..bd0f9dbd6f 100644 --- a/ldpd/ldpe.c +++ b/ldpd/ldpe.c @@ -196,9 +196,11 @@ ldpe_shutdown(void) struct adj *adj; /* close pipes */ - msgbuf_write(&iev_lde->ibuf.w); - msgbuf_clear(&iev_lde->ibuf.w); - close(iev_lde->ibuf.fd); + if (iev_lde) { + msgbuf_write(&iev_lde->ibuf.w); + msgbuf_clear(&iev_lde->ibuf.w); + close(iev_lde->ibuf.fd); + } msgbuf_write(&iev_main->ibuf.w); msgbuf_clear(&iev_main->ibuf.w); close(iev_main->ibuf.fd); @@ -226,7 +228,8 @@ ldpe_shutdown(void) adj_del(adj, S_SHUTDOWN); /* clean up */ - free(iev_lde); + if (iev_lde) + free(iev_lde); free(iev_main); free(iev_main_sync); free(pkt_ptr); |
