chiark / gitweb /
netlink: Avoid crash with clientless netlink
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Sun, 5 Jan 2014 15:32:05 +0000 (15:32 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Thu, 24 Apr 2014 00:32:53 +0000 (01:32 +0100)
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 <ijackson@chiark.greenend.org.uk>
debian/changelog
netlink.c

index 5de35429538c90e7ed9d436e6acdd49a975b9159..12b009cf6a732111e7610826cce4326935b5b22c 100644 (file)
@@ -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).
 
  --
 
index 54ad76fb908fa6d7383bb96422cb2fcf84d797a2..6384c02220720721d9f8a123e83d976a0e21c9ac 100644 (file)
--- 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++;
 }