summaryrefslogtreecommitdiffhomepage
path: root/lib/rtnl.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/rtnl.c')
-rw-r--r--lib/rtnl.c17
1 files changed, 9 insertions, 8 deletions
diff --git a/lib/rtnl.c b/lib/rtnl.c
index a118544..b2063fb 100644
--- a/lib/rtnl.c
+++ b/lib/rtnl.c
@@ -1345,10 +1345,13 @@ uc_nl_convert_attrs(struct nl_msg *msg, void *buf, size_t buflen, size_t headsiz
if (!tb)
return false;
- if (buflen > headsize)
- nla_parse(tb, maxattr, buf + headsize, buflen - headsize, NULL);
- else
+ if (buflen > headsize) {
+ if (maxattr)
+ nla_parse(tb, maxattr, buf + headsize, buflen - headsize, NULL);
+ }
+ else {
structlen = buflen;
+ }
for (i = 0; i < nattrs; i++) {
if (attrs[i].attr == 0 && (uintptr_t)attrs[i].auxdata >= structlen)
@@ -3087,10 +3090,7 @@ cb_reply(struct nl_msg *msg, void *arg)
}
}
- if (hdr->nlmsg_flags & NLM_F_MULTI)
- s->state = STATE_CONTINUE;
- else
- s->state = STATE_REPLIED;
+ s->state = STATE_CONTINUE;
return NL_SKIP;
}
@@ -3197,6 +3197,7 @@ uc_nl_request(uc_vm_t *vm, size_t nargs)
nl_cb_set(cb, NL_CB_VALID, NL_CB_CUSTOM, cb_reply, &st);
nl_cb_set(cb, NL_CB_FINISH, NL_CB_CUSTOM, cb_done, &st);
+ nl_cb_set(cb, NL_CB_ACK, NL_CB_CUSTOM, cb_done, &st);
nl_cb_err(cb, NL_CB_CUSTOM, cb_error, &st);
nl_send_auto_complete(sock, msg);
@@ -3210,7 +3211,7 @@ uc_nl_request(uc_vm_t *vm, size_t nargs)
st.state = STATE_ERROR;
}
}
- while (st.state == STATE_CONTINUE);
+ while (st.state < STATE_REPLIED);
nlmsg_free(msg);
nl_cb_put(cb);