[NETLINK]: Make use of NLA_STRING/NLA_NUL_STRING attribute validation
Converts existing NLA_STRING attributes to use the new validation features, saving a couple of temporary buffers. Signed-off-by: Thomas Graf <tgraf@suug.ch> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
a5531a5d85
commit
5176f91ea8
9 changed files with 17 additions and 26 deletions
|
@ -161,9 +161,6 @@ int fib_nl_newrule(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto errout;
|
goto errout;
|
||||||
|
|
||||||
if (tb[FRA_IFNAME] && nla_len(tb[FRA_IFNAME]) > IFNAMSIZ)
|
|
||||||
goto errout;
|
|
||||||
|
|
||||||
rule = kzalloc(ops->rule_size, GFP_KERNEL);
|
rule = kzalloc(ops->rule_size, GFP_KERNEL);
|
||||||
if (rule == NULL) {
|
if (rule == NULL) {
|
||||||
err = -ENOMEM;
|
err = -ENOMEM;
|
||||||
|
@ -177,10 +174,7 @@ int fib_nl_newrule(struct sk_buff *skb, struct nlmsghdr* nlh, void *arg)
|
||||||
struct net_device *dev;
|
struct net_device *dev;
|
||||||
|
|
||||||
rule->ifindex = -1;
|
rule->ifindex = -1;
|
||||||
if (nla_strlcpy(rule->ifname, tb[FRA_IFNAME],
|
nla_strlcpy(rule->ifname, tb[FRA_IFNAME], IFNAMSIZ);
|
||||||
IFNAMSIZ) >= IFNAMSIZ)
|
|
||||||
goto errout_free;
|
|
||||||
|
|
||||||
dev = __dev_get_by_name(rule->ifname);
|
dev = __dev_get_by_name(rule->ifname);
|
||||||
if (dev)
|
if (dev)
|
||||||
rule->ifindex = dev->ifindex;
|
rule->ifindex = dev->ifindex;
|
||||||
|
|
|
@ -371,8 +371,8 @@ static int rtnl_dump_ifinfo(struct sk_buff *skb, struct netlink_callback *cb)
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct nla_policy ifla_policy[IFLA_MAX+1] __read_mostly = {
|
static struct nla_policy ifla_policy[IFLA_MAX+1] __read_mostly = {
|
||||||
[IFLA_IFNAME] = { .type = NLA_STRING },
|
[IFLA_IFNAME] = { .type = NLA_STRING, .len = IFNAMSIZ-1 },
|
||||||
[IFLA_MAP] = { .minlen = sizeof(struct rtnl_link_ifmap) },
|
[IFLA_MAP] = { .len = sizeof(struct rtnl_link_ifmap) },
|
||||||
[IFLA_MTU] = { .type = NLA_U32 },
|
[IFLA_MTU] = { .type = NLA_U32 },
|
||||||
[IFLA_TXQLEN] = { .type = NLA_U32 },
|
[IFLA_TXQLEN] = { .type = NLA_U32 },
|
||||||
[IFLA_WEIGHT] = { .type = NLA_U32 },
|
[IFLA_WEIGHT] = { .type = NLA_U32 },
|
||||||
|
@ -392,9 +392,8 @@ static int rtnl_setlink(struct sk_buff *skb, struct nlmsghdr *nlh, void *arg)
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto errout;
|
goto errout;
|
||||||
|
|
||||||
if (tb[IFLA_IFNAME] &&
|
if (tb[IFLA_IFNAME])
|
||||||
nla_strlcpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ) >= IFNAMSIZ)
|
nla_strlcpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ);
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
err = -EINVAL;
|
err = -EINVAL;
|
||||||
ifm = nlmsg_data(nlh);
|
ifm = nlmsg_data(nlh);
|
||||||
|
|
|
@ -112,7 +112,7 @@ static int dn_fib_rule_action(struct fib_rule *rule, struct flowi *flp,
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct nla_policy dn_fib_rule_policy[FRA_MAX+1] __read_mostly = {
|
static struct nla_policy dn_fib_rule_policy[FRA_MAX+1] __read_mostly = {
|
||||||
[FRA_IFNAME] = { .type = NLA_STRING },
|
[FRA_IFNAME] = { .type = NLA_STRING, .len = IFNAMSIZ - 1 },
|
||||||
[FRA_PRIORITY] = { .type = NLA_U32 },
|
[FRA_PRIORITY] = { .type = NLA_U32 },
|
||||||
[FRA_SRC] = { .type = NLA_U16 },
|
[FRA_SRC] = { .type = NLA_U16 },
|
||||||
[FRA_DST] = { .type = NLA_U16 },
|
[FRA_DST] = { .type = NLA_U16 },
|
||||||
|
|
|
@ -85,7 +85,7 @@ static struct nla_policy ifa_ipv4_policy[IFA_MAX+1] __read_mostly = {
|
||||||
[IFA_ADDRESS] = { .type = NLA_U32 },
|
[IFA_ADDRESS] = { .type = NLA_U32 },
|
||||||
[IFA_BROADCAST] = { .type = NLA_U32 },
|
[IFA_BROADCAST] = { .type = NLA_U32 },
|
||||||
[IFA_ANYCAST] = { .type = NLA_U32 },
|
[IFA_ANYCAST] = { .type = NLA_U32 },
|
||||||
[IFA_LABEL] = { .type = NLA_STRING },
|
[IFA_LABEL] = { .type = NLA_STRING, .len = IFNAMSIZ - 1 },
|
||||||
};
|
};
|
||||||
|
|
||||||
static void rtmsg_ifa(int event, struct in_ifaddr *, struct nlmsghdr *, u32);
|
static void rtmsg_ifa(int event, struct in_ifaddr *, struct nlmsghdr *, u32);
|
||||||
|
|
|
@ -462,7 +462,7 @@ struct nla_policy rtm_ipv4_policy[RTA_MAX+1] __read_mostly = {
|
||||||
[RTA_PRIORITY] = { .type = NLA_U32 },
|
[RTA_PRIORITY] = { .type = NLA_U32 },
|
||||||
[RTA_PREFSRC] = { .type = NLA_U32 },
|
[RTA_PREFSRC] = { .type = NLA_U32 },
|
||||||
[RTA_METRICS] = { .type = NLA_NESTED },
|
[RTA_METRICS] = { .type = NLA_NESTED },
|
||||||
[RTA_MULTIPATH] = { .minlen = sizeof(struct rtnexthop) },
|
[RTA_MULTIPATH] = { .len = sizeof(struct rtnexthop) },
|
||||||
[RTA_PROTOINFO] = { .type = NLA_U32 },
|
[RTA_PROTOINFO] = { .type = NLA_U32 },
|
||||||
[RTA_FLOW] = { .type = NLA_U32 },
|
[RTA_FLOW] = { .type = NLA_U32 },
|
||||||
[RTA_MP_ALGO] = { .type = NLA_U32 },
|
[RTA_MP_ALGO] = { .type = NLA_U32 },
|
||||||
|
|
|
@ -179,7 +179,7 @@ static struct fib_table *fib_empty_table(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct nla_policy fib4_rule_policy[FRA_MAX+1] __read_mostly = {
|
static struct nla_policy fib4_rule_policy[FRA_MAX+1] __read_mostly = {
|
||||||
[FRA_IFNAME] = { .type = NLA_STRING },
|
[FRA_IFNAME] = { .type = NLA_STRING, .len = IFNAMSIZ - 1 },
|
||||||
[FRA_PRIORITY] = { .type = NLA_U32 },
|
[FRA_PRIORITY] = { .type = NLA_U32 },
|
||||||
[FRA_SRC] = { .type = NLA_U32 },
|
[FRA_SRC] = { .type = NLA_U32 },
|
||||||
[FRA_DST] = { .type = NLA_U32 },
|
[FRA_DST] = { .type = NLA_U32 },
|
||||||
|
|
|
@ -137,10 +137,10 @@ static int fib6_rule_match(struct fib_rule *rule, struct flowi *fl, int flags)
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct nla_policy fib6_rule_policy[FRA_MAX+1] __read_mostly = {
|
static struct nla_policy fib6_rule_policy[FRA_MAX+1] __read_mostly = {
|
||||||
[FRA_IFNAME] = { .type = NLA_STRING },
|
[FRA_IFNAME] = { .type = NLA_STRING, .len = IFNAMSIZ - 1 },
|
||||||
[FRA_PRIORITY] = { .type = NLA_U32 },
|
[FRA_PRIORITY] = { .type = NLA_U32 },
|
||||||
[FRA_SRC] = { .minlen = sizeof(struct in6_addr) },
|
[FRA_SRC] = { .len = sizeof(struct in6_addr) },
|
||||||
[FRA_DST] = { .minlen = sizeof(struct in6_addr) },
|
[FRA_DST] = { .len = sizeof(struct in6_addr) },
|
||||||
[FRA_FWMARK] = { .type = NLA_U32 },
|
[FRA_FWMARK] = { .type = NLA_U32 },
|
||||||
[FRA_FWMASK] = { .type = NLA_U32 },
|
[FRA_FWMASK] = { .type = NLA_U32 },
|
||||||
[FRA_TABLE] = { .type = NLA_U32 },
|
[FRA_TABLE] = { .type = NLA_U32 },
|
||||||
|
|
|
@ -1865,7 +1865,7 @@ void rt6_mtu_change(struct net_device *dev, unsigned mtu)
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct nla_policy rtm_ipv6_policy[RTA_MAX+1] __read_mostly = {
|
static struct nla_policy rtm_ipv6_policy[RTA_MAX+1] __read_mostly = {
|
||||||
[RTA_GATEWAY] = { .minlen = sizeof(struct in6_addr) },
|
[RTA_GATEWAY] = { .len = sizeof(struct in6_addr) },
|
||||||
[RTA_OIF] = { .type = NLA_U32 },
|
[RTA_OIF] = { .type = NLA_U32 },
|
||||||
[RTA_IIF] = { .type = NLA_U32 },
|
[RTA_IIF] = { .type = NLA_U32 },
|
||||||
[RTA_PRIORITY] = { .type = NLA_U32 },
|
[RTA_PRIORITY] = { .type = NLA_U32 },
|
||||||
|
|
|
@ -455,7 +455,8 @@ static struct sk_buff *ctrl_build_msg(struct genl_family *family, u32 pid,
|
||||||
|
|
||||||
static struct nla_policy ctrl_policy[CTRL_ATTR_MAX+1] __read_mostly = {
|
static struct nla_policy ctrl_policy[CTRL_ATTR_MAX+1] __read_mostly = {
|
||||||
[CTRL_ATTR_FAMILY_ID] = { .type = NLA_U16 },
|
[CTRL_ATTR_FAMILY_ID] = { .type = NLA_U16 },
|
||||||
[CTRL_ATTR_FAMILY_NAME] = { .type = NLA_STRING },
|
[CTRL_ATTR_FAMILY_NAME] = { .type = NLA_NUL_STRING,
|
||||||
|
.len = GENL_NAMSIZ - 1 },
|
||||||
};
|
};
|
||||||
|
|
||||||
static int ctrl_getfamily(struct sk_buff *skb, struct genl_info *info)
|
static int ctrl_getfamily(struct sk_buff *skb, struct genl_info *info)
|
||||||
|
@ -470,12 +471,9 @@ static int ctrl_getfamily(struct sk_buff *skb, struct genl_info *info)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (info->attrs[CTRL_ATTR_FAMILY_NAME]) {
|
if (info->attrs[CTRL_ATTR_FAMILY_NAME]) {
|
||||||
char name[GENL_NAMSIZ];
|
char *name;
|
||||||
|
|
||||||
if (nla_strlcpy(name, info->attrs[CTRL_ATTR_FAMILY_NAME],
|
|
||||||
GENL_NAMSIZ) >= GENL_NAMSIZ)
|
|
||||||
goto errout;
|
|
||||||
|
|
||||||
|
name = nla_data(info->attrs[CTRL_ATTR_FAMILY_NAME]);
|
||||||
res = genl_family_find_byname(name);
|
res = genl_family_find_byname(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue