From: Ameer Hamza <hidden> Date: 2021-12-06 11:32:57
Uninitialized err variable defined in mv88e6393x_serdes_power
function may cause undefined behaviour if it is called from
mv88e6xxx_serdes_power_down context.
Addresses-Coverity: 1494644 ("Uninitialized scalar variable")
Signed-off-by: Ameer Hamza <redacted>
---
drivers/net/dsa/mv88e6xxx/serdes.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
@@ -1507,7 +1507,7 @@ int mv88e6393x_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,boolon){u8cmode=chip->ports[port].cmode;-interr;+interr=0;if(port!=0&&port!=9&&port!=10)return-EOPNOTSUPP;
From: Andrew Lunn <andrew@lunn.ch> Date: 2021-12-06 13:21:10
On Mon, Dec 06, 2021 at 04:32:19PM +0500, Ameer Hamza wrote:
quoted hunk
Uninitialized err variable defined in mv88e6393x_serdes_power
function may cause undefined behaviour if it is called from
mv88e6xxx_serdes_power_down context.
Addresses-Coverity: 1494644 ("Uninitialized scalar variable")
Signed-off-by: Ameer Hamza <redacted>
---
drivers/net/dsa/mv88e6xxx/serdes.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
@@ -1507,7 +1507,7 @@ int mv88e6393x_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,boolon){u8cmode=chip->ports[port].cmode;-interr;+interr=0;if(port!=0&&port!=9&&port!=10)return-EOPNOTSUPP;
Hi Marek
This warning likely comes from cmode not being a SERDES mode, and that
is not handles in the switch statementing. Do we want an
default:
err = EINVAL;
?
Andrew
From: Marek Behún <kabel@kernel.org> Date: 2021-12-06 22:30:24
On Mon, 6 Dec 2021 14:21:03 +0100
Andrew Lunn [off-list ref] wrote:
On Mon, Dec 06, 2021 at 04:32:19PM +0500, Ameer Hamza wrote:
quoted
Uninitialized err variable defined in mv88e6393x_serdes_power
function may cause undefined behaviour if it is called from
mv88e6xxx_serdes_power_down context.
Addresses-Coverity: 1494644 ("Uninitialized scalar variable")
Signed-off-by: Ameer Hamza <redacted>
---
drivers/net/dsa/mv88e6xxx/serdes.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
@@ -1507,7 +1507,7 @@ int mv88e6393x_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,boolon){u8cmode=chip->ports[port].cmode;-interr;+interr=0;if(port!=0&&port!=9&&port!=10)return-EOPNOTSUPP;
Hi Marek
This warning likely comes from cmode not being a SERDES mode, and that
is not handles in the switch statementing. Do we want an
default:
err = EINVAL;
?
Andrew
Hi Andrew,
currently all the .serdes_power() methods return 0 for non-serdes ports.
This is because the way it is written, these methods are not called if
there is not a serdes lane for a given port.
For this issue with err variable undefined, to fix it we should simply
set int err=0 at the beginning of mv88e6393x_serdes_power(), to make it
behave like other serdes_power() methods do in serdes.c.
But a refactor may be needed for serdes_power() methods, at least
because they are a little weird. But it should be unrelated to this fix.
In serdes.h we have static inline functions
mv88e6xxx_serdes_power_up(chip, port, lane)
mv88e6xxx_serdes_power_down(chip, port, lane)
(These simply call the serdes_power() method of chip ops, with
additional boolean argument to specify powerup/powerdown.
Also for these we first need to determine lane for a port. If lane
does not exists, these should not be called.)
In chip.c we have function
mv88e6xxx_serdes_power(chip, port, on)
(This finds if the port has a lane, and if so, calls, if on=true
mv88e6xxx_serdes_power_up()
from serdes.h, and then
mv88e6xxx_serdes_irq_request()
also from serdes.h
and if on=false, calls _irq_free() & _serdes_power_down()
)
So if I call
mv88e6xxx_serdes_power(chip, port, true)
it goes
mv88e6xxx_serdes_power_up(chip, port, lane)
chip->info->ops->serdes_power(chip, port, lane, true)
so the `on` argument is used in some places, but in other places there
are two functions instead.
Which I find a little weird.
Marek
From: Jakub Kicinski <kuba@kernel.org> Date: 2021-12-07 00:25:16
On Mon, 6 Dec 2021 23:29:53 +0100 Marek Behún wrote:
On Mon, 6 Dec 2021 14:21:03 +0100
Andrew Lunn [off-list ref] wrote:
quoted
On Mon, Dec 06, 2021 at 04:32:19PM +0500, Ameer Hamza wrote:
quoted
Uninitialized err variable defined in mv88e6393x_serdes_power
function may cause undefined behaviour if it is called from
mv88e6xxx_serdes_power_down context.
Addresses-Coverity: 1494644 ("Uninitialized scalar variable")
Signed-off-by: Ameer Hamza <redacted>
---
drivers/net/dsa/mv88e6xxx/serdes.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
@@ -1507,7 +1507,7 @@ int mv88e6393x_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,boolon){u8cmode=chip->ports[port].cmode;-interr;+interr=0;if(port!=0&&port!=9&&port!=10)return-EOPNOTSUPP;
Hi Marek
This warning likely comes from cmode not being a SERDES mode, and that
is not handles in the switch statementing. Do we want an
default:
err = EINVAL;
?
currently all the .serdes_power() methods return 0 for non-serdes ports.
This is because the way it is written, these methods are not called if
there is not a serdes lane for a given port.
For this issue with err variable undefined, to fix it we should simply
set int err=0 at the beginning of mv88e6393x_serdes_power(), to make it
behave like other serdes_power() methods do in serdes.c.
Any objections to using a default case in the switch statement, tho?
I agree with Andrew that default statement would make the reasoning
clearer than just setting the variable at the start of the function.
From: Marek Behún <kabel@kernel.org> Date: 2021-12-07 13:06:59
On Mon, 6 Dec 2021 16:25:10 -0800
Jakub Kicinski [off-list ref] wrote:
On Mon, 6 Dec 2021 23:29:53 +0100 Marek Behún wrote:
quoted
On Mon, 6 Dec 2021 14:21:03 +0100
Andrew Lunn [off-list ref] wrote:
quoted
On Mon, Dec 06, 2021 at 04:32:19PM +0500, Ameer Hamza wrote:
quoted
Uninitialized err variable defined in mv88e6393x_serdes_power
function may cause undefined behaviour if it is called from
mv88e6xxx_serdes_power_down context.
Addresses-Coverity: 1494644 ("Uninitialized scalar variable")
Signed-off-by: Ameer Hamza <redacted>
---
drivers/net/dsa/mv88e6xxx/serdes.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
@@ -1507,7 +1507,7 @@ int mv88e6393x_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,boolon){u8cmode=chip->ports[port].cmode;-interr;+interr=0;if(port!=0&&port!=9&&port!=10)return-EOPNOTSUPP;
Hi Marek
This warning likely comes from cmode not being a SERDES mode, and that
is not handles in the switch statementing. Do we want an
default:
err = EINVAL;
?
currently all the .serdes_power() methods return 0 for non-serdes ports.
This is because the way it is written, these methods are not called if
there is not a serdes lane for a given port.
For this issue with err variable undefined, to fix it we should simply
set int err=0 at the beginning of mv88e6393x_serdes_power(), to make it
behave like other serdes_power() methods do in serdes.c.
Any objections to using a default case in the switch statement, tho?
I agree with Andrew that default statement would make the reasoning
clearer than just setting the variable at the start of the function.
No objection, just that it should be done for all the serdes_power()
methods in serdes.c.
Marek
From: Ameer Hamza <hidden> Date: 2021-12-08 14:04:25
mv88e6390_serdes_power() and mv88e6393x_serdes_power() should return
with EINVAL error if cmode is undefined.
Signed-off-by: Ameer Hamza <redacted>
---
drivers/net/dsa/mv88e6xxx/serdes.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
@@ -830,7 +830,7 @@ int mv88e6390_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,boolup){u8cmode=chip->ports[port].cmode;-interr=0;+interr;switch(cmode){caseMV88E6XXX_PORT_STS_CMODE_SGMII:
@@ -842,6 +842,8 @@ int mv88e6390_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,caseMV88E6XXX_PORT_STS_CMODE_RXAUI:err=mv88e6390_serdes_power_10g(chip,lane,up);break;+default:+return-EINVAL;}if(!err&&up)
@@ -1507,7 +1509,7 @@ int mv88e6393x_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,boolon){u8cmode=chip->ports[port].cmode;-interr=0;+interr;if(port!=0&&port!=9&&port!=10)return-EOPNOTSUPP;
@@ -1541,6 +1543,8 @@ int mv88e6393x_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,caseMV88E6393X_PORT_STS_CMODE_10GBASER:err=mv88e6390_serdes_power_10g(chip,lane,on);break;+default:+return-EINVAL;}if(err)
From: Ameer Hamza <hidden> Date: 2021-12-08 14:10:07
On Wed, Dec 08, 2021 at 07:04:13PM +0500, Ameer Hamza wrote:
quoted hunk
mv88e6390_serdes_power() and mv88e6393x_serdes_power() should return
with EINVAL error if cmode is undefined.
Signed-off-by: Ameer Hamza <redacted>
---
drivers/net/dsa/mv88e6xxx/serdes.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
@@ -830,7 +830,7 @@ int mv88e6390_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,boolup){u8cmode=chip->ports[port].cmode;-interr=0;+interr;switch(cmode){caseMV88E6XXX_PORT_STS_CMODE_SGMII:
@@ -842,6 +842,8 @@ int mv88e6390_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,caseMV88E6XXX_PORT_STS_CMODE_RXAUI:err=mv88e6390_serdes_power_10g(chip,lane,up);break;+default:+return-EINVAL;}if(!err&&up)
@@ -1507,7 +1509,7 @@ int mv88e6393x_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,boolon){u8cmode=chip->ports[port].cmode;-interr=0;+interr;if(port!=0&&port!=9&&port!=10)return-EOPNOTSUPP;
@@ -1541,6 +1543,8 @@ int mv88e6393x_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,caseMV88E6393X_PORT_STS_CMODE_10GBASER:err=mv88e6390_serdes_power_10g(chip,lane,on);break;+default:+return-EINVAL;}if(err)
--
2.25.1
Hi Marek,
I checked serdes.c and I found two methods mv88e6390_serdes_power() and
mv88e6390_serdes_power() that were not returning ENINVAL in case of
undefined cmode. Would be appreciated if you can review the patch
please.
Best Regards,
Ameer Hamza.
From: Jakub Kicinski <kuba@kernel.org> Date: 2021-12-08 15:04:48
On Wed, 8 Dec 2021 19:09:57 +0500 Ameer Hamza wrote:
I checked serdes.c and I found two methods mv88e6390_serdes_power() and
mv88e6390_serdes_power() that were not returning ENINVAL in case of
undefined cmode. Would be appreciated if you can review the patch
please.
A note for the future - please put more info into the commit
message, it shouldn't be necessary to send a follow up email
with the explanation.
From: Marek Behún <kabel@kernel.org> Date: 2021-12-08 15:40:55
On Wed, 8 Dec 2021 19:04:13 +0500
Ameer Hamza [off-list ref] wrote:
quoted hunk
mv88e6390_serdes_power() and mv88e6393x_serdes_power() should return
with EINVAL error if cmode is undefined.
Signed-off-by: Ameer Hamza <redacted>
---
drivers/net/dsa/mv88e6xxx/serdes.c | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
@@ -830,7 +830,7 @@ int mv88e6390_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,boolup){u8cmode=chip->ports[port].cmode;-interr=0;+interr;switch(cmode){caseMV88E6XXX_PORT_STS_CMODE_SGMII:
@@ -842,6 +842,8 @@ int mv88e6390_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,caseMV88E6XXX_PORT_STS_CMODE_RXAUI:err=mv88e6390_serdes_power_10g(chip,lane,up);break;+default:+return-EINVAL;}if(!err&&up)
@@ -1507,7 +1509,7 @@ int mv88e6393x_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,boolon){u8cmode=chip->ports[port].cmode;-interr=0;+interr;if(port!=0&&port!=9&&port!=10)return-EOPNOTSUPP;
@@ -1541,6 +1543,8 @@ int mv88e6393x_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,caseMV88E6393X_PORT_STS_CMODE_10GBASER:err=mv88e6390_serdes_power_10g(chip,lane,on);break;+default:+return-EINVAL;}if(err)
please make it err = -EINVAL instead of direct return, so that we can
check in the code after and handle the error case.
Marek
From: Ameer Hamza <hidden> Date: 2021-12-08 15:58:21
Added default case to handle undefined cmode scenario in
mv88e6393x_serdes_power() and mv88e6393x_serdes_power() methods.
Signed-off-by: Ameer Hamza <redacted>
---
Changes in v3:
make err = -EINVAL instead of direct return, so that we can
check in the code after and handle the error case.
---
drivers/net/dsa/mv88e6xxx/serdes.c | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
@@ -830,7 +830,7 @@ int mv88e6390_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,boolup){u8cmode=chip->ports[port].cmode;-interr=0;+interr;switch(cmode){caseMV88E6XXX_PORT_STS_CMODE_SGMII:
@@ -842,6 +842,9 @@ int mv88e6390_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,caseMV88E6XXX_PORT_STS_CMODE_RXAUI:err=mv88e6390_serdes_power_10g(chip,lane,up);break;+default:+err=-EINVAL;+break;}if(!err&&up)
@@ -1507,7 +1510,7 @@ int mv88e6393x_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,boolon){u8cmode=chip->ports[port].cmode;-interr=0;+interr;if(port!=0&&port!=9&&port!=10)return-EOPNOTSUPP;
@@ -1541,6 +1544,9 @@ int mv88e6393x_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,caseMV88E6393X_PORT_STS_CMODE_10GBASER:err=mv88e6390_serdes_power_10g(chip,lane,on);break;+default:+err=-EINVAL;+break;}if(err)
From: Marek Behún <kabel@kernel.org> Date: 2021-12-08 16:18:35
On Wed, 8 Dec 2021 20:58:09 +0500
Ameer Hamza [off-list ref] wrote:
Added default case to handle undefined cmode scenario in
mv88e6393x_serdes_power() and mv88e6393x_serdes_power() methods.
Signed-off-by: Ameer Hamza <redacted>
---
From: Jakub Kicinski <kuba@kernel.org> Date: 2021-12-09 01:28:27
On Wed, 8 Dec 2021 20:58:09 +0500 Ameer Hamza wrote:
quoted hunk
@@ -1507,7 +1510,7 @@ int mv88e6393x_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane, bool on) { u8 cmode = chip->ports[port].cmode;- int err = 0;+ int err; if (port != 0 && port != 9 && port != 10) return -EOPNOTSUPP;
This is on top of v1? It doesn't seem to apply, v1 was not merged.
Also can you please add Fixes tags?
From: Ameer Hamza <hidden> Date: 2021-12-09 04:06:22
On Wed, Dec 08, 2021 at 05:28:20PM -0800, Jakub Kicinski wrote:
On Wed, 8 Dec 2021 20:58:09 +0500 Ameer Hamza wrote:
quoted
@@ -1507,7 +1510,7 @@ int mv88e6393x_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane, bool on) { u8 cmode = chip->ports[port].cmode;- int err = 0;+ int err; if (port != 0 && port != 9 && port != 10) return -EOPNOTSUPP;
This is on top of v1? It doesn't seem to apply, v1 was not merged.
Oh, sorry! Its not incremental but I think my repository was a
few commits old. Let me send the updated patch.
@@ -830,7 +830,7 @@ int mv88e6390_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,boolup){u8cmode=chip->ports[port].cmode;-interr=0;+interr;switch(cmode){caseMV88E6XXX_PORT_STS_CMODE_SGMII:
@@ -842,6 +842,9 @@ int mv88e6390_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,caseMV88E6XXX_PORT_STS_CMODE_RXAUI:err=mv88e6390_serdes_power_10g(chip,lane,up);break;+default:+err=-EINVAL;+break;}if(!err&&up)
@@ -1541,6 +1544,9 @@ int mv88e6393x_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,caseMV88E6393X_PORT_STS_CMODE_10GBASER:err=mv88e6390_serdes_power_10g(chip,lane,on);break;+default:+err=-EINVAL;+break;}if(err)
@@ -830,7 +830,7 @@ int mv88e6390_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,boolup){u8cmode=chip->ports[port].cmode;-interr=0;+interr;switch(cmode){caseMV88E6XXX_PORT_STS_CMODE_SGMII:
@@ -842,6 +842,9 @@ int mv88e6390_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,caseMV88E6XXX_PORT_STS_CMODE_RXAUI:err=mv88e6390_serdes_power_10g(chip,lane,up);break;+default:+err=-EINVAL;+break;}if(!err&&up)
@@ -1541,6 +1544,9 @@ int mv88e6393x_serdes_power(struct mv88e6xxx_chip *chip, int port, int lane,caseMV88E6393X_PORT_STS_CMODE_10GBASER:err=mv88e6390_serdes_power_10g(chip,lane,on);break;+default:+err=-EINVAL;+break;}if(err)
Hello:
This patch was applied to netdev/net.git (master)
by Jakub Kicinski [off-list ref]:
On Thu, 9 Dec 2021 09:15:52 +0500 you wrote:
Added default case to handle undefined cmode scenario in
mv88e6393x_serdes_power() and mv88e6393x_serdes_power() methods.
Addresses-Coverity: 1494644 ("Uninitialized scalar variable")
Fixes: 21635d9203e1c (net: dsa: mv88e6xxx: Fix application of erratum 4.8 for 88E6393X)
Reviewed-by: Marek Behún <kabel@kernel.org>
Signed-off-by: Ameer Hamza <redacted>
[...]