summaryrefslogtreecommitdiffstats
path: root/usr.sbin/dvmrpd
diff options
context:
space:
mode:
authorrenato <renato@openbsd.org>2016-09-02 15:33:27 +0000
committerrenato <renato@openbsd.org>2016-09-02 15:33:27 +0000
commit132738f6d5fdc5b17d74f293389c069fdbe98c7b (patch)
tree08239f259f5ca41ff7f151a142dade781a461a37 /usr.sbin/dvmrpd
parentWording improvment from jmc@ long time ago. (diff)
downloadwireguard-openbsd-132738f6d5fdc5b17d74f293389c069fdbe98c7b.tar.xz
wireguard-openbsd-132738f6d5fdc5b17d74f293389c069fdbe98c7b.zip
Don't fatal if the imsg pipe is closed, this is often triggered in the
parent and hides the real cause of the termination. Pulled from ospfd. Original author: claudio@ ok rzalamena@ benno@ claudio@
Diffstat (limited to 'usr.sbin/dvmrpd')
-rw-r--r--usr.sbin/dvmrpd/dvmrpd.c25
-rw-r--r--usr.sbin/dvmrpd/dvmrpe.c25
-rw-r--r--usr.sbin/dvmrpd/rde.c14
3 files changed, 48 insertions, 16 deletions
diff --git a/usr.sbin/dvmrpd/dvmrpd.c b/usr.sbin/dvmrpd/dvmrpd.c
index 2c173001453..5afd4eeb2a1 100644
--- a/usr.sbin/dvmrpd/dvmrpd.c
+++ b/usr.sbin/dvmrpd/dvmrpd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dvmrpd.c,v 1.21 2016/02/02 17:51:11 sthen Exp $ */
+/* $OpenBSD: dvmrpd.c,v 1.22 2016/09/02 15:33:27 renato Exp $ */
/*
* Copyright (c) 2005 Claudio Jeker <claudio@openbsd.org>
@@ -350,13 +350,13 @@ main_dispatch_dvmrpe(int fd, short event, void *bula)
struct imsgbuf *ibuf = &iev->ibuf;
struct imsg imsg;
ssize_t n;
- int verbose;
+ int shut = 0, verbose;
if (event & EV_READ) {
if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN)
fatal("imsg_read error");
if (n == 0) /* connection closed */
- fatalx("pipe closed");
+ shut = 1;
}
if (event & EV_WRITE) {
if (msgbuf_write(&ibuf->w) <= 0 && errno != EAGAIN)
@@ -393,7 +393,13 @@ main_dispatch_dvmrpe(int fd, short event, void *bula)
}
imsg_free(&imsg);
}
- imsg_event_add(iev);
+ if (!shut)
+ imsg_event_add(iev);
+ else {
+ /* this pipe is dead, so remove the event handler */
+ event_del(&iev->ev);
+ event_loopexit(NULL);
+ }
}
void
@@ -404,12 +410,13 @@ main_dispatch_rde(int fd, short event, void *bula)
struct imsgbuf *ibuf = &iev->ibuf;
struct imsg imsg;
ssize_t n;
+ int shut = 0;
if (event & EV_READ) {
if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN)
fatal("imsg_read error");
if (n == 0) /* connection closed */
- fatalx("pipe closed");
+ shut = 1;
}
if (event & EV_WRITE) {
if (msgbuf_write(&ibuf->w) <= 0 && errno != EAGAIN)
@@ -447,7 +454,13 @@ main_dispatch_rde(int fd, short event, void *bula)
}
imsg_free(&imsg);
}
- imsg_event_add(iev);
+ if (!shut)
+ imsg_event_add(iev);
+ else {
+ /* this pipe is dead, so remove the event handler */
+ event_del(&iev->ev);
+ event_loopexit(NULL);
+ }
}
void
diff --git a/usr.sbin/dvmrpd/dvmrpe.c b/usr.sbin/dvmrpd/dvmrpe.c
index 073fd993f86..0ee578e65b2 100644
--- a/usr.sbin/dvmrpd/dvmrpe.c
+++ b/usr.sbin/dvmrpd/dvmrpe.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: dvmrpe.c,v 1.15 2015/12/05 13:11:00 claudio Exp $ */
+/* $OpenBSD: dvmrpe.c,v 1.16 2016/09/02 15:33:27 renato Exp $ */
/*
* Copyright (c) 2005 Claudio Jeker <claudio@openbsd.org>
@@ -240,13 +240,13 @@ dvmrpe_dispatch_main(int fd, short event, void *bula)
struct kif *kif;
struct iface *iface;
ssize_t n;
- int link_ok;
+ int shut = 0, link_ok;
if (event & EV_READ) {
if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN)
fatal("imsg_read error");
if (n == 0) /* connection closed */
- fatalx("pipe closed");
+ shut = 1;
}
if (event & EV_WRITE) {
if (msgbuf_write(&ibuf->w) <= 0 && errno != EAGAIN)
@@ -292,7 +292,13 @@ dvmrpe_dispatch_main(int fd, short event, void *bula)
}
imsg_free(&imsg);
}
- imsg_event_add(iev);
+ if (!shut)
+ imsg_event_add(iev);
+ else {
+ /* this pipe is dead, so remove the event handler */
+ event_del(&iev->ev);
+ event_loopexit(NULL);
+ }
}
void
@@ -306,12 +312,13 @@ dvmrpe_dispatch_rde(int fd, short event, void *bula)
struct iface *iface;
struct route_report *rr;
ssize_t n;
+ int shut = 0;
if (event & EV_READ) {
if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN)
fatal("imsg_read error");
if (n == 0) /* connection closed */
- fatalx("pipe closed");
+ shut = 1;
}
if (event & EV_WRITE) {
if (msgbuf_write(&ibuf->w) <= 0 && errno != EAGAIN)
@@ -438,7 +445,13 @@ dvmrpe_dispatch_rde(int fd, short event, void *bula)
}
imsg_free(&imsg);
}
- imsg_event_add(iev);
+ if (!shut)
+ imsg_event_add(iev);
+ else {
+ /* this pipe is dead, so remove the event handler */
+ event_del(&iev->ev);
+ event_loopexit(NULL);
+ }
}
void
diff --git a/usr.sbin/dvmrpd/rde.c b/usr.sbin/dvmrpd/rde.c
index 6f65e96f034..609eb2b4374 100644
--- a/usr.sbin/dvmrpd/rde.c
+++ b/usr.sbin/dvmrpd/rde.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: rde.c,v 1.25 2015/12/05 13:11:00 claudio Exp $ */
+/* $OpenBSD: rde.c,v 1.26 2016/09/02 15:33:27 renato Exp $ */
/*
* Copyright (c) 2004, 2005 Claudio Jeker <claudio@openbsd.org>
@@ -198,7 +198,7 @@ rde_dispatch_imsg(int fd, short event, void *bula)
struct imsg imsg;
struct route_report rr;
struct nbr_msg nm;
- int i, connected = 0, verbose;
+ int i, connected = 0, shut = 0, verbose;
ssize_t n;
struct iface *iface;
@@ -206,7 +206,7 @@ rde_dispatch_imsg(int fd, short event, void *bula)
if ((n = imsg_read(ibuf)) == -1 && errno != EAGAIN)
fatal("imsg_read error");
if (n == 0) /* connection closed */
- fatalx("pipe closed");
+ shut = 1;
}
if (event & EV_WRITE) {
if (msgbuf_write(&ibuf->w) <= 0 && errno != EAGAIN)
@@ -325,7 +325,13 @@ rde_dispatch_imsg(int fd, short event, void *bula)
}
imsg_free(&imsg);
}
- imsg_event_add(iev);
+ if (!shut)
+ imsg_event_add(iev);
+ else {
+ /* this pipe is dead, so remove the event handler */
+ event_del(&iev->ev);
+ event_loopexit(NULL);
+ }
}
int