diff mbox series

[v2] mtd: nand: arasan: Fix the crash caused by use after free

Message ID 20240306033404.18537-1-venkatesh.abbarapu@amd.com
State Accepted
Commit 0508653ea65d7b708053c5cb6c2fb8632f68c885
Delegated to: Dario Binacchi
Headers show
Series [v2] mtd: nand: arasan: Fix the crash caused by use after free | expand

Commit Message

Venkatesh Yadav Abbarapu March 6, 2024, 3:34 a.m. UTC
The below exception observed on QEMU, as it doesn't support
NAND controller.

"Synchronous Abort" handler, esr 0x96000005, far 0x17acfc878
elr: 000000000803ad40 lr : 000000000805f438 (reloc)
elr: 000000007fcb4d40 lr : 000000007fcd9438
x0 : 000000007bbfc880 x1 : 00000000ff100000
x2 : 000000007fcf059c x3 : 000000007bbfc870
x4 : 000000007fd9a388 x5 : 000000017acfc870
x6 : 0000000000000000 x7 : 000000007bbfd0e0
x8 : 0000000000003dd4 x9 : 000000007bbeec0c
x10: 0000000000000001 x11: 0000000000003f8c
x12: 000000007bbeecfc x13: 000000007bbeeeb0
x14: 000000007bbeeeb0 x15: 000000007bbee474
x16: 000000007fcef18c x17: 0000000000000000
x18: 000000007bbf9d70 x19: 000000007bbfc888
x20: 000000007bbfc870 x21: 000000007fd68ddb
x22: 00000000ffffffed x23: 000000007bbfc878
x24: 0000000000000000 x25: 0000000000000000
x26: 0000000000000000 x27: 0000000000000000
x28: 0000000000000000 x29: 000000007bbeed10

Code: 927ff8c1 924000c6 8b010065 f9400887 (f94004a2)
Resetting CPU ...

The crash is caused by the use after free.
Updating the correct return codes rather than hardcoding.
Fixes: 3dd0f8cccd6d ("mtd: nand: Remove hardcoded base address of nand")

Signed-off-by: Venkatesh Yadav Abbarapu <venkatesh.abbarapu@amd.com>
---
Changes in v2:
- Updated the commit description.
---
 drivers/mtd/nand/raw/arasan_nfc.c | 27 ++++++++++++++-------------
 1 file changed, 14 insertions(+), 13 deletions(-)

Comments

