* [PATCH 1/2 net-next] ipv4: validate IPV4_DEVCONF attributes properly
@ 2026-02-23 15:30 Fernando Fernandez Mancera
2026-02-23 15:30 ` [PATCH 2/2 net-next] ipv4: bump rt_genid when a relevant devconf value changes through netlink Fernando Fernandez Mancera
0 siblings, 1 reply; 4+ messages in thread
From: Fernando Fernandez Mancera @ 2026-02-23 15:30 UTC (permalink / raw)
To: netdev
Cc: davem, dsahern, edumazet, kuba, pabeni, horms, tgraf,
Fernando Fernandez Mancera
As the IPV4_DEVCONF netlink attributes are not being validated, it is
possible to use netlink to set read-only values like mc_forwarding. In
addition, valid ranges are not being validated neither but that is less
relevant as they aren't in sysctl.
To avoid similar situations in the future, define a NLA policy for
IPV4_DEVCONF attributes which are nested in IFLA_INET_CONF.
Please note that MEDIUM_ID is defined as NLA_U32 too because currently
its usage through netlink is broken for its valid value -1. Modifying
the type to NLA_S32 would break existing users of set/get netlink
operation.
Fixes: 9f0f7272ac95 ("ipv4: AF_INET link address family")
Signed-off-by: Fernando Fernandez Mancera <fmancera@suse.de>
---
net/ipv4/devinet.c | 81 ++++++++++++++++++++++++++++++++++++++++------
1 file changed, 71 insertions(+), 10 deletions(-)
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c
index 942a887bf089..590c68e979f5 100644
--- a/net/ipv4/devinet.c
+++ b/net/ipv4/devinet.c
@@ -2063,12 +2063,76 @@ static const struct nla_policy inet_af_policy[IFLA_INET_MAX+1] = {
[IFLA_INET_CONF] = { .type = NLA_NESTED },
};
+static const struct nla_policy inet_devconf_policy[IPV4_DEVCONF_MAX + 1] = {
+ [IPV4_DEVCONF_FORWARDING] = NLA_POLICY_RANGE(NLA_U32,
+ 0, 1),
+ [IPV4_DEVCONF_MC_FORWARDING] = { .type = NLA_REJECT },
+ [IPV4_DEVCONF_PROXY_ARP] = NLA_POLICY_RANGE(NLA_U32,
+ 0, 1),
+ [IPV4_DEVCONF_ACCEPT_REDIRECTS] = NLA_POLICY_RANGE(NLA_U32,
+ 0, 1),
+ [IPV4_DEVCONF_SECURE_REDIRECTS] = NLA_POLICY_RANGE(NLA_U32,
+ 0, 1),
+ [IPV4_DEVCONF_SEND_REDIRECTS] = NLA_POLICY_RANGE(NLA_U32,
+ 0, 1),
+ [IPV4_DEVCONF_SHARED_MEDIA] = NLA_POLICY_RANGE(NLA_U32,
+ 0, 1),
+ [IPV4_DEVCONF_RP_FILTER] = NLA_POLICY_RANGE(NLA_U32,
+ 0, 2),
+ [IPV4_DEVCONF_ACCEPT_SOURCE_ROUTE] = NLA_POLICY_RANGE(NLA_U32,
+ 0, 1),
+ [IPV4_DEVCONF_BOOTP_RELAY] = NLA_POLICY_RANGE(NLA_U32,
+ 0, 1),
+ [IPV4_DEVCONF_LOG_MARTIANS] = NLA_POLICY_RANGE(NLA_U32,
+ 0, 1),
+ [IPV4_DEVCONF_TAG] = { .type = NLA_U32 },
+ [IPV4_DEVCONF_ARPFILTER] = NLA_POLICY_RANGE(NLA_U32,
+ 0, 1),
+ [IPV4_DEVCONF_MEDIUM_ID] = { .type = NLA_U32 },
+ [IPV4_DEVCONF_NOXFRM] = NLA_POLICY_RANGE(NLA_U32,
+ 0, 1),
+ [IPV4_DEVCONF_NOPOLICY] = NLA_POLICY_RANGE(NLA_U32,
+ 0, 1),
+ [IPV4_DEVCONF_FORCE_IGMP_VERSION] = NLA_POLICY_RANGE(NLA_U32,
+ 0, 3),
+ [IPV4_DEVCONF_ARP_ANNOUNCE] = NLA_POLICY_RANGE(NLA_U32,
+ 0, 2),
+ [IPV4_DEVCONF_ARP_IGNORE] = NLA_POLICY_RANGE(NLA_U32,
+ 0, 8),
+ [IPV4_DEVCONF_PROMOTE_SECONDARIES] = NLA_POLICY_RANGE(NLA_U32,
+ 0, 1),
+ [IPV4_DEVCONF_ARP_ACCEPT] = NLA_POLICY_RANGE(NLA_U32,
+ 0, 1),
+ [IPV4_DEVCONF_ARP_NOTIFY] = NLA_POLICY_RANGE(NLA_U32,
+ 0, 1),
+ [IPV4_DEVCONF_ACCEPT_LOCAL] = NLA_POLICY_RANGE(NLA_U32,
+ 0, 1),
+ [IPV4_DEVCONF_SRC_VMARK] = NLA_POLICY_RANGE(NLA_U32,
+ 0, 1),
+ [IPV4_DEVCONF_PROXY_ARP_PVLAN] = NLA_POLICY_RANGE(NLA_U32,
+ 0, 1),
+ [IPV4_DEVCONF_ROUTE_LOCALNET] = NLA_POLICY_RANGE(NLA_U32,
+ 0, 1),
+ [IPV4_DEVCONF_IGMPV2_UNSOLICITED_REPORT_INTERVAL] = { .type = NLA_U32 },
+ [IPV4_DEVCONF_IGMPV3_UNSOLICITED_REPORT_INTERVAL] = { .type = NLA_U32 },
+ [IPV4_DEVCONF_IGNORE_ROUTES_WITH_LINKDOWN] = NLA_POLICY_RANGE(NLA_U32,
+ 0, 1),
+ [IPV4_DEVCONF_DROP_UNICAST_IN_L2_MULTICAST] = NLA_POLICY_RANGE(NLA_U32,
+ 0, 1),
+ [IPV4_DEVCONF_DROP_GRATUITOUS_ARP] = NLA_POLICY_RANGE(NLA_U32,
+ 0, 1),
+ [IPV4_DEVCONF_BC_FORWARDING] = NLA_POLICY_RANGE(NLA_U32,
+ 0, 1),
+ [IPV4_DEVCONF_ARP_EVICT_NOCARRIER] = NLA_POLICY_RANGE(NLA_U32,
+ 0, 1),
+};
+
static int inet_validate_link_af(const struct net_device *dev,
const struct nlattr *nla,
struct netlink_ext_ack *extack)
{
- struct nlattr *a, *tb[IFLA_INET_MAX+1];
- int err, rem;
+ struct nlattr *tb[IFLA_INET_MAX + 1], *nested_tb[IPV4_DEVCONF_MAX + 1];
+ int err;
if (dev && !__in_dev_get_rtnl(dev))
return -EAFNOSUPPORT;
@@ -2079,15 +2143,12 @@ static int inet_validate_link_af(const struct net_device *dev,
return err;
if (tb[IFLA_INET_CONF]) {
- nla_for_each_nested(a, tb[IFLA_INET_CONF], rem) {
- int cfgid = nla_type(a);
+ err = nla_parse_nested(nested_tb, IPV4_DEVCONF_MAX,
+ tb[IFLA_INET_CONF], inet_devconf_policy,
+ extack);
- if (nla_len(a) < 4)
- return -EINVAL;
-
- if (cfgid <= 0 || cfgid > IPV4_DEVCONF_MAX)
- return -EINVAL;
- }
+ if (err < 0)
+ return err;
}
return 0;
--
2.53.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH 2/2 net-next] ipv4: bump rt_genid when a relevant devconf value changes through netlink
2026-02-23 15:30 [PATCH 1/2 net-next] ipv4: validate IPV4_DEVCONF attributes properly Fernando Fernandez Mancera
@ 2026-02-23 15:30 ` Fernando Fernandez Mancera
2026-02-24 17:19 ` Simon Horman
0 siblings, 1 reply; 4+ messages in thread
From: Fernando Fernandez Mancera @ 2026-02-23 15:30 UTC (permalink / raw)
To: netdev
Cc: davem, dsahern, edumazet, kuba, pabeni, horms, tgraf,
Fernando Fernandez Mancera
When modifying IPv4 devconf values using netlink for some relevant
fields the rt_cache_flush() call was missing. In addition, if forwarding
is enabled on the interface then disable LRO.
This is needed to avoid possible connectivity issues and ease the
responsabilities of user space tools.
Fixes: 9f0f7272ac95 ("ipv4: AF_INET link address family")
Signed-off-by: Fernando Fernandez Mancera <fmancera@suse.de>
---
net/ipv4/devinet.c | 23 ++++++++++++++++++++++-
1 file changed, 22 insertions(+), 1 deletion(-)
diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c
index 590c68e979f5..9f55c13a9c1f 100644
--- a/net/ipv4/devinet.c
+++ b/net/ipv4/devinet.c
@@ -2159,6 +2159,8 @@ static int inet_set_link_af(struct net_device *dev, const struct nlattr *nla,
{
struct in_device *in_dev = __in_dev_get_rtnl(dev);
struct nlattr *a, *tb[IFLA_INET_MAX+1];
+ struct net *net = dev_net(in_dev->dev);
+ bool flush_cache = false;
int rem;
if (!in_dev)
@@ -2168,8 +2170,27 @@ static int inet_set_link_af(struct net_device *dev, const struct nlattr *nla,
return -EINVAL;
if (tb[IFLA_INET_CONF]) {
- nla_for_each_nested(a, tb[IFLA_INET_CONF], rem)
+ nla_for_each_nested(a, tb[IFLA_INET_CONF], rem) {
ipv4_devconf_set(in_dev, nla_type(a), nla_get_u32(a));
+
+ switch (nla_type(a)) {
+ case IPV4_DEVCONF_FORWARDING:
+ if (nla_get_u32(a))
+ dev_disable_lro(in_dev->dev);
+ fallthrough;
+ case IPV4_DEVCONF_NOXFRM:
+ case IPV4_DEVCONF_NOPOLICY:
+ case IPV4_DEVCONF_PROMOTE_SECONDARIES:
+ case IPV4_DEVCONF_ROUTE_LOCALNET:
+ case IPV4_DEVCONF_DROP_UNICAST_IN_L2_MULTICAST:
+ flush_cache = true;
+ break;
+ default:
+ break;
+ }
+ }
+ if (flush_cache)
+ rt_cache_flush(net);
}
return 0;
--
2.53.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH 2/2 net-next] ipv4: bump rt_genid when a relevant devconf value changes through netlink
2026-02-23 15:30 ` [PATCH 2/2 net-next] ipv4: bump rt_genid when a relevant devconf value changes through netlink Fernando Fernandez Mancera
@ 2026-02-24 17:19 ` Simon Horman
2026-02-24 21:15 ` Fernando Fernandez Mancera
0 siblings, 1 reply; 4+ messages in thread
From: Simon Horman @ 2026-02-24 17:19 UTC (permalink / raw)
To: Fernando Fernandez Mancera
Cc: netdev, davem, dsahern, edumazet, kuba, pabeni, tgraf
On Mon, Feb 23, 2026 at 04:30:45PM +0100, Fernando Fernandez Mancera wrote:
> When modifying IPv4 devconf values using netlink for some relevant
> fields the rt_cache_flush() call was missing. In addition, if forwarding
> is enabled on the interface then disable LRO.
>
> This is needed to avoid possible connectivity issues and ease the
> responsabilities of user space tools.
>
> Fixes: 9f0f7272ac95 ("ipv4: AF_INET link address family")
> Signed-off-by: Fernando Fernandez Mancera <fmancera@suse.de>
> ---
> net/ipv4/devinet.c | 23 ++++++++++++++++++++++-
> 1 file changed, 22 insertions(+), 1 deletion(-)
>
> diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c
> index 590c68e979f5..9f55c13a9c1f 100644
> --- a/net/ipv4/devinet.c
> +++ b/net/ipv4/devinet.c
> @@ -2159,6 +2159,8 @@ static int inet_set_link_af(struct net_device *dev, const struct nlattr *nla,
> {
> struct in_device *in_dev = __in_dev_get_rtnl(dev);
> struct nlattr *a, *tb[IFLA_INET_MAX+1];
> + struct net *net = dev_net(in_dev->dev);
> + bool flush_cache = false;
> int rem;
>
> if (!in_dev)
Hi Fernando,
Here it is assumed that in_dev may be NULL.
But a few lines above it is now dereferenced unconditionally.
Flagged by Smatch.
--
pw-bot: cr
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH 2/2 net-next] ipv4: bump rt_genid when a relevant devconf value changes through netlink
2026-02-24 17:19 ` Simon Horman
@ 2026-02-24 21:15 ` Fernando Fernandez Mancera
0 siblings, 0 replies; 4+ messages in thread
From: Fernando Fernandez Mancera @ 2026-02-24 21:15 UTC (permalink / raw)
To: Simon Horman; +Cc: netdev, davem, dsahern, edumazet, kuba, pabeni, tgraf
On 2/24/26 6:19 PM, Simon Horman wrote:
> On Mon, Feb 23, 2026 at 04:30:45PM +0100, Fernando Fernandez Mancera wrote:
>> When modifying IPv4 devconf values using netlink for some relevant
>> fields the rt_cache_flush() call was missing. In addition, if forwarding
>> is enabled on the interface then disable LRO.
>>
>> This is needed to avoid possible connectivity issues and ease the
>> responsabilities of user space tools.
>>
>> Fixes: 9f0f7272ac95 ("ipv4: AF_INET link address family")
>> Signed-off-by: Fernando Fernandez Mancera <fmancera@suse.de>
>> ---
>> net/ipv4/devinet.c | 23 ++++++++++++++++++++++-
>> 1 file changed, 22 insertions(+), 1 deletion(-)
>>
>> diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c
>> index 590c68e979f5..9f55c13a9c1f 100644
>> --- a/net/ipv4/devinet.c
>> +++ b/net/ipv4/devinet.c
>> @@ -2159,6 +2159,8 @@ static int inet_set_link_af(struct net_device *dev, const struct nlattr *nla,
>> {
>> struct in_device *in_dev = __in_dev_get_rtnl(dev);
>> struct nlattr *a, *tb[IFLA_INET_MAX+1];
>> + struct net *net = dev_net(in_dev->dev);
>> + bool flush_cache = false;
>> int rem;
>>
>> if (!in_dev)
>
> Hi Fernando,
>
> Here it is assumed that in_dev may be NULL.
> But a few lines above it is now dereferenced unconditionally.
>
> Flagged by Smatch.
>
Whoops. My bad. Thank you Simon.
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2026-02-24 21:15 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-02-23 15:30 [PATCH 1/2 net-next] ipv4: validate IPV4_DEVCONF attributes properly Fernando Fernandez Mancera
2026-02-23 15:30 ` [PATCH 2/2 net-next] ipv4: bump rt_genid when a relevant devconf value changes through netlink Fernando Fernandez Mancera
2026-02-24 17:19 ` Simon Horman
2026-02-24 21:15 ` Fernando Fernandez Mancera
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox