net: ethtool: Handle missing cable test TDR parameters
A last minute change put the TDR cable test parameters into a nest.
The validation is not sufficient, resulting in an oops if the nest is
missing. Set default values first, then update them if the nest is
provided.
Fixes: f2bc8ad31a
("net: ethtool: Allow PHY cable test TDR data to configured")
Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
54cc017c21
commit
4b973f4983
|
@ -234,6 +234,14 @@ static int ethnl_act_cable_test_tdr_cfg(const struct nlattr *nest,
|
||||||
struct nlattr *tb[ETHTOOL_A_CABLE_TEST_TDR_CFG_MAX + 1];
|
struct nlattr *tb[ETHTOOL_A_CABLE_TEST_TDR_CFG_MAX + 1];
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
cfg->first = 100;
|
||||||
|
cfg->step = 100;
|
||||||
|
cfg->last = MAX_CABLE_LENGTH_CM;
|
||||||
|
cfg->pair = PHY_PAIR_ALL;
|
||||||
|
|
||||||
|
if (!nest)
|
||||||
|
return 0;
|
||||||
|
|
||||||
ret = nla_parse_nested(tb, ETHTOOL_A_CABLE_TEST_TDR_CFG_MAX, nest,
|
ret = nla_parse_nested(tb, ETHTOOL_A_CABLE_TEST_TDR_CFG_MAX, nest,
|
||||||
cable_test_tdr_act_cfg_policy, info->extack);
|
cable_test_tdr_act_cfg_policy, info->extack);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
|
@ -242,17 +250,12 @@ static int ethnl_act_cable_test_tdr_cfg(const struct nlattr *nest,
|
||||||
if (tb[ETHTOOL_A_CABLE_TEST_TDR_CFG_FIRST])
|
if (tb[ETHTOOL_A_CABLE_TEST_TDR_CFG_FIRST])
|
||||||
cfg->first = nla_get_u32(
|
cfg->first = nla_get_u32(
|
||||||
tb[ETHTOOL_A_CABLE_TEST_TDR_CFG_FIRST]);
|
tb[ETHTOOL_A_CABLE_TEST_TDR_CFG_FIRST]);
|
||||||
else
|
|
||||||
cfg->first = 100;
|
|
||||||
if (tb[ETHTOOL_A_CABLE_TEST_TDR_CFG_LAST])
|
if (tb[ETHTOOL_A_CABLE_TEST_TDR_CFG_LAST])
|
||||||
cfg->last = nla_get_u32(tb[ETHTOOL_A_CABLE_TEST_TDR_CFG_LAST]);
|
cfg->last = nla_get_u32(tb[ETHTOOL_A_CABLE_TEST_TDR_CFG_LAST]);
|
||||||
else
|
|
||||||
cfg->last = MAX_CABLE_LENGTH_CM;
|
|
||||||
|
|
||||||
if (tb[ETHTOOL_A_CABLE_TEST_TDR_CFG_STEP])
|
if (tb[ETHTOOL_A_CABLE_TEST_TDR_CFG_STEP])
|
||||||
cfg->step = nla_get_u32(tb[ETHTOOL_A_CABLE_TEST_TDR_CFG_STEP]);
|
cfg->step = nla_get_u32(tb[ETHTOOL_A_CABLE_TEST_TDR_CFG_STEP]);
|
||||||
else
|
|
||||||
cfg->step = 100;
|
|
||||||
|
|
||||||
if (tb[ETHTOOL_A_CABLE_TEST_TDR_CFG_PAIR]) {
|
if (tb[ETHTOOL_A_CABLE_TEST_TDR_CFG_PAIR]) {
|
||||||
cfg->pair = nla_get_u8(tb[ETHTOOL_A_CABLE_TEST_TDR_CFG_PAIR]);
|
cfg->pair = nla_get_u8(tb[ETHTOOL_A_CABLE_TEST_TDR_CFG_PAIR]);
|
||||||
|
@ -263,8 +266,6 @@ static int ethnl_act_cable_test_tdr_cfg(const struct nlattr *nest,
|
||||||
"invalid pair parameter");
|
"invalid pair parameter");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
cfg->pair = PHY_PAIR_ALL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cfg->first > MAX_CABLE_LENGTH_CM) {
|
if (cfg->first > MAX_CABLE_LENGTH_CM) {
|
||||||
|
|
Loading…
Reference in New Issue