From c4dde502c86c1da3c328e722cb74d8a19e70fc11 Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Mon, 27 Jun 2022 15:24:24 +0200 Subject: rtnl: update NETLINK_GET_STRICT_CHK socket flag with every request So far the NETLINK_GET_STRICT_CHK socket flag was only set on the implicit socket creation performed during the first request and ignored for subsequent ones which made it impossible to perform only some requests with enabled strict checking. Modify the logic to check the flag state for every request and change it if needed. This allows performing both strict and non-strict requests over the same connection. Signed-off-by: Jo-Philipp Wich --- lib/rtnl.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) (limited to 'lib') diff --git a/lib/rtnl.c b/lib/rtnl.c index 1691377..be2b3a8 100644 --- a/lib/rtnl.c +++ b/lib/rtnl.c @@ -3119,9 +3119,10 @@ uc_nl_request(uc_vm_t *vm, size_t nargs) uc_value_t *payload = uc_fn_arg(2); request_state_t st = { .vm = vm }; uint16_t flagval = 0; - int enable = 1, err; struct nl_msg *msg; struct nl_cb *cb; + socklen_t optlen; + int enable, err; void *buf; size_t i; @@ -3155,16 +3156,21 @@ uc_nl_request(uc_vm_t *vm, size_t nargs) if (err != 0) err_return(err, NULL); + } - if (flagval & NLM_F_STRICT_CHK) { - if (setsockopt(sock->s_fd, SOL_NETLINK, NETLINK_GET_STRICT_CHK, &enable, sizeof(enable)) < 0) - err_return(nl_syserr2nlerr(errno), "Unable to enable NETLINK_GET_STRICT_CHK"); + optlen = sizeof(enable); - flagval &= ~NLM_F_STRICT_CHK; - } + if (getsockopt(sock->s_fd, SOL_NETLINK, NETLINK_GET_STRICT_CHK, &enable, &optlen) < 0) + enable = 0; + + if (!!(flagval & NLM_F_STRICT_CHK) != enable) { + enable = !!(flagval & NLM_F_STRICT_CHK); + + if (setsockopt(sock->s_fd, SOL_NETLINK, NETLINK_GET_STRICT_CHK, &enable, sizeof(enable)) < 0) + err_return(nl_syserr2nlerr(errno), "Unable to toggle NETLINK_GET_STRICT_CHK"); } - msg = nlmsg_alloc_simple(ucv_int64_get(cmd), NLM_F_REQUEST | flagval); + msg = nlmsg_alloc_simple(ucv_int64_get(cmd), NLM_F_REQUEST | (flagval & ~NLM_F_STRICT_CHK)); if (!msg) err_return(NLE_NOMEM, NULL); -- cgit v1.2.3