summaryrefslogtreecommitdiffhomepage
path: root/lib/rtnl.c
diff options
context:
space:
mode:
authorJo-Philipp Wich <jo@mein.io>2022-06-27 15:24:24 +0200
committerJo-Philipp Wich <jo@mein.io>2022-06-27 15:46:34 +0200
commitc4dde502c86c1da3c328e722cb74d8a19e70fc11 (patch)
treed49c481f93edfcaf1bd96a026a862ff8312bfeb1 /lib/rtnl.c
parent44bf33a2701d7cf94ae0a41f6befc7f591913e10 (diff)
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 <jo@mein.io>
Diffstat (limited to 'lib/rtnl.c')
-rw-r--r--lib/rtnl.c20
1 files changed, 13 insertions, 7 deletions
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);