From 4c438cf0992ff20b02e2f5ef0c656fcb18fac02b Mon Sep 17 00:00:00 2001 From: Martin Willi Date: Wed, 9 Jul 2014 15:53:14 +0200 Subject: kernel-netlink: Avoid casting the NLMSG_DATA() return value There is really no need for doing so, and it makes the code just unreadable. --- src/libhydra/plugins/kernel_netlink/kernel_netlink_shared.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/libhydra/plugins/kernel_netlink/kernel_netlink_shared.c') diff --git a/src/libhydra/plugins/kernel_netlink/kernel_netlink_shared.c b/src/libhydra/plugins/kernel_netlink/kernel_netlink_shared.c index fd00c23af..30d5aaabd 100644 --- a/src/libhydra/plugins/kernel_netlink/kernel_netlink_shared.c +++ b/src/libhydra/plugins/kernel_netlink/kernel_netlink_shared.c @@ -197,7 +197,7 @@ METHOD(netlink_socket_t, netlink_send_ack, status_t, { case NLMSG_ERROR: { - struct nlmsgerr* err = (struct nlmsgerr*)NLMSG_DATA(hdr); + struct nlmsgerr* err = NLMSG_DATA(hdr); if (err->error) { -- cgit v1.2.3 From de11d34abb49a6ca64b98f586821d98312162a64 Mon Sep 17 00:00:00 2001 From: Martin Willi Date: Wed, 9 Jul 2014 16:04:16 +0200 Subject: kernel-netlink: Use recv() instead of recvfrom() As we are not interested in the returned address, there is really no need in passing that argument. --- .../plugins/kernel_netlink/kernel_netlink_shared.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) (limited to 'src/libhydra/plugins/kernel_netlink/kernel_netlink_shared.c') diff --git a/src/libhydra/plugins/kernel_netlink/kernel_netlink_shared.c b/src/libhydra/plugins/kernel_netlink/kernel_netlink_shared.c index 30d5aaabd..427499108 100644 --- a/src/libhydra/plugins/kernel_netlink/kernel_netlink_shared.c +++ b/src/libhydra/plugins/kernel_netlink/kernel_netlink_shared.c @@ -65,7 +65,7 @@ METHOD(netlink_socket_t, netlink_send, status_t, private_netlink_socket_t *this, struct nlmsghdr *in, struct nlmsghdr **out, size_t *out_len) { - int len, addr_len; + int len; struct sockaddr_nl addr; chunk_t result = chunk_empty, tmp; struct nlmsghdr *msg, peek; @@ -113,14 +113,7 @@ METHOD(netlink_socket_t, netlink_send, status_t, tmp.ptr = buf; msg = (struct nlmsghdr*)tmp.ptr; - memset(&addr, 0, sizeof(addr)); - addr.nl_family = AF_NETLINK; - addr.nl_pid = getpid(); - addr.nl_groups = 0; - addr_len = sizeof(addr); - - len = recvfrom(this->socket, tmp.ptr, tmp.len, 0, - (struct sockaddr*)&addr, &addr_len); + len = recv(this->socket, tmp.ptr, tmp.len, 0); if (len < 0) { @@ -161,8 +154,7 @@ METHOD(netlink_socket_t, netlink_send, status_t, /* NLM_F_MULTI flag does not seem to be set correctly, we use sequence * numbers to detect multi header messages */ - len = recvfrom(this->socket, &peek, sizeof(peek), MSG_PEEK | MSG_DONTWAIT, - (struct sockaddr*)&addr, &addr_len); + len = recv(this->socket, &peek, sizeof(peek), MSG_PEEK | MSG_DONTWAIT); if (len == sizeof(peek) && peek.nlmsg_seq == this->seq) { -- cgit v1.2.3 From 4c3aca273fdf14f12072f3e9fd87ef75782e55fb Mon Sep 17 00:00:00 2001 From: Martin Willi Date: Wed, 9 Jul 2014 16:16:16 +0200 Subject: kernel-netlink: Clean up response buffer management --- .../plugins/kernel_netlink/kernel_netlink_shared.c | 40 +++++++++------------- 1 file changed, 16 insertions(+), 24 deletions(-) (limited to 'src/libhydra/plugins/kernel_netlink/kernel_netlink_shared.c') diff --git a/src/libhydra/plugins/kernel_netlink/kernel_netlink_shared.c b/src/libhydra/plugins/kernel_netlink/kernel_netlink_shared.c index 427499108..12df7c5ad 100644 --- a/src/libhydra/plugins/kernel_netlink/kernel_netlink_shared.c +++ b/src/libhydra/plugins/kernel_netlink/kernel_netlink_shared.c @@ -65,10 +65,13 @@ METHOD(netlink_socket_t, netlink_send, status_t, private_netlink_socket_t *this, struct nlmsghdr *in, struct nlmsghdr **out, size_t *out_len) { - int len; + union { + struct nlmsghdr hdr; + u_char bytes[4096]; + } response; struct sockaddr_nl addr; - chunk_t result = chunk_empty, tmp; - struct nlmsghdr *msg, peek; + chunk_t result = chunk_empty; + int len; this->mutex->lock(this->mutex); @@ -82,11 +85,9 @@ METHOD(netlink_socket_t, netlink_send, status_t, if (this->protocol == NETLINK_XFRM) { - chunk_t in_chunk = { (u_char*)in, in->nlmsg_len }; - - DBG3(DBG_KNL, "sending %N: %B", xfrm_msg_names, in->nlmsg_type, &in_chunk); + DBG3(DBG_KNL, "sending %N: %b", + xfrm_msg_names, in->nlmsg_type, in, in->nlmsg_len); } - while (TRUE) { len = sendto(this->socket, in, in->nlmsg_len, 0, @@ -108,13 +109,7 @@ METHOD(netlink_socket_t, netlink_send, status_t, while (TRUE) { - char buf[4096]; - tmp.len = sizeof(buf); - tmp.ptr = buf; - msg = (struct nlmsghdr*)tmp.ptr; - - len = recv(this->socket, tmp.ptr, tmp.len, 0); - + len = recv(this->socket, &response, sizeof(response), 0); if (len < 0) { if (errno == EINTR) @@ -128,17 +123,17 @@ METHOD(netlink_socket_t, netlink_send, status_t, free(result.ptr); return FAILED; } - if (!NLMSG_OK(msg, len)) + if (!NLMSG_OK(&response.hdr, len)) { DBG1(DBG_KNL, "received corrupted netlink message"); this->mutex->unlock(this->mutex); free(result.ptr); return FAILED; } - if (msg->nlmsg_seq != this->seq) + if (response.hdr.nlmsg_seq != this->seq) { DBG1(DBG_KNL, "received invalid netlink sequence number"); - if (msg->nlmsg_seq < this->seq) + if (response.hdr.nlmsg_seq < this->seq) { continue; } @@ -147,16 +142,13 @@ METHOD(netlink_socket_t, netlink_send, status_t, return FAILED; } - tmp.len = len; - result.ptr = realloc(result.ptr, result.len + tmp.len); - memcpy(result.ptr + result.len, tmp.ptr, tmp.len); - result.len += tmp.len; + result = chunk_cat("mc", result, chunk_create(response.bytes, len)); /* NLM_F_MULTI flag does not seem to be set correctly, we use sequence * numbers to detect multi header messages */ - len = recv(this->socket, &peek, sizeof(peek), MSG_PEEK | MSG_DONTWAIT); - - if (len == sizeof(peek) && peek.nlmsg_seq == this->seq) + len = recv(this->socket, &response.hdr, sizeof(response.hdr), + MSG_PEEK | MSG_DONTWAIT); + if (len == sizeof(response.hdr) && response.hdr.nlmsg_seq == this->seq) { /* seems to be multipart */ continue; -- cgit v1.2.3 From 5957e76b381179d45ba1094ce5085db42cbad5ac Mon Sep 17 00:00:00 2001 From: Martin Willi Date: Wed, 9 Jul 2014 16:47:06 +0200 Subject: kernel-netlink: Clean up socket initialization, handle 0 as valid socket fd --- .../plugins/kernel_netlink/kernel_netlink_shared.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) (limited to 'src/libhydra/plugins/kernel_netlink/kernel_netlink_shared.c') diff --git a/src/libhydra/plugins/kernel_netlink/kernel_netlink_shared.c b/src/libhydra/plugins/kernel_netlink/kernel_netlink_shared.c index 12df7c5ad..74466e291 100644 --- a/src/libhydra/plugins/kernel_netlink/kernel_netlink_shared.c +++ b/src/libhydra/plugins/kernel_netlink/kernel_netlink_shared.c @@ -219,7 +219,7 @@ METHOD(netlink_socket_t, netlink_send_ack, status_t, METHOD(netlink_socket_t, destroy, void, private_netlink_socket_t *this) { - if (this->socket > 0) + if (this->socket != -1) { close(this->socket); } @@ -233,7 +233,9 @@ METHOD(netlink_socket_t, destroy, void, netlink_socket_t *netlink_socket_create(int protocol) { private_netlink_socket_t *this; - struct sockaddr_nl addr; + struct sockaddr_nl addr = { + .nl_family = AF_NETLINK, + }; INIT(this, .public = { @@ -243,21 +245,16 @@ netlink_socket_t *netlink_socket_create(int protocol) }, .seq = 200, .mutex = mutex_create(MUTEX_TYPE_DEFAULT), + .socket = socket(AF_NETLINK, SOCK_RAW, protocol), .protocol = protocol, ); - memset(&addr, 0, sizeof(addr)); - addr.nl_family = AF_NETLINK; - - this->socket = socket(AF_NETLINK, SOCK_RAW, protocol); - if (this->socket < 0) + if (this->socket == -1) { DBG1(DBG_KNL, "unable to create netlink socket"); destroy(this); return NULL; } - - addr.nl_groups = 0; if (bind(this->socket, (struct sockaddr*)&addr, sizeof(addr))) { DBG1(DBG_KNL, "unable to bind netlink socket"); -- cgit v1.2.3 From c94e93a7ab2f07ee7197fd33d4f0e20f2d7d9671 Mon Sep 17 00:00:00 2001 From: Martin Willi Date: Thu, 10 Jul 2014 14:21:20 +0200 Subject: kernel-netlink: Pass protocol specific enum names to socket constructor This avoid the hard dependency on enum names, and makes kernel_netlink_shared independent of kernel_netlink_ipsec. --- .../plugins/kernel_netlink/kernel_netlink_shared.c | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) (limited to 'src/libhydra/plugins/kernel_netlink/kernel_netlink_shared.c') diff --git a/src/libhydra/plugins/kernel_netlink/kernel_netlink_shared.c b/src/libhydra/plugins/kernel_netlink/kernel_netlink_shared.c index 74466e291..b4cece720 100644 --- a/src/libhydra/plugins/kernel_netlink/kernel_netlink_shared.c +++ b/src/libhydra/plugins/kernel_netlink/kernel_netlink_shared.c @@ -46,14 +46,14 @@ struct private_netlink_socket_t { int seq; /** - * netlink socket protocol + * netlink socket */ - int protocol; + int socket; /** - * netlink socket + * Enum names for Netlink messages */ - int socket; + enum_name_t *names; }; /** @@ -83,10 +83,10 @@ METHOD(netlink_socket_t, netlink_send, status_t, addr.nl_pid = 0; addr.nl_groups = 0; - if (this->protocol == NETLINK_XFRM) + if (this->names) { DBG3(DBG_KNL, "sending %N: %b", - xfrm_msg_names, in->nlmsg_type, in, in->nlmsg_len); + this->names, in->nlmsg_type, in, in->nlmsg_len); } while (TRUE) { @@ -230,7 +230,7 @@ METHOD(netlink_socket_t, destroy, void, /** * Described in header. */ -netlink_socket_t *netlink_socket_create(int protocol) +netlink_socket_t *netlink_socket_create(int protocol, enum_name_t *names) { private_netlink_socket_t *this; struct sockaddr_nl addr = { @@ -246,7 +246,7 @@ netlink_socket_t *netlink_socket_create(int protocol) .seq = 200, .mutex = mutex_create(MUTEX_TYPE_DEFAULT), .socket = socket(AF_NETLINK, SOCK_RAW, protocol), - .protocol = protocol, + .names = names, ); if (this->socket == -1) -- cgit v1.2.3