A provider index of 0xFFFFFFFF picks a provider on hardware that has
none. phc_index is an int where -1 means no PHC, and the u32 from user
space ends up as -1, so the two match.
TSINFO_GET uses -1 for "no provider requested" and answers with the
default provider instead of an error.
Reject the value in the netlink policy, which covers every comparison
site.
Fixes: b9e3f7dc9ed9 ("net: ethtool: tsinfo: Enhance tsinfo to support several hwtstamp by net topology")
Signed-off-by: Nicolai Buchwitz <nb@tipi-net.de>
---
NLA_POLICY_MAX does not fit here, .max in struct nla_policy is s16.
net/ethtool/ts.h | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
@@ -5,9 +5,15 @@#include"netlink.h"+/* phc_index is an int and -1 means no PHC, so keep the request non-negative */+staticconststructnetlink_range_validationethnl_ts_prov_index_range={+.max=INT_MAX,+};+staticconststructnla_policyethnl_ts_hwtst_prov_policy[ETHTOOL_A_TS_HWTSTAMP_PROVIDER_MAX+1]={-[ETHTOOL_A_TS_HWTSTAMP_PROVIDER_INDEX]={.type=NLA_U32},+[ETHTOOL_A_TS_HWTSTAMP_PROVIDER_INDEX]=+NLA_POLICY_FULL_RANGE(NLA_U32,ðnl_ts_prov_index_range),[ETHTOOL_A_TS_HWTSTAMP_PROVIDER_QUALIFIER]=NLA_POLICY_MAX(NLA_U32,HWTSTAMP_PROVIDER_QUALIFIER_CNT-1)};
A provider index of 0xFFFFFFFF picks a provider on hardware that has
none. phc_index is an int where -1 means no PHC, and the u32 from user
space ends up as -1, so the two match.
TSINFO_GET uses -1 for "no provider requested" and answers with the
default provider instead of an error.
Reject the value in the netlink policy, which covers every comparison
site.
Fixes: b9e3f7dc9ed9 ("net: ethtool: tsinfo: Enhance tsinfo to support several hwtstamp by net topology")
Signed-off-by: Nicolai Buchwitz <nb@tipi-net.de>
---
NLA_POLICY_MAX does not fit here, .max in struct nla_policy is s16.
net/ethtool/ts.h | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
@@ -5,9 +5,15 @@#include"netlink.h"+/* phc_index is an int and -1 means no PHC, so keep the request non-negative */+staticconststructnetlink_range_validationethnl_ts_prov_index_range={+.max=INT_MAX,+};+staticconststructnla_policyethnl_ts_hwtst_prov_policy[ETHTOOL_A_TS_HWTSTAMP_PROVIDER_MAX+1]={-[ETHTOOL_A_TS_HWTSTAMP_PROVIDER_INDEX]={.type=NLA_U32},+[ETHTOOL_A_TS_HWTSTAMP_PROVIDER_INDEX]=+NLA_POLICY_FULL_RANGE(NLA_U32,ðnl_ts_prov_index_range),[ETHTOOL_A_TS_HWTSTAMP_PROVIDER_QUALIFIER]=NLA_POLICY_MAX(NLA_U32,HWTSTAMP_PROVIDER_QUALIFIER_CNT-1)};
I think you can simply do this:
[ETHTOOL_A_TS_HWTSTAMP_PROVIDER_INDEX] =
NLA_POLICY_MAX(NLA_U32, INT_MAX),
I think you can simply do this:
[ETHTOOL_A_TS_HWTSTAMP_PROVIDER_INDEX] =
NLA_POLICY_MAX(NLA_U32, INT_MAX),
That was my initial thought, but unfortunately it doesn't work. struct nla_policy's
.max is s16 and INT_MAX is truncated to -1. It ends up as U64_MAX in the range check
and in the end nothing gets rejected.
include/vdso/limits.h:8:25: warning: overflow in conversion from 'int'
to 'short int' changes value from '2147483647' to '-1' [-Woverflow]
I think you can simply do this:
[ETHTOOL_A_TS_HWTSTAMP_PROVIDER_INDEX] =
NLA_POLICY_MAX(NLA_U32, INT_MAX),
That was my initial thought, but unfortunately it doesn't work. struct nla_policy's
.max is s16 and INT_MAX is truncated to -1. It ends up as U64_MAX in the range check
and in the end nothing gets rejected.
include/vdso/limits.h:8:25: warning: overflow in conversion from 'int'
to 'short int' changes value from '2147483647' to '-1' [-Woverflow]
Indeed.
Reviewed-by: Kory Maincent <kory.maincent@bootlin.com>
Thank you!
--
Köry Maincent, Bootlin
Embedded Linux and kernel engineering
https://bootlin.com
Hello:
This series was applied to netdev/net.git (main)
by Jakub Kicinski [off-list ref]:
On Fri, 25 Sep 2026 15:52:35 +0200 you wrote:
A provider index of 0xFFFFFFFF picks a provider on hardware that has
none. phc_index is an int where -1 means no PHC, and the u32 from user
space ends up as -1, so the two match.
TSINFO_GET uses -1 for "no provider requested" and answers with the
default provider instead of an error.
[...]
Hello:
This series was applied to netdev/net-next.git (main)
by Jakub Kicinski [off-list ref]:
On Fri, 25 Sep 2026 15:52:35 +0200 you wrote:
A provider index of 0xFFFFFFFF picks a provider on hardware that has
none. phc_index is an int where -1 means no PHC, and the u32 from user
space ends up as -1, so the two match.
TSINFO_GET uses -1 for "no provider requested" and answers with the
default provider instead of an error.
[...]