ipxfrm: wrong nl msg sent on deleteall cmd
XFRM netlink family is independent from the route netlink family. It's wrong to call rtnl_wilddump_request(), because it will add a 'struct ifinfomsg' into the header and the kernel will complain (at least for xfrm state): netlink: 24 bytes leftover after parsing attributes in process `ip'. Reported-by: Gregory Hoggarth <Gregory.Hoggarth@alliedtelesis.co.nz> Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
This commit is contained in:
parent
d652ccbf81
commit
782cf01dc0
|
|
@ -848,13 +848,23 @@ static int xfrm_policy_list_or_deleteall(int argc, char **argv, int deleteall)
|
|||
xb.rth = &rth;
|
||||
|
||||
for (i = 0; ; i++) {
|
||||
struct {
|
||||
struct nlmsghdr n;
|
||||
char buf[NLMSG_BUF_SIZE];
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_HDRLEN,
|
||||
.n.nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST,
|
||||
.n.nlmsg_type = XFRM_MSG_GETPOLICY,
|
||||
.n.nlmsg_seq = rth.dump = ++rth.seq,
|
||||
};
|
||||
|
||||
xb.offset = 0;
|
||||
xb.nlmsg_count = 0;
|
||||
|
||||
if (show_stats > 1)
|
||||
fprintf(stderr, "Delete-all round = %d\n", i);
|
||||
|
||||
if (rtnl_wilddump_request(&rth, preferred_family, XFRM_MSG_GETPOLICY) < 0) {
|
||||
if (rtnl_send(&rth, (void *)&req, req.n.nlmsg_len) < 0) {
|
||||
perror("Cannot send dump request");
|
||||
exit(1);
|
||||
}
|
||||
|
|
@ -880,7 +890,17 @@ static int xfrm_policy_list_or_deleteall(int argc, char **argv, int deleteall)
|
|||
xb.nlmsg_count = 0;
|
||||
}
|
||||
} else {
|
||||
if (rtnl_wilddump_request(&rth, preferred_family, XFRM_MSG_GETPOLICY) < 0) {
|
||||
struct {
|
||||
struct nlmsghdr n;
|
||||
char buf[NLMSG_BUF_SIZE];
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_HDRLEN,
|
||||
.n.nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST,
|
||||
.n.nlmsg_type = XFRM_MSG_GETPOLICY,
|
||||
.n.nlmsg_seq = rth.dump = ++rth.seq,
|
||||
};
|
||||
|
||||
if (rtnl_send(&rth, (void *)&req, req.n.nlmsg_len) < 0) {
|
||||
perror("Cannot send dump request");
|
||||
exit(1);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1148,13 +1148,23 @@ static int xfrm_state_list_or_deleteall(int argc, char **argv, int deleteall)
|
|||
xb.rth = &rth;
|
||||
|
||||
for (i = 0; ; i++) {
|
||||
struct {
|
||||
struct nlmsghdr n;
|
||||
char buf[NLMSG_BUF_SIZE];
|
||||
} req = {
|
||||
.n.nlmsg_len = NLMSG_HDRLEN,
|
||||
.n.nlmsg_flags = NLM_F_DUMP | NLM_F_REQUEST,
|
||||
.n.nlmsg_type = XFRM_MSG_GETSA,
|
||||
.n.nlmsg_seq = rth.dump = ++rth.seq,
|
||||
};
|
||||
|
||||
xb.offset = 0;
|
||||
xb.nlmsg_count = 0;
|
||||
|
||||
if (show_stats > 1)
|
||||
fprintf(stderr, "Delete-all round = %d\n", i);
|
||||
|
||||
if (rtnl_wilddump_request(&rth, preferred_family, XFRM_MSG_GETSA) < 0) {
|
||||
if (rtnl_send(&rth, (void *)&req, req.n.nlmsg_len) < 0) {
|
||||
perror("Cannot send dump request");
|
||||
exit(1);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue