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;
|
xb.rth = &rth;
|
||||||
|
|
||||||
for (i = 0; ; i++) {
|
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.offset = 0;
|
||||||
xb.nlmsg_count = 0;
|
xb.nlmsg_count = 0;
|
||||||
|
|
||||||
if (show_stats > 1)
|
if (show_stats > 1)
|
||||||
fprintf(stderr, "Delete-all round = %d\n", i);
|
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");
|
perror("Cannot send dump request");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
@ -880,7 +890,17 @@ static int xfrm_policy_list_or_deleteall(int argc, char **argv, int deleteall)
|
||||||
xb.nlmsg_count = 0;
|
xb.nlmsg_count = 0;
|
||||||
}
|
}
|
||||||
} else {
|
} 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");
|
perror("Cannot send dump request");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1148,13 +1148,23 @@ static int xfrm_state_list_or_deleteall(int argc, char **argv, int deleteall)
|
||||||
xb.rth = &rth;
|
xb.rth = &rth;
|
||||||
|
|
||||||
for (i = 0; ; i++) {
|
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.offset = 0;
|
||||||
xb.nlmsg_count = 0;
|
xb.nlmsg_count = 0;
|
||||||
|
|
||||||
if (show_stats > 1)
|
if (show_stats > 1)
|
||||||
fprintf(stderr, "Delete-all round = %d\n", i);
|
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");
|
perror("Cannot send dump request");
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue