All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] net: stmmac: dwmac-rk: fix oob read in rk_gmac_setup
@ 2021-12-14 19:10 ` John Keeping
  0 siblings, 0 replies; 6+ messages in thread
From: John Keeping @ 2021-12-14 19:10 UTC (permalink / raw)
  To: netdev
  Cc: linux-rockchip, John Keeping, Giuseppe Cavallaro,
	Alexandre Torgue, Jose Abreu, David S. Miller, Jakub Kicinski,
	Maxime Coquelin, David Wu, Ezequiel Garcia, linux-stm32,
	linux-arm-kernel, linux-kernel

KASAN reports an out-of-bounds read in rk_gmac_setup on the line:

	while (ops->regs[i]) {

This happens for most platforms since the regs flexible array member is
empty, so the memory after the ops structure is being read here.  It
seems that mostly this happens to contain zero anyway, so we get lucky
and everything still works.

To avoid adding redundant data to nearly all the ops structures, add a
new flag to indicate whether the regs field is valid and avoid this loop
when it is not.

Fixes: 3bb3d6b1c195 ("net: stmmac: Add RK3566/RK3568 SoC support")
Signed-off-by: John Keeping <john@metanate.com>
---
 drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
index 6924a6aacbd5..c469abc91fa1 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
@@ -33,6 +33,7 @@ struct rk_gmac_ops {
 	void (*set_rgmii_speed)(struct rk_priv_data *bsp_priv, int speed);
 	void (*set_rmii_speed)(struct rk_priv_data *bsp_priv, int speed);
 	void (*integrated_phy_powerup)(struct rk_priv_data *bsp_priv);
+	bool regs_valid;
 	u32 regs[];
 };
 
@@ -1092,6 +1093,7 @@ static const struct rk_gmac_ops rk3568_ops = {
 	.set_to_rmii = rk3568_set_to_rmii,
 	.set_rgmii_speed = rk3568_set_gmac_speed,
 	.set_rmii_speed = rk3568_set_gmac_speed,
+	.regs_valid = true,
 	.regs = {
 		0xfe2a0000, /* gmac0 */
 		0xfe010000, /* gmac1 */
@@ -1383,7 +1385,7 @@ static struct rk_priv_data *rk_gmac_setup(struct platform_device *pdev,
 	 * to be distinguished.
 	 */
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-	if (res) {
+	if (res && ops->regs_valid) {
 		int i = 0;
 
 		while (ops->regs[i]) {
-- 
2.34.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH] net: stmmac: dwmac-rk: fix oob read in rk_gmac_setup
@ 2021-12-14 19:10 ` John Keeping
  0 siblings, 0 replies; 6+ messages in thread
From: John Keeping @ 2021-12-14 19:10 UTC (permalink / raw)
  To: netdev
  Cc: linux-rockchip, John Keeping, Giuseppe Cavallaro,
	Alexandre Torgue, Jose Abreu, David S. Miller, Jakub Kicinski,
	Maxime Coquelin, David Wu, Ezequiel Garcia, linux-stm32,
	linux-arm-kernel, linux-kernel

KASAN reports an out-of-bounds read in rk_gmac_setup on the line:

	while (ops->regs[i]) {

This happens for most platforms since the regs flexible array member is
empty, so the memory after the ops structure is being read here.  It
seems that mostly this happens to contain zero anyway, so we get lucky
and everything still works.

To avoid adding redundant data to nearly all the ops structures, add a
new flag to indicate whether the regs field is valid and avoid this loop
when it is not.

Fixes: 3bb3d6b1c195 ("net: stmmac: Add RK3566/RK3568 SoC support")
Signed-off-by: John Keeping <john@metanate.com>
---
 drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
index 6924a6aacbd5..c469abc91fa1 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
@@ -33,6 +33,7 @@ struct rk_gmac_ops {
 	void (*set_rgmii_speed)(struct rk_priv_data *bsp_priv, int speed);
 	void (*set_rmii_speed)(struct rk_priv_data *bsp_priv, int speed);
 	void (*integrated_phy_powerup)(struct rk_priv_data *bsp_priv);
+	bool regs_valid;
 	u32 regs[];
 };
 
@@ -1092,6 +1093,7 @@ static const struct rk_gmac_ops rk3568_ops = {
 	.set_to_rmii = rk3568_set_to_rmii,
 	.set_rgmii_speed = rk3568_set_gmac_speed,
 	.set_rmii_speed = rk3568_set_gmac_speed,
+	.regs_valid = true,
 	.regs = {
 		0xfe2a0000, /* gmac0 */
 		0xfe010000, /* gmac1 */
@@ -1383,7 +1385,7 @@ static struct rk_priv_data *rk_gmac_setup(struct platform_device *pdev,
 	 * to be distinguished.
 	 */
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-	if (res) {
+	if (res && ops->regs_valid) {
 		int i = 0;
 
 		while (ops->regs[i]) {
-- 
2.34.1


_______________________________________________
Linux-rockchip mailing list
Linux-rockchip@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH] net: stmmac: dwmac-rk: fix oob read in rk_gmac_setup
@ 2021-12-14 19:10 ` John Keeping
  0 siblings, 0 replies; 6+ messages in thread
From: John Keeping @ 2021-12-14 19:10 UTC (permalink / raw)
  To: netdev
  Cc: linux-rockchip, John Keeping, Giuseppe Cavallaro,
	Alexandre Torgue, Jose Abreu, David S. Miller, Jakub Kicinski,
	Maxime Coquelin, David Wu, Ezequiel Garcia, linux-stm32,
	linux-arm-kernel, linux-kernel

KASAN reports an out-of-bounds read in rk_gmac_setup on the line:

	while (ops->regs[i]) {

This happens for most platforms since the regs flexible array member is
empty, so the memory after the ops structure is being read here.  It
seems that mostly this happens to contain zero anyway, so we get lucky
and everything still works.

To avoid adding redundant data to nearly all the ops structures, add a
new flag to indicate whether the regs field is valid and avoid this loop
when it is not.

Fixes: 3bb3d6b1c195 ("net: stmmac: Add RK3566/RK3568 SoC support")
Signed-off-by: John Keeping <john@metanate.com>
---
 drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
index 6924a6aacbd5..c469abc91fa1 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
@@ -33,6 +33,7 @@ struct rk_gmac_ops {
 	void (*set_rgmii_speed)(struct rk_priv_data *bsp_priv, int speed);
 	void (*set_rmii_speed)(struct rk_priv_data *bsp_priv, int speed);
 	void (*integrated_phy_powerup)(struct rk_priv_data *bsp_priv);
+	bool regs_valid;
 	u32 regs[];
 };
 
@@ -1092,6 +1093,7 @@ static const struct rk_gmac_ops rk3568_ops = {
 	.set_to_rmii = rk3568_set_to_rmii,
 	.set_rgmii_speed = rk3568_set_gmac_speed,
 	.set_rmii_speed = rk3568_set_gmac_speed,
+	.regs_valid = true,
 	.regs = {
 		0xfe2a0000, /* gmac0 */
 		0xfe010000, /* gmac1 */
@@ -1383,7 +1385,7 @@ static struct rk_priv_data *rk_gmac_setup(struct platform_device *pdev,
 	 * to be distinguished.
 	 */
 	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-	if (res) {
+	if (res && ops->regs_valid) {
 		int i = 0;
 
 		while (ops->regs[i]) {
-- 
2.34.1


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH] net: stmmac: dwmac-rk: fix oob read in rk_gmac_setup
  2021-12-14 19:10 ` John Keeping
  (?)
@ 2021-12-16 20:51   ` patchwork-bot+netdevbpf
  -1 siblings, 0 replies; 6+ messages in thread
From: patchwork-bot+netdevbpf @ 2021-12-16 20:51 UTC (permalink / raw)
  To: John Keeping
  Cc: netdev, linux-rockchip, peppe.cavallaro, alexandre.torgue,
	joabreu, davem, kuba, mcoquelin.stm32, david.wu, ezequiel,
	linux-stm32, linux-arm-kernel, linux-kernel

Hello:

This patch was applied to netdev/net.git (master)
by David S. Miller <davem@davemloft.net>:

On Tue, 14 Dec 2021 19:10:09 +0000 you wrote:
> KASAN reports an out-of-bounds read in rk_gmac_setup on the line:
> 
> 	while (ops->regs[i]) {
> 
> This happens for most platforms since the regs flexible array member is
> empty, so the memory after the ops structure is being read here.  It
> seems that mostly this happens to contain zero anyway, so we get lucky
> and everything still works.
> 
> [...]

Here is the summary with links:
  - net: stmmac: dwmac-rk: fix oob read in rk_gmac_setup
    https://git.kernel.org/netdev/net/c/0546b224cc77

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] net: stmmac: dwmac-rk: fix oob read in rk_gmac_setup
@ 2021-12-16 20:51   ` patchwork-bot+netdevbpf
  0 siblings, 0 replies; 6+ messages in thread
From: patchwork-bot+netdevbpf @ 2021-12-16 20:51 UTC (permalink / raw)
  To: John Keeping
  Cc: netdev, linux-rockchip, peppe.cavallaro, alexandre.torgue,
	joabreu, davem, kuba, mcoquelin.stm32, david.wu, ezequiel,
	linux-stm32, linux-arm-kernel, linux-kernel

Hello:

This patch was applied to netdev/net.git (master)
by David S. Miller <davem@davemloft.net>:

On Tue, 14 Dec 2021 19:10:09 +0000 you wrote:
> KASAN reports an out-of-bounds read in rk_gmac_setup on the line:
> 
> 	while (ops->regs[i]) {
> 
> This happens for most platforms since the regs flexible array member is
> empty, so the memory after the ops structure is being read here.  It
> seems that mostly this happens to contain zero anyway, so we get lucky
> and everything still works.
> 
> [...]

Here is the summary with links:
  - net: stmmac: dwmac-rk: fix oob read in rk_gmac_setup
    https://git.kernel.org/netdev/net/c/0546b224cc77

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



_______________________________________________
Linux-rockchip mailing list
Linux-rockchip@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-rockchip

^ permalink raw reply	[flat|nested] 6+ messages in thread

* Re: [PATCH] net: stmmac: dwmac-rk: fix oob read in rk_gmac_setup
@ 2021-12-16 20:51   ` patchwork-bot+netdevbpf
  0 siblings, 0 replies; 6+ messages in thread
From: patchwork-bot+netdevbpf @ 2021-12-16 20:51 UTC (permalink / raw)
  To: John Keeping
  Cc: netdev, linux-rockchip, peppe.cavallaro, alexandre.torgue,
	joabreu, davem, kuba, mcoquelin.stm32, david.wu, ezequiel,
	linux-stm32, linux-arm-kernel, linux-kernel

Hello:

This patch was applied to netdev/net.git (master)
by David S. Miller <davem@davemloft.net>:

On Tue, 14 Dec 2021 19:10:09 +0000 you wrote:
> KASAN reports an out-of-bounds read in rk_gmac_setup on the line:
> 
> 	while (ops->regs[i]) {
> 
> This happens for most platforms since the regs flexible array member is
> empty, so the memory after the ops structure is being read here.  It
> seems that mostly this happens to contain zero anyway, so we get lucky
> and everything still works.
> 
> [...]

Here is the summary with links:
  - net: stmmac: dwmac-rk: fix oob read in rk_gmac_setup
    https://git.kernel.org/netdev/net/c/0546b224cc77

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2021-12-16 20:53 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-12-14 19:10 [PATCH] net: stmmac: dwmac-rk: fix oob read in rk_gmac_setup John Keeping
2021-12-14 19:10 ` John Keeping
2021-12-14 19:10 ` John Keeping
2021-12-16 20:51 ` patchwork-bot+netdevbpf
2021-12-16 20:51   ` patchwork-bot+netdevbpf
2021-12-16 20:51   ` patchwork-bot+netdevbpf

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.