forked from Minki/linux
net: dsa: don't assign an error value to tag_ops
Use a temporary variable to hold the return value from
dsa_tag_driver_get() instead of assigning it to dst->tag_ops. Leaving
an error value in dst->tag_ops can result in deferencing an invalid
pointer when a deferred switch configuration happens later.
Fixes: 357f203bb3
("net: dsa: keep a copy of the tagging protocol in the DSA switch tree")
Signed-off-by: George McCollister <george.mccollister@gmail.com>
Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
8fb16e80cb
commit
e0c755a45f
@ -1066,6 +1066,7 @@ static int dsa_port_parse_cpu(struct dsa_port *dp, struct net_device *master)
|
||||
{
|
||||
struct dsa_switch *ds = dp->ds;
|
||||
struct dsa_switch_tree *dst = ds->dst;
|
||||
const struct dsa_device_ops *tag_ops;
|
||||
enum dsa_tag_protocol tag_protocol;
|
||||
|
||||
tag_protocol = dsa_get_tag_protocol(dp, master);
|
||||
@ -1080,14 +1081,16 @@ static int dsa_port_parse_cpu(struct dsa_port *dp, struct net_device *master)
|
||||
* nothing to do here.
|
||||
*/
|
||||
} else {
|
||||
dst->tag_ops = dsa_tag_driver_get(tag_protocol);
|
||||
if (IS_ERR(dst->tag_ops)) {
|
||||
if (PTR_ERR(dst->tag_ops) == -ENOPROTOOPT)
|
||||
tag_ops = dsa_tag_driver_get(tag_protocol);
|
||||
if (IS_ERR(tag_ops)) {
|
||||
if (PTR_ERR(tag_ops) == -ENOPROTOOPT)
|
||||
return -EPROBE_DEFER;
|
||||
dev_warn(ds->dev, "No tagger for this switch\n");
|
||||
dp->master = NULL;
|
||||
return PTR_ERR(dst->tag_ops);
|
||||
return PTR_ERR(tag_ops);
|
||||
}
|
||||
|
||||
dst->tag_ops = tag_ops;
|
||||
}
|
||||
|
||||
dp->master = master;
|
||||
|
Loading…
Reference in New Issue
Block a user