summaryrefslogtreecommitdiff
path: root/sysdep
diff options
context:
space:
mode:
authorJan Moskyto Matejka <mq@ucw.cz>2016-09-29 12:00:53 +0200
committerJan Moskyto Matejka <mq@ucw.cz>2016-09-29 13:21:16 +0200
commitccd2a3eda24230df550e9880f4340fc6341c8f52 (patch)
treeab5d5e0944c68b7c30ae34daade8947dddee322c /sysdep
parent79e2293ab2abbd92bb3326a95759a4ca32d9af81 (diff)
Kernel socket missing err_hook fix
Thanks to Tim Weippert for bugreport.
Diffstat (limited to 'sysdep')
-rw-r--r--sysdep/bsd/krt-sock.c7
-rw-r--r--sysdep/linux/netlink.c7
-rw-r--r--sysdep/unix/io.c2
3 files changed, 15 insertions, 1 deletions
diff --git a/sysdep/bsd/krt-sock.c b/sysdep/bsd/krt-sock.c
index 6ff3b2b7..f2ae81c3 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 1490213e..79dd1405 100644
--- a/sysdep/linux/netlink.c
+++ b/sysdep/linux/netlink.c
@@ -1526,6 +1526,12 @@ nl_async_hook(sock *sk, int size UNUSED)
}
static void
+nl_async_err_hook(sock *sk, int e UNUSED)
+{
+ nl_async_hook(sk, 0);
+}
+
+static void
nl_open_async(void)
{
sock *sk;
@@ -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 120eb906..3ceadd98 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");