lists.openwall.net | lists / announce owl-users owl-dev john-users john-dev passwdqc-users yescrypt popa3d-users / oss-security kernel-hardening musl sabotage tlsify passwords / crypt-dev xvendor / Bugtraq Full-Disclosure linux-kernel linux-netdev linux-ext4 linux-hardening linux-cve-announce PHC | |
Open Source and information security mailing list archives
| ||
|
Date: Thu, 25 Mar 2021 08:56:53 +0700 From: Hoang Le <hoang.h.le@...tech.com.au> To: netdev@...r.kernel.org, dsahern@...il.com, tipc-discussion@...ts.sourceforge.net, jmaloy@...hat.com, maloy@...jonn.com, ying.xue@...driver.com, tuan.a.vo@...tech.com.au, tung.q.nguyen@...tech.com.au Subject: [iproute2-next] tipc: add support for the netlink extack Add support extack in tipc to dump the netlink extack error messages (i.e -EINVAL) sent from kernel. Acked-by: Jon Maloy <jmaloy@...hat.com> Signed-off-by: Hoang Le <hoang.h.le@...tech.com.au> --- tipc/msg.c | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/tipc/msg.c b/tipc/msg.c index dc09d05048f3..f29b2f8d35ad 100644 --- a/tipc/msg.c +++ b/tipc/msg.c @@ -18,6 +18,7 @@ #include <linux/genetlink.h> #include <libmnl/libmnl.h> +#include "libnetlink.h" #include "msg.h" int parse_attrs(const struct nlattr *attr, void *data) @@ -49,6 +50,7 @@ static struct mnl_socket *msg_send(struct nlmsghdr *nlh) { int ret; struct mnl_socket *nl; + int one = 1; nl = mnl_socket_open(NETLINK_GENERIC); if (nl == NULL) { @@ -56,6 +58,8 @@ static struct mnl_socket *msg_send(struct nlmsghdr *nlh) return NULL; } + /* support to get extended ACK */ + mnl_socket_setsockopt(nl, NETLINK_EXT_ACK, &one, sizeof(one)); ret = mnl_socket_bind(nl, 0, MNL_SOCKET_AUTOPID); if (ret < 0) { perror("mnl_socket_bind"); @@ -73,21 +77,32 @@ static struct mnl_socket *msg_send(struct nlmsghdr *nlh) static int msg_recv(struct mnl_socket *nl, mnl_cb_t callback, void *data, int seq) { - int ret; unsigned int portid; char buf[MNL_SOCKET_BUFFER_SIZE]; + struct nlmsghdr *h; + size_t num_bytes; + int is_err = 0; + int ret = 0; portid = mnl_socket_get_portid(nl); - ret = mnl_socket_recvfrom(nl, buf, sizeof(buf)); - while (ret > 0) { - ret = mnl_cb_run(buf, ret, seq, portid, callback, data); + num_bytes = mnl_socket_recvfrom(nl, buf, sizeof(buf)); + while (num_bytes > 0) { + ret = mnl_cb_run(buf, num_bytes, seq, portid, callback, data); if (ret <= 0) break; - ret = mnl_socket_recvfrom(nl, buf, sizeof(buf)); + num_bytes = mnl_socket_recvfrom(nl, buf, sizeof(buf)); + } + + if (ret == -1) { + if (num_bytes > 0) { + h = (struct nlmsghdr *)buf; + is_err = nl_dump_ext_ack(h, NULL); + } + + if (!is_err) + perror("error"); } - if (ret == -1) - perror("error"); mnl_socket_close(nl); -- 2.25.1
Powered by blists - more mailing lists