summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRenato Westphal <renato@opensourcerouting.org>2017-04-19 15:15:56 -0300
committerRenato Westphal <renato@opensourcerouting.org>2017-06-05 12:23:18 -0300
commitb3121cd7d14f28cad53d39d9fbf09b036d3e95c9 (patch)
tree7c50b98430e82582c6d1c3e5be784f7d635cdc00
parente75f810c2f6d3322e981c3e50f7d87f181005461 (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.c9
-rw-r--r--ldpd/ldpe.c11
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);