Michal Simek March 12, 2024, 3:09 p.m. UTC | #1
On 3/6/24 04:34, Venkatesh Yadav Abbarapu wrote:
> The below exception observed on QEMU, as it doesn't support
> NAND controller.
> 
> "Synchronous Abort" handler, esr 0x96000005, far 0x17acfc878
> elr: 000000000803ad40 lr : 000000000805f438 (reloc)
> elr: 000000007fcb4d40 lr : 000000007fcd9438
> x0 : 000000007bbfc880 x1 : 00000000ff100000
> x2 : 000000007fcf059c x3 : 000000007bbfc870
> x4 : 000000007fd9a388 x5 : 000000017acfc870
> x6 : 0000000000000000 x7 : 000000007bbfd0e0
> x8 : 0000000000003dd4 x9 : 000000007bbeec0c
> x10: 0000000000000001 x11: 0000000000003f8c
> x12: 000000007bbeecfc x13: 000000007bbeeeb0
> x14: 000000007bbeeeb0 x15: 000000007bbee474
> x16: 000000007fcef18c x17: 0000000000000000
> x18: 000000007bbf9d70 x19: 000000007bbfc888
> x20: 000000007bbfc870 x21: 000000007fd68ddb
> x22: 00000000ffffffed x23: 000000007bbfc878
> x24: 0000000000000000 x25: 0000000000000000
> x26: 0000000000000000 x27: 0000000000000000
> x28: 0000000000000000 x29: 000000007bbeed10
> 
> Code: 927ff8c1 924000c6 8b010065 f9400887 (f94004a2)
> Resetting CPU ...
> 
> The crash is caused by the use after free.
> Updating the correct return codes rather than hardcoding.
> Fixes: 3dd0f8cccd6d ("mtd: nand: Remove hardcoded base address of nand")
> 
> Signed-off-by: Venkatesh Yadav Abbarapu <venkatesh.abbarapu@amd.com>
> ---
> Changes in v2:
> - Updated the commit description.
> ---
>   drivers/mtd/nand/raw/arasan_nfc.c | 27 ++++++++++++++-------------
>   1 file changed, 14 insertions(+), 13 deletions(-)
> 
> diff --git a/drivers/mtd/nand/raw/arasan_nfc.c b/drivers/mtd/nand/raw/arasan_nfc.c
> index 0b1b91f771..ffcd963b3d 100644
> --- a/drivers/mtd/nand/raw/arasan_nfc.c
> +++ b/drivers/mtd/nand/raw/arasan_nfc.c
> @@ -1232,7 +1232,7 @@ static int arasan_probe(struct udevice *dev)
>   	struct nand_config *nand = &info->config;
>   	struct mtd_info *mtd;
>   	ofnode child;
> -	int err = -1;
> +	int ret;
>   	const char *str;
>   
>   	info->reg = dev_read_addr_ptr(dev);
> @@ -1259,9 +1259,10 @@ static int arasan_probe(struct udevice *dev)
>   	writel(0x0, &info->reg->pgm_reg);
>   
>   	/* first scan to find the device and get the page size */
> -	if (nand_scan_ident(mtd, CONFIG_SYS_NAND_MAX_CHIPS, NULL)) {
> +	ret = nand_scan_ident(mtd, CONFIG_SYS_NAND_MAX_CHIPS, NULL);
> +	if (ret) {
>   		printf("%s: nand_scan_ident failed\n", __func__);
> -		goto fail;
> +		return ret;
>   	}
>   
>   	str = ofnode_read_string(nand_chip->flash_node, "nand-ecc-mode");
> @@ -1289,26 +1290,26 @@ static int arasan_probe(struct udevice *dev)
>   		nand_chip->ecc.bytes = 0;
>   		nand_chip->ecc.layout = &ondie_nand_oob_64;
>   	} else {
> -		if (arasan_nand_ecc_init(mtd)) {
> +		ret = arasan_nand_ecc_init(mtd);
> +		if (ret) {
>   			printf("%s: nand_ecc_init failed\n", __func__);
> -			goto fail;
> +			return ret;
>   		}
>   	}
>   
> -	if (nand_scan_tail(mtd)) {
> +	ret = nand_scan_tail(mtd);
> +	if (ret) {
>   		printf("%s: nand_scan_tail failed\n", __func__);
> -		goto fail;
> +		return ret;
>   	}
>   
> -	if (nand_register(0, mtd)) {
> +	ret = nand_register(0, mtd);
> +	if (ret) {
>   		printf("Nand Register Fail\n");
> -		goto fail;
> +		return ret;
>   	}
>   
> -	return 0;
> -fail:
> -	free(nand);
> -	return err;
> +	return ret;
>   }
>   
>   static const struct udevice_id arasan_nand_dt_ids[] = {

Applied.
M
diff mbox series

Patch

diff --git a/drivers/mtd/nand/raw/arasan_nfc.c b/drivers/mtd/nand/raw/arasan_nfc.c
index 0b1b91f771..ffcd963b3d 100644
--- a/drivers/mtd/nand/raw/arasan_nfc.c
+++ b/drivers/mtd/nand/raw/arasan_nfc.c
@@ -1232,7 +1232,7 @@  static int arasan_probe(struct udevice *dev)
 	struct nand_config *nand = &info->config;
 	struct mtd_info *mtd;
 	ofnode child;
-	int err = -1;
+	int ret;
 	const char *str;
 
 	info->reg = dev_read_addr_ptr(dev);
@@ -1259,9 +1259,10 @@  static int arasan_probe(struct udevice *dev)
 	writel(0x0, &info->reg->pgm_reg);
 
 	/* first scan to find the device and get the page size */
-	if (nand_scan_ident(mtd, CONFIG_SYS_NAND_MAX_CHIPS, NULL)) {
+	ret = nand_scan_ident(mtd, CONFIG_SYS_NAND_MAX_CHIPS, NULL);
+	if (ret) {
 		printf("%s: nand_scan_ident failed\n", __func__);
-		goto fail;
+		return ret;
 	}
 
 	str = ofnode_read_string(nand_chip->flash_node, "nand-ecc-mode");
@@ -1289,26 +1290,26 @@  static int arasan_probe(struct udevice *dev)
 		nand_chip->ecc.bytes = 0;
 		nand_chip->ecc.layout = &ondie_nand_oob_64;
 	} else {
-		if (arasan_nand_ecc_init(mtd)) {
+		ret = arasan_nand_ecc_init(mtd);
+		if (ret) {
 			printf("%s: nand_ecc_init failed\n", __func__);
-			goto fail;
+			return ret;
 		}
 	}
 
-	if (nand_scan_tail(mtd)) {
+	ret = nand_scan_tail(mtd);
+	if (ret) {
 		printf("%s: nand_scan_tail failed\n", __func__);
-		goto fail;
+		return ret;
 	}
 
-	if (nand_register(0, mtd)) {
+	ret = nand_register(0, mtd);
+	if (ret) {
 		printf("Nand Register Fail\n");
-		goto fail;
+		return ret;
 	}
 
-	return 0;
-fail:
-	free(nand);
-	return err;
+	return ret;
 }
 
 static const struct udevice_id arasan_nand_dt_ids[] = {