From ccd2a3eda24230df550e9880f4340fc6341c8f52 Mon Sep 17 00:00:00 2001 From: Jan Moskyto Matejka Date: Thu, 29 Sep 2016 12:00:53 +0200 Subject: [PATCH] Kernel socket missing err_hook fix Thanks to Tim Weippert for bugreport. --- sysdep/bsd/krt-sock.c | 7 +++++++ sysdep/linux/netlink.c | 7 +++++++ sysdep/unix/io.c | 2 +- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/sysdep/bsd/krt-sock.c b/sysdep/bsd/krt-sock.c index 6ff3b2b73..f2ae81c33 100644 --- a/sysdep/bsd/krt-sock.c +++ b/sysdep/bsd/krt-sock.c @@ -911,6 +911,12 @@ krt_sock_hook(sock *sk, int size UNUSED) return 0; } +static void +krt_sock_err_hook(sock *sk, int e UNUSED) +{ + krt_sock_hook(sk, 0); +} + static sock * krt_sock_open(pool *pool, void *data, int table_id) { @@ -932,6 +938,7 @@ krt_sock_open(pool *pool, void *data, int table_id) sk = sk_new(pool); sk->type = SK_MAGIC; sk->rx_hook = krt_sock_hook; + sk->err_hook = krt_sock_err_hook; sk->fd = fd; sk->data = data; diff --git a/sysdep/linux/netlink.c b/sysdep/linux/netlink.c index 1490213e0..79dd14050 100644 --- a/sysdep/linux/netlink.c +++ b/sysdep/linux/netlink.c @@ -1525,6 +1525,12 @@ nl_async_hook(sock *sk, int size UNUSED) return 1; } +static void +nl_async_err_hook(sock *sk, int e UNUSED) +{ + nl_async_hook(sk, 0); +} + static void nl_open_async(void) { @@ -1563,6 +1569,7 @@ nl_open_async(void) sk = nl_async_sk = sk_new(krt_pool); sk->type = SK_MAGIC; sk->rx_hook = nl_async_hook; + sk->err_hook = nl_async_err_hook; sk->fd = fd; if (sk_open(sk) < 0) bug("Netlink: sk_open failed"); diff --git a/sysdep/unix/io.c b/sysdep/unix/io.c index 120eb9069..3ceadd982 100644 --- a/sysdep/unix/io.c +++ b/sysdep/unix/io.c @@ -1857,7 +1857,7 @@ void sk_err(sock *s, int revents) { int se = 0, sse = sizeof(se); - if (revents & POLLERR) + if ((s->type != SK_MAGIC) && (revents & POLLERR)) if (getsockopt(s->fd, SOL_SOCKET, SO_ERROR, &se, &sse) < 0) { log(L_ERR "IO: Socket error: SO_ERROR: %m"); -- 2.39.2