diff mbox series

drivers: scsi: fix: memory leak in do_scsi_scan_one()

Message ID 20250516174020.118229-1-ant.v.moryakov@gmail.com
State Changes Requested
Delegated to: Tom Rini
Headers show
Series drivers: scsi: fix: memory leak in do_scsi_scan_one() | expand

Commit Message

Anton Moryakov May 16, 2025, 5:40 p.m. UTC
From: Anton Moryakov <ant.v.moryakov@gmail.com>

Free allocated name buffer when blk_create_devicef() fails to prevent
memory leak. After successful device creation, the name ownership is
transferred to the device structure and should not be freed manually.

Signed-off-by: Anton Moryakov <ant.v.moryakov@gmail.com>"

---
 drivers/scsi/scsi.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

Comments

Tom Rini June 4, 2025, 6:24 p.m. UTC | #1
On Fri, May 16, 2025 at 08:40:20PM +0300, ant.v.moryakov@gmail.com wrote:

> From: Anton Moryakov <ant.v.moryakov@gmail.com>
> 
> Free allocated name buffer when blk_create_devicef() fails to prevent
> memory leak. After successful device creation, the name ownership is
> transferred to the device structure and should not be freed manually.
> 
> Signed-off-by: Anton Moryakov <ant.v.moryakov@gmail.com>"
> ---
>  drivers/scsi/scsi.c | 4 +++-
>  1 file changed, 3 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
> index cd0b84c0622..a9e364d3fdb 100644
> --- a/drivers/scsi/scsi.c
> +++ b/drivers/scsi/scsi.c
> @@ -522,8 +522,10 @@ static int do_scsi_scan_one(struct udevice *dev, int id, int lun, bool verbose)
>  		return log_msg_ret("pro", ret);
>  
>  	ret = bootdev_setup_for_sibling_blk(bdev, "scsi_bootdev");
> -	if (ret)
> +	if (ret) {
> +		free(name); 
>  		return log_msg_ret("bd", ret);
> +	}
>  
>  	if (verbose) {
>  		printf("  Device %d: ", bdesc->devnum);

Your commit message and code changes do not match up. The free() here is
at the end and not by the call to blk_create_devicef(). That said,
looking at blk_create_devicef() and all of the callers, what we really
need I think is to audit all of the callers and update/correct them. The
third parameter, "name" is only used to print to the next string that's
created, so an on-stack str[X], snprintf(...) is fine and what's usually
done. The places calling sprintf(...) not snprintf should be updated for
safety. The scsi case of allocating on stack and then strdup'ing that
should be changed to just on stack. I would check with Heinrich and
Ilias about the
lib/efi_driver/efi_block_device.c::efi_bl_create_block_device() case to
be clear that there's a good reason it's not on-stack. Thanks!
Heinrich Schuchardt June 4, 2025, 7:45 p.m. UTC | #2
Am 4. Juni 2025 20:24:01 MESZ schrieb Tom Rini <trini@konsulko.com>:
>On Fri, May 16, 2025 at 08:40:20PM +0300, ant.v.moryakov@gmail.com wrote:
>
>> From: Anton Moryakov <ant.v.moryakov@gmail.com>
>> 
>> Free allocated name buffer when blk_create_devicef() fails to prevent
>> memory leak. After successful device creation, the name ownership is
>> transferred to the device structure and should not be freed manually.
>> 
>> Signed-off-by: Anton Moryakov <ant.v.moryakov@gmail.com>"
>> ---
>>  drivers/scsi/scsi.c | 4 +++-
>>  1 file changed, 3 insertions(+), 1 deletion(-)
>> 
>> diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
>> index cd0b84c0622..a9e364d3fdb 100644
>> --- a/drivers/scsi/scsi.c
>> +++ b/drivers/scsi/scsi.c
>> @@ -522,8 +522,10 @@ static int do_scsi_scan_one(struct udevice *dev, int id, int lun, bool verbose)
>>  		return log_msg_ret("pro", ret);
>>  
>>  	ret = bootdev_setup_for_sibling_blk(bdev, "scsi_bootdev");
>> -	if (ret)
>> +	if (ret) {
>> +		free(name); 
>>  		return log_msg_ret("bd", ret);
>> +	}
>>  
>>  	if (verbose) {
>>  		printf("  Device %d: ", bdesc->devnum);
>
>Your commit message and code changes do not match up. The free() here is
>at the end and not by the call to blk_create_devicef(). That said,
>looking at blk_create_devicef() and all of the callers, what we really
>need I think is to audit all of the callers and update/correct them. The
>third parameter, "name" is only used to print to the next string that's
>created, so an on-stack str[X], snprintf(...) is fine and what's usually
>done. The places calling sprintf(...) not snprintf should be updated for
>safety. The scsi case of allocating on stack and then strdup'ing that
>should be changed to just on stack. I would check with Heinrich and
>Ilias about the
>lib/efi_driver/efi_block_device.c::efi_bl_create_block_device() case to
>be clear that there's a good reason it's not on-stack. Thanks!
>

We should start with a proper documentation of blk_create_devicef() in blk.h describing the intended content of name and how it is used in the function. 

Afterwards we should fix
efi_driver: use blk_create_devicef()
<https://github.com/trini/u-boot/commit/640c6c6cbaafa1b049118d431cf218d9dce3cdd8>

Best regards 

Heinrich
diff mbox series

Patch

diff --git a/drivers/scsi/scsi.c b/drivers/scsi/scsi.c
index cd0b84c0622..a9e364d3fdb 100644
--- a/drivers/scsi/scsi.c
+++ b/drivers/scsi/scsi.c
@@ -522,8 +522,10 @@  static int do_scsi_scan_one(struct udevice *dev, int id, int lun, bool verbose)
 		return log_msg_ret("pro", ret);
 
 	ret = bootdev_setup_for_sibling_blk(bdev, "scsi_bootdev");
-	if (ret)
+	if (ret) {
+		free(name); 
 		return log_msg_ret("bd", ret);
+	}
 
 	if (verbose) {
 		printf("  Device %d: ", bdesc->devnum);