From 55bc97e626e0f31e04b190528b25c6e026942610 Mon Sep 17 00:00:00 2001 From: Ian Jackson Date: Sun, 5 Jan 2014 15:32:05 +0000 Subject: [PATCH] netlink: Avoid crash with clientless netlink In some pathological configurations, it can happen that a packet is received from the kernel by a netlink which has no clients (that is, where netlink_inst_reg has not been called). Don't crash when this happens; instead, print a log message including the source and destination addresses. Signed-off-by: Ian Jackson --- debian/changelog | 1 + netlink.c | 13 ++++++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 5de3542..12b009c 100644 --- a/debian/changelog +++ b/debian/changelog @@ -3,6 +3,7 @@ secnet (0.3.1~~unstable) unstable; urgency=low * Updates to release checklist in Makefile.in. * Fix formatting error in secnet.8 manpage. * Internal code rearrangements and improvements. + * Fix netlink SEGV on clientless netlinks (i.e. configuration error). -- diff --git a/netlink.c b/netlink.c index 54ad76f..6384c02 100644 --- a/netlink.c +++ b/netlink.c @@ -410,12 +410,23 @@ static bool_t netlink_check(struct netlink *st, struct buffer_if *buf, } /* Deliver a packet _to_ client; used after we have decided - * what to do with it. */ + * what to do with it (and just to check that the client has + * actually registered a delivery function with us). */ static void netlink_client_deliver(struct netlink *st, struct netlink_client *client, uint32_t source, uint32_t dest, struct buffer_if *buf) { + if (!client->deliver) { + string_t s,d; + s=ipaddr_to_string(source); + d=ipaddr_to_string(dest); + Message(M_ERR,"%s: dropping %s->%s, client not registered\n", + st->name,s,d); + free(s); free(d); + BUF_FREE(buf); + return; + } client->deliver(client->dst, buf); client->outcount++; } -- 2.30.2