diff --git a/acinclude.m4 b/acinclude.m4 index 729d2c65d80..02efea6de2f 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -1053,6 +1053,9 @@ AC_DEFUN([OVS_CHECK_LINUX_COMPAT], [ OVS_FIND_FIELD_IFELSE([$KSRC/include/net/genetlink.h], [genl_ops], [policy], [OVS_DEFINE([HAVE_GENL_OPS_POLICY])]) + OVS_GREP_IFELSE([$KSRC/include/net/netlink.h], + [nla_parse_deprecated_strict], + [OVS_DEFINE([HAVE_NLA_PARSE_DEPRECATED_STRICT])]) if cmp -s datapath/linux/kcompat.h.new \ datapath/linux/kcompat.h >/dev/null 2>&1; then diff --git a/datapath/datapath.c b/datapath/datapath.c index f0c345723f7..a7af7849a84 100644 --- a/datapath/datapath.c +++ b/datapath/datapath.c @@ -1401,8 +1401,8 @@ static int ovs_flow_cmd_dump(struct sk_buff *skb, struct netlink_callback *cb) u32 ufid_flags; int err; - err = genlmsg_parse(cb->nlh, &dp_flow_genl_family, a, - OVS_FLOW_ATTR_MAX, flow_policy, NULL); + err = genlmsg_parse_deprecated(cb->nlh, &dp_flow_genl_family, a, + OVS_FLOW_ATTR_MAX, flow_policy, NULL); if (err) return err; ufid_flags = ovs_nla_get_ufid_flags(a[OVS_FLOW_ATTR_UFID_FLAGS]); diff --git a/datapath/flow_netlink.c b/datapath/flow_netlink.c index 9fc1a19221d..d3fd77106d9 100644 --- a/datapath/flow_netlink.c +++ b/datapath/flow_netlink.c @@ -2859,8 +2859,8 @@ static int validate_userspace(const struct nlattr *attr) struct nlattr *a[OVS_USERSPACE_ATTR_MAX + 1]; int error; - error = nla_parse_nested(a, OVS_USERSPACE_ATTR_MAX, attr, - userspace_policy, NULL); + error = nla_parse_nested_deprecated(a, OVS_USERSPACE_ATTR_MAX, attr, + userspace_policy, NULL); if (error) return error; @@ -2891,8 +2891,9 @@ static int validate_and_copy_check_pkt_len(struct net *net, int nested_acts_start; int start, err; - err = nla_parse_nested(a, OVS_CHECK_PKT_LEN_ATTR_MAX, attr, - cpl_policy, NULL); + err = nla_parse_deprecated_strict(a, OVS_CHECK_PKT_LEN_ATTR_MAX, + nla_data(attr), nla_len(attr), + cpl_policy, NULL); if (err) return err; diff --git a/datapath/linux/compat/include/net/netlink.h b/datapath/linux/compat/include/net/netlink.h index 34fc3460dc8..84e073974bd 100644 --- a/datapath/linux/compat/include/net/netlink.h +++ b/datapath/linux/compat/include/net/netlink.h @@ -143,6 +143,11 @@ static inline int nla_put_be64(struct sk_buff *skb, int attrtype, __be64 value, #endif +#ifndef HAVE_NLA_PARSE_DEPRECATED_STRICT +#define nla_parse_nested_deprecated nla_parse_nested +#define nla_parse_deprecated_strict nla_parse +#define genlmsg_parse_deprecated genlmsg_parse + #ifndef HAVE_NETLINK_EXT_ACK struct netlink_ext_ack; @@ -153,7 +158,8 @@ static inline int rpl_nla_parse_nested(struct nlattr *tb[], int maxtype, { return nla_parse_nested(tb, maxtype, nla, policy); } -#define nla_parse_nested rpl_nla_parse_nested +#undef nla_parse_nested_deprecated +#define nla_parse_nested_deprecated rpl_nla_parse_nested static inline int rpl_nla_parse(struct nlattr **tb, int maxtype, const struct nlattr *head, int len, @@ -162,8 +168,10 @@ static inline int rpl_nla_parse(struct nlattr **tb, int maxtype, { return nla_parse(tb, maxtype, head, len, policy); } -#define nla_parse rpl_nla_parse +#undef nla_parse_deprecated_strict +#define nla_parse_deprecated_strict rpl_nla_parse #endif +#endif /* HAVE_NLA_PARSE_DEPRECATED_STRICT */ #ifndef HAVE_NLA_NEST_START_NOFLAG static inline struct nlattr *rpl_nla_nest_start_noflag(struct sk_buff *skb, diff --git a/datapath/meter.c b/datapath/meter.c index 8cecd5a3480..92c9c3671db 100644 --- a/datapath/meter.c +++ b/datapath/meter.c @@ -239,9 +239,11 @@ static struct dp_meter *dp_meter_create(struct nlattr **a) struct nlattr *attr[OVS_BAND_ATTR_MAX + 1]; u32 band_max_delta_t; - err = nla_parse((struct nlattr **)&attr, OVS_BAND_ATTR_MAX, - nla_data(nla), nla_len(nla), band_policy, - NULL); + err = nla_parse_deprecated_strict((struct nlattr **)&attr, + OVS_BAND_ATTR_MAX, + nla_data(nla), + nla_len(nla), + band_policy, NULL); if (err) goto exit_free_meter; diff --git a/datapath/vport-vxlan.c b/datapath/vport-vxlan.c index 70ed376e386..79331c96835 100644 --- a/datapath/vport-vxlan.c +++ b/datapath/vport-vxlan.c @@ -99,8 +99,8 @@ static int vxlan_configure_exts(struct vport *vport, struct nlattr *attr, if (nla_len(attr) < sizeof(struct nlattr)) return -EINVAL; - err = nla_parse_nested(exts, OVS_VXLAN_EXT_MAX, attr, exts_policy, - NULL); + err = nla_parse_nested_deprecated(exts, OVS_VXLAN_EXT_MAX, attr, + exts_policy, NULL); if (err < 0) return err;