From: Vincent Bernat Date: Mon, 31 Dec 2012 17:56:02 +0000 (+0100) Subject: event: avoid socket leak if we cannot register netlink socket X-Git-Tag: 0.7.0~18 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=aa313f2a78c4ad8ebf8dd5e7d3e26f3af67da1c2;p=thirdparty%2Flldpd.git event: avoid socket leak if we cannot register netlink socket --- diff --git a/src/daemon/event.c b/src/daemon/event.c index b39f4a3e..89163e2e 100644 --- a/src/daemon/event.c +++ b/src/daemon/event.c @@ -633,7 +633,7 @@ levent_iface_recv(evutil_socket_t fd, short what, void *arg) } } -void +int levent_iface_subscribe(struct lldpd *cfg, int socket) { log_debug("event", "subscribe to interface changes from socket %d", @@ -644,15 +644,16 @@ levent_iface_subscribe(struct lldpd *cfg, int socket) if (cfg->g_iface_event == NULL) { log_warnx("event", "unable to allocate a new event for interface changes"); - return; + return -1; } if (event_add(cfg->g_iface_event, NULL) == -1) { log_warnx("event", "unable to schedule new interface changes event"); event_free(cfg->g_iface_event); cfg->g_iface_event = NULL; - return; + return -1; } + return 0; } static void diff --git a/src/daemon/interfaces-linux.c b/src/daemon/interfaces-linux.c index b0294d45..3a0bc30d 100644 --- a/src/daemon/interfaces-linux.c +++ b/src/daemon/interfaces-linux.c @@ -856,7 +856,8 @@ interfaces_update(struct lldpd *cfg) log_warnx("interfaces", "unable to subscribe to netlink notifications"); goto end; } - levent_iface_subscribe(cfg, s); + if (levent_iface_subscribe(cfg, s) == -1) + close(s); } end: diff --git a/src/daemon/lldpd.h b/src/daemon/lldpd.h index 7935ea0e..26e361a5 100644 --- a/src/daemon/lldpd.h +++ b/src/daemon/lldpd.h @@ -139,7 +139,7 @@ void levent_hardware_add_fd(struct lldpd_hardware *, int); void levent_hardware_release(struct lldpd_hardware *); void levent_ctl_notify(char *, int, struct lldpd_port *); void levent_send_now(struct lldpd *); -void levent_iface_subscribe(struct lldpd *, int); +int levent_iface_subscribe(struct lldpd *, int); void levent_schedule_pdu(struct lldpd_hardware *); /* lldp.c */