[NETFILTER] nfnetlink: use highest bit of nfa_type to indicate nested TLV
As Henrik Nordstrom pointed out, all our efforts with "split endian" (i.e. host byte order tags, net byte order values) are useless, unless a parser can determine whether an attribute is nested or not. This patch steals the highest bit of nfattr.nfa_type to indicate whether the data payload contains a nested nfattr (1) or not (0). This will break userspace compatibility, but luckily no kernel with nfnetlink was released so far. Signed-off-by: Harald Welte <laforge@netfilter.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
f40863cec8
commit
ebe0bbf06c
@@ -133,7 +133,7 @@ int nfattr_parse(struct nfattr *tb[], int maxattr, struct nfattr *nfa, int len)
|
||||
memset(tb, 0, sizeof(struct nfattr *) * maxattr);
|
||||
|
||||
while (NFA_OK(nfa, len)) {
|
||||
unsigned flavor = nfa->nfa_type;
|
||||
unsigned flavor = NFA_TYPE(nfa);
|
||||
if (flavor && flavor <= maxattr)
|
||||
tb[flavor-1] = nfa;
|
||||
nfa = NFA_NEXT(nfa, len);
|
||||
@@ -177,7 +177,7 @@ nfnetlink_check_attributes(struct nfnetlink_subsystem *subsys,
|
||||
int attrlen = nlh->nlmsg_len - NLMSG_ALIGN(min_len);
|
||||
|
||||
while (NFA_OK(attr, attrlen)) {
|
||||
unsigned flavor = attr->nfa_type;
|
||||
unsigned flavor = NFA_TYPE(attr);
|
||||
if (flavor) {
|
||||
if (flavor > attr_count)
|
||||
return -EINVAL;
|
||||
|
Reference in New Issue
Block a user