All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] comedi: Fix potential memory leak in comedi_init()
@ 2022-11-01  3:21 Shang XiaoJing
  2022-11-01  4:45 ` Greg KH
  0 siblings, 1 reply; 11+ messages in thread
From: Shang XiaoJing @ 2022-11-01  3:21 UTC (permalink / raw)
  To: abbotti, hsweeten, gregkh, zhangxuezhi1, fmhess, linux-kernel
  Cc: shangxiaojing

comedi_init() will goto out_unregister_chrdev_region if cdev_add()
failed, which won't free the resource alloced in kobject_set_name().
Call kfree_const() to free the leaked name before goto
out_unregister_chrdev_region.

unreferenced object 0xffff8881000fa8c0 (size 8):
  comm "modprobe", pid 239, jiffies 4294905173 (age 51.308s)
  hex dump (first 8 bytes):
    63 6f 6d 65 64 69 00 ff                          comedi..
  backtrace:
    [<000000005f9878f7>] __kmalloc_node_track_caller+0x4c/0x1c0
    [<000000000fd70302>] kstrdup+0x3f/0x70
    [<000000009428bc33>] kstrdup_const+0x46/0x60
    [<00000000ed50d9de>] kvasprintf_const+0xdb/0xf0
    [<00000000b2766964>] kobject_set_name_vargs+0x3c/0xe0
    [<00000000f2424ef7>] kobject_set_name+0x62/0x90
    [<000000005d5a125b>] 0xffffffffa0013098
    [<00000000f331e663>] do_one_initcall+0x7a/0x380
    [<00000000aa7bac96>] do_init_module+0x5c/0x230
    [<000000005fd72335>] load_module+0x227d/0x2420
    [<00000000ad550cf1>] __do_sys_finit_module+0xd5/0x140
    [<00000000069a60c5>] do_syscall_64+0x3f/0x90
    [<00000000c5e0d521>] entry_SYSCALL_64_after_hwframe+0x63/0xcd

Fixes: ed9eccbe8970 ("Staging: add comedi core")
Signed-off-by: Shang XiaoJing <shangxiaojing@huawei.com>
---
 drivers/comedi/comedi_fops.c | 5 ++++-
 1 file changed, 4 insertions(+), 1 deletion(-)

diff --git a/drivers/comedi/comedi_fops.c b/drivers/comedi/comedi_fops.c
index e2114bcf815a..2c508c2cf6f6 100644
--- a/drivers/comedi/comedi_fops.c
+++ b/drivers/comedi/comedi_fops.c
@@ -3379,8 +3379,11 @@ static int __init comedi_init(void)
 
 	retval = cdev_add(&comedi_cdev, MKDEV(COMEDI_MAJOR, 0),
 			  COMEDI_NUM_MINORS);
-	if (retval)
+	if (retval) {
+		kfree_const(comedi_cdev.kobj.name);
+		comedi_cdev.kobj.name = NULL;
 		goto out_unregister_chrdev_region;
+	}
 
 	comedi_class = class_create(THIS_MODULE, "comedi");
 	if (IS_ERR(comedi_class)) {
-- 
2.17.1


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

* Re: [PATCH] comedi: Fix potential memory leak in comedi_init()
  2022-11-01  3:21 [PATCH] comedi: Fix potential memory leak in comedi_init() Shang XiaoJing
@ 2022-11-01  4:45 ` Greg KH
  2022-11-01  6:16   ` shangxiaojing
  0 siblings, 1 reply; 11+ messages in thread
From: Greg KH @ 2022-11-01  4:45 UTC (permalink / raw)
  To: Shang XiaoJing; +Cc: abbotti, hsweeten, zhangxuezhi1, fmhess, linux-kernel

On Tue, Nov 01, 2022 at 11:21:25AM +0800, Shang XiaoJing wrote:
> comedi_init() will goto out_unregister_chrdev_region if cdev_add()
> failed, which won't free the resource alloced in kobject_set_name().
> Call kfree_const() to free the leaked name before goto
> out_unregister_chrdev_region.
> 
> unreferenced object 0xffff8881000fa8c0 (size 8):
>   comm "modprobe", pid 239, jiffies 4294905173 (age 51.308s)
>   hex dump (first 8 bytes):
>     63 6f 6d 65 64 69 00 ff                          comedi..
>   backtrace:
>     [<000000005f9878f7>] __kmalloc_node_track_caller+0x4c/0x1c0
>     [<000000000fd70302>] kstrdup+0x3f/0x70
>     [<000000009428bc33>] kstrdup_const+0x46/0x60
>     [<00000000ed50d9de>] kvasprintf_const+0xdb/0xf0
>     [<00000000b2766964>] kobject_set_name_vargs+0x3c/0xe0
>     [<00000000f2424ef7>] kobject_set_name+0x62/0x90
>     [<000000005d5a125b>] 0xffffffffa0013098
>     [<00000000f331e663>] do_one_initcall+0x7a/0x380
>     [<00000000aa7bac96>] do_init_module+0x5c/0x230
>     [<000000005fd72335>] load_module+0x227d/0x2420
>     [<00000000ad550cf1>] __do_sys_finit_module+0xd5/0x140
>     [<00000000069a60c5>] do_syscall_64+0x3f/0x90
>     [<00000000c5e0d521>] entry_SYSCALL_64_after_hwframe+0x63/0xcd
> 
> Fixes: ed9eccbe8970 ("Staging: add comedi core")
> Signed-off-by: Shang XiaoJing <shangxiaojing@huawei.com>
> ---
>  drivers/comedi/comedi_fops.c | 5 ++++-
>  1 file changed, 4 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/comedi/comedi_fops.c b/drivers/comedi/comedi_fops.c
> index e2114bcf815a..2c508c2cf6f6 100644
> --- a/drivers/comedi/comedi_fops.c
> +++ b/drivers/comedi/comedi_fops.c
> @@ -3379,8 +3379,11 @@ static int __init comedi_init(void)
>  
>  	retval = cdev_add(&comedi_cdev, MKDEV(COMEDI_MAJOR, 0),
>  			  COMEDI_NUM_MINORS);
> -	if (retval)
> +	if (retval) {
> +		kfree_const(comedi_cdev.kobj.name);
> +		comedi_cdev.kobj.name = NULL;
>  		goto out_unregister_chrdev_region;
> +	}

A driver should never have to poke around in the internals of a cdev
object like this.  Please fix the cdev core to not need this if
cdev_add() fails.

thanks,

greg k-h

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

* Re: [PATCH] comedi: Fix potential memory leak in comedi_init()
  2022-11-01  4:45 ` Greg KH
@ 2022-11-01  6:16   ` shangxiaojing
  2022-11-01 11:40     ` Ian Abbott
  0 siblings, 1 reply; 11+ messages in thread
From: shangxiaojing @ 2022-11-01  6:16 UTC (permalink / raw)
  To: Greg KH; +Cc: abbotti, hsweeten, zhangxuezhi1, fmhess, linux-kernel



On 2022/11/1 12:45, Greg KH wrote:
> On Tue, Nov 01, 2022 at 11:21:25AM +0800, Shang XiaoJing wrote:
>> comedi_init() will goto out_unregister_chrdev_region if cdev_add()
>> failed, which won't free the resource alloced in kobject_set_name().
>> Call kfree_const() to free the leaked name before goto
>> out_unregister_chrdev_region.
>>
>> unreferenced object 0xffff8881000fa8c0 (size 8):
>>    comm "modprobe", pid 239, jiffies 4294905173 (age 51.308s)
>>    hex dump (first 8 bytes):
>>      63 6f 6d 65 64 69 00 ff                          comedi..
>>    backtrace:
>>      [<000000005f9878f7>] __kmalloc_node_track_caller+0x4c/0x1c0
>>      [<000000000fd70302>] kstrdup+0x3f/0x70
>>      [<000000009428bc33>] kstrdup_const+0x46/0x60
>>      [<00000000ed50d9de>] kvasprintf_const+0xdb/0xf0
>>      [<00000000b2766964>] kobject_set_name_vargs+0x3c/0xe0
>>      [<00000000f2424ef7>] kobject_set_name+0x62/0x90
>>      [<000000005d5a125b>] 0xffffffffa0013098
>>      [<00000000f331e663>] do_one_initcall+0x7a/0x380
>>      [<00000000aa7bac96>] do_init_module+0x5c/0x230
>>      [<000000005fd72335>] load_module+0x227d/0x2420
>>      [<00000000ad550cf1>] __do_sys_finit_module+0xd5/0x140
>>      [<00000000069a60c5>] do_syscall_64+0x3f/0x90
>>      [<00000000c5e0d521>] entry_SYSCALL_64_after_hwframe+0x63/0xcd
>>
>> Fixes: ed9eccbe8970 ("Staging: add comedi core")
>> Signed-off-by: Shang XiaoJing <shangxiaojing@huawei.com>
>> ---
>>   drivers/comedi/comedi_fops.c | 5 ++++-
>>   1 file changed, 4 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/comedi/comedi_fops.c b/drivers/comedi/comedi_fops.c
>> index e2114bcf815a..2c508c2cf6f6 100644
>> --- a/drivers/comedi/comedi_fops.c
>> +++ b/drivers/comedi/comedi_fops.c
>> @@ -3379,8 +3379,11 @@ static int __init comedi_init(void)
>>   
>>   	retval = cdev_add(&comedi_cdev, MKDEV(COMEDI_MAJOR, 0),
>>   			  COMEDI_NUM_MINORS);
>> -	if (retval)
>> +	if (retval) {
>> +		kfree_const(comedi_cdev.kobj.name);
>> +		comedi_cdev.kobj.name = NULL;
>>   		goto out_unregister_chrdev_region;
>> +	}
> 
> A driver should never have to poke around in the internals of a cdev
> object like this.  Please fix the cdev core to not need this if
> cdev_add() fails.
> 
Hi,

I had checked all 67 places that used cdev_add(), and only the following 
5 functions set the name before the cdev_add():

1. comedi_init(), will memleak and will be fixed by this patch.
2. hfi1_cdev_init(), won't memleak.
3. qib_cdev_init(), won't memleak.
4. uio_major_init(), won't memleak.
5. __register_chrdev(), won't memleak.

As the result, I just fix the code in comedi_init(). Should I still fix 
the cdev core code, which is free the name in cdev_add() fail path?

Thanks,
-- 
Shang XiaoJing

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

* Re: [PATCH] comedi: Fix potential memory leak in comedi_init()
  2022-11-01  6:16   ` shangxiaojing
@ 2022-11-01 11:40     ` Ian Abbott
  2022-11-01 11:57       ` shangxiaojing
  2022-11-01 16:41       ` Ian Abbott
  0 siblings, 2 replies; 11+ messages in thread
From: Ian Abbott @ 2022-11-01 11:40 UTC (permalink / raw)
  To: shangxiaojing, Greg KH; +Cc: hsweeten, zhangxuezhi1, fmhess, linux-kernel

On 01/11/2022 06:16, shangxiaojing wrote:
> 
> 
> On 2022/11/1 12:45, Greg KH wrote:
>> On Tue, Nov 01, 2022 at 11:21:25AM +0800, Shang XiaoJing wrote:
>>> comedi_init() will goto out_unregister_chrdev_region if cdev_add()
>>> failed, which won't free the resource alloced in kobject_set_name().
>>> Call kfree_const() to free the leaked name before goto
>>> out_unregister_chrdev_region.
>>>
>>> unreferenced object 0xffff8881000fa8c0 (size 8):
>>>    comm "modprobe", pid 239, jiffies 4294905173 (age 51.308s)
>>>    hex dump (first 8 bytes):
>>>      63 6f 6d 65 64 69 00 ff                          comedi..
>>>    backtrace:
>>>      [<000000005f9878f7>] __kmalloc_node_track_caller+0x4c/0x1c0
>>>      [<000000000fd70302>] kstrdup+0x3f/0x70
>>>      [<000000009428bc33>] kstrdup_const+0x46/0x60
>>>      [<00000000ed50d9de>] kvasprintf_const+0xdb/0xf0
>>>      [<00000000b2766964>] kobject_set_name_vargs+0x3c/0xe0
>>>      [<00000000f2424ef7>] kobject_set_name+0x62/0x90
>>>      [<000000005d5a125b>] 0xffffffffa0013098
>>>      [<00000000f331e663>] do_one_initcall+0x7a/0x380
>>>      [<00000000aa7bac96>] do_init_module+0x5c/0x230
>>>      [<000000005fd72335>] load_module+0x227d/0x2420
>>>      [<00000000ad550cf1>] __do_sys_finit_module+0xd5/0x140
>>>      [<00000000069a60c5>] do_syscall_64+0x3f/0x90
>>>      [<00000000c5e0d521>] entry_SYSCALL_64_after_hwframe+0x63/0xcd
>>>
>>> Fixes: ed9eccbe8970 ("Staging: add comedi core")
>>> Signed-off-by: Shang XiaoJing <shangxiaojing@huawei.com>
>>> ---
>>>   drivers/comedi/comedi_fops.c | 5 ++++-
>>>   1 file changed, 4 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/drivers/comedi/comedi_fops.c b/drivers/comedi/comedi_fops.c
>>> index e2114bcf815a..2c508c2cf6f6 100644
>>> --- a/drivers/comedi/comedi_fops.c
>>> +++ b/drivers/comedi/comedi_fops.c
>>> @@ -3379,8 +3379,11 @@ static int __init comedi_init(void)
>>>       retval = cdev_add(&comedi_cdev, MKDEV(COMEDI_MAJOR, 0),
>>>                 COMEDI_NUM_MINORS);
>>> -    if (retval)
>>> +    if (retval) {
>>> +        kfree_const(comedi_cdev.kobj.name);
>>> +        comedi_cdev.kobj.name = NULL;
>>>           goto out_unregister_chrdev_region;
>>> +    }
>>
>> A driver should never have to poke around in the internals of a cdev
>> object like this.  Please fix the cdev core to not need this if
>> cdev_add() fails.

Or at least there should be a function that can be called to undo the 
allocations of kobject_set_name().

>>
> Hi,
> 
> I had checked all 67 places that used cdev_add(), and only the following 
> 5 functions set the name before the cdev_add():
> 
> 1. comedi_init(), will memleak and will be fixed by this patch.
> 2. hfi1_cdev_init(), won't memleak.
> 3. qib_cdev_init(), won't memleak.
> 4. uio_major_init(), won't memleak.
> 5. __register_chrdev(), won't memleak.
> 
> As the result, I just fix the code in comedi_init(). Should I still fix 
> the cdev core code, which is free the name in cdev_add() fail path?

I'm stuck trying to work out why hfi1_cdev_init() doesn't have the same 
problem when cdev_add() returns an error.

-- 
-=( Ian Abbott <abbotti@mev.co.uk> || MEV Ltd. is a company  )=-
-=( registered in England & Wales.  Regd. number: 02862268.  )=-
-=( Regd. addr.: S11 & 12 Building 67, Europa Business Park, )=-
-=( Bird Hall Lane, STOCKPORT, SK3 0XA, UK. || www.mev.co.uk )=-


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

* Re: [PATCH] comedi: Fix potential memory leak in comedi_init()
  2022-11-01 11:40     ` Ian Abbott
@ 2022-11-01 11:57       ` shangxiaojing
  2022-11-01 15:59         ` Ian Abbott
  2022-11-01 16:41       ` Ian Abbott
  1 sibling, 1 reply; 11+ messages in thread
From: shangxiaojing @ 2022-11-01 11:57 UTC (permalink / raw)
  To: Ian Abbott, Greg KH; +Cc: hsweeten, zhangxuezhi1, fmhess, linux-kernel



On 2022/11/1 19:40, Ian Abbott wrote:
> On 01/11/2022 06:16, shangxiaojing wrote:
>>
>>
>> On 2022/11/1 12:45, Greg KH wrote:
>>> On Tue, Nov 01, 2022 at 11:21:25AM +0800, Shang XiaoJing wrote:
>>>> comedi_init() will goto out_unregister_chrdev_region if cdev_add()
>>>> failed, which won't free the resource alloced in kobject_set_name().
>>>> Call kfree_const() to free the leaked name before goto
>>>> out_unregister_chrdev_region.
>>>>
>>>> unreferenced object 0xffff8881000fa8c0 (size 8):
>>>>    comm "modprobe", pid 239, jiffies 4294905173 (age 51.308s)
>>>>    hex dump (first 8 bytes):
>>>>      63 6f 6d 65 64 69 00 ff                          comedi..
>>>>    backtrace:
>>>>      [<000000005f9878f7>] __kmalloc_node_track_caller+0x4c/0x1c0
>>>>      [<000000000fd70302>] kstrdup+0x3f/0x70
>>>>      [<000000009428bc33>] kstrdup_const+0x46/0x60
>>>>      [<00000000ed50d9de>] kvasprintf_const+0xdb/0xf0
>>>>      [<00000000b2766964>] kobject_set_name_vargs+0x3c/0xe0
>>>>      [<00000000f2424ef7>] kobject_set_name+0x62/0x90
>>>>      [<000000005d5a125b>] 0xffffffffa0013098
>>>>      [<00000000f331e663>] do_one_initcall+0x7a/0x380
>>>>      [<00000000aa7bac96>] do_init_module+0x5c/0x230
>>>>      [<000000005fd72335>] load_module+0x227d/0x2420
>>>>      [<00000000ad550cf1>] __do_sys_finit_module+0xd5/0x140
>>>>      [<00000000069a60c5>] do_syscall_64+0x3f/0x90
>>>>      [<00000000c5e0d521>] entry_SYSCALL_64_after_hwframe+0x63/0xcd
>>>>
>>>> Fixes: ed9eccbe8970 ("Staging: add comedi core")
>>>> Signed-off-by: Shang XiaoJing <shangxiaojing@huawei.com>
>>>> ---
>>>>   drivers/comedi/comedi_fops.c | 5 ++++-
>>>>   1 file changed, 4 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/drivers/comedi/comedi_fops.c 
>>>> b/drivers/comedi/comedi_fops.c
>>>> index e2114bcf815a..2c508c2cf6f6 100644
>>>> --- a/drivers/comedi/comedi_fops.c
>>>> +++ b/drivers/comedi/comedi_fops.c
>>>> @@ -3379,8 +3379,11 @@ static int __init comedi_init(void)
>>>>       retval = cdev_add(&comedi_cdev, MKDEV(COMEDI_MAJOR, 0),
>>>>                 COMEDI_NUM_MINORS);
>>>> -    if (retval)
>>>> +    if (retval) {
>>>> +        kfree_const(comedi_cdev.kobj.name);
>>>> +        comedi_cdev.kobj.name = NULL;
>>>>           goto out_unregister_chrdev_region;
>>>> +    }
>>>
>>> A driver should never have to poke around in the internals of a cdev
>>> object like this.  Please fix the cdev core to not need this if
>>> cdev_add() fails.
> 
> Or at least there should be a function that can be called to undo the 
> allocations of kobject_set_name().

It's ok to add a pair function, but maybe only one place where used 
cdev_add() need free name. Your mean all "kfree_const(name);" should be 
replaced to the new function?

> 
>>>
>> Hi,
>>
>> I had checked all 67 places that used cdev_add(), and only the 
>> following 5 functions set the name before the cdev_add():
>>
>> 1. comedi_init(), will memleak and will be fixed by this patch.
>> 2. hfi1_cdev_init(), won't memleak.
>> 3. qib_cdev_init(), won't memleak.
>> 4. uio_major_init(), won't memleak.
>> 5. __register_chrdev(), won't memleak.
>>
>> As the result, I just fix the code in comedi_init(). Should I still 
>> fix the cdev core code, which is free the name in cdev_add() fail path?
> 
> I'm stuck trying to work out why hfi1_cdev_init() doesn't have the same 
> problem when cdev_add() returns an error.
> 

Only user_add() calls the hfi1_cdev_init(), and will call user_remove() 
if hfi1_cdev_init() failed. In user_remove(), hfi1_cdev_cleanup() will 
call cdev_del().

Thanks,
-- 
Shang XiaoJing

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

* Re: [PATCH] comedi: Fix potential memory leak in comedi_init()
  2022-11-01 11:57       ` shangxiaojing
@ 2022-11-01 15:59         ` Ian Abbott
  2022-11-02  2:41           ` shangxiaojing
  0 siblings, 1 reply; 11+ messages in thread
From: Ian Abbott @ 2022-11-01 15:59 UTC (permalink / raw)
  To: shangxiaojing, Greg KH; +Cc: hsweeten, zhangxuezhi1, fmhess, linux-kernel

On 01/11/2022 11:57, shangxiaojing wrote:
> 
> 
> On 2022/11/1 19:40, Ian Abbott wrote:
>> On 01/11/2022 06:16, shangxiaojing wrote:
>>>
>>>
>>> On 2022/11/1 12:45, Greg KH wrote:
>>>> On Tue, Nov 01, 2022 at 11:21:25AM +0800, Shang XiaoJing wrote:
>>>>> comedi_init() will goto out_unregister_chrdev_region if cdev_add()
>>>>> failed, which won't free the resource alloced in kobject_set_name().
>>>>> Call kfree_const() to free the leaked name before goto
>>>>> out_unregister_chrdev_region.
>>>>>
>>>>> unreferenced object 0xffff8881000fa8c0 (size 8):
>>>>>    comm "modprobe", pid 239, jiffies 4294905173 (age 51.308s)
>>>>>    hex dump (first 8 bytes):
>>>>>      63 6f 6d 65 64 69 00 ff                          comedi..
>>>>>    backtrace:
>>>>>      [<000000005f9878f7>] __kmalloc_node_track_caller+0x4c/0x1c0
>>>>>      [<000000000fd70302>] kstrdup+0x3f/0x70
>>>>>      [<000000009428bc33>] kstrdup_const+0x46/0x60
>>>>>      [<00000000ed50d9de>] kvasprintf_const+0xdb/0xf0
>>>>>      [<00000000b2766964>] kobject_set_name_vargs+0x3c/0xe0
>>>>>      [<00000000f2424ef7>] kobject_set_name+0x62/0x90
>>>>>      [<000000005d5a125b>] 0xffffffffa0013098
>>>>>      [<00000000f331e663>] do_one_initcall+0x7a/0x380
>>>>>      [<00000000aa7bac96>] do_init_module+0x5c/0x230
>>>>>      [<000000005fd72335>] load_module+0x227d/0x2420
>>>>>      [<00000000ad550cf1>] __do_sys_finit_module+0xd5/0x140
>>>>>      [<00000000069a60c5>] do_syscall_64+0x3f/0x90
>>>>>      [<00000000c5e0d521>] entry_SYSCALL_64_after_hwframe+0x63/0xcd
>>>>>
>>>>> Fixes: ed9eccbe8970 ("Staging: add comedi core")
>>>>> Signed-off-by: Shang XiaoJing <shangxiaojing@huawei.com>
>>>>> ---
>>>>>   drivers/comedi/comedi_fops.c | 5 ++++-
>>>>>   1 file changed, 4 insertions(+), 1 deletion(-)
>>>>>
>>>>> diff --git a/drivers/comedi/comedi_fops.c 
>>>>> b/drivers/comedi/comedi_fops.c
>>>>> index e2114bcf815a..2c508c2cf6f6 100644
>>>>> --- a/drivers/comedi/comedi_fops.c
>>>>> +++ b/drivers/comedi/comedi_fops.c
>>>>> @@ -3379,8 +3379,11 @@ static int __init comedi_init(void)
>>>>>       retval = cdev_add(&comedi_cdev, MKDEV(COMEDI_MAJOR, 0),
>>>>>                 COMEDI_NUM_MINORS);
>>>>> -    if (retval)
>>>>> +    if (retval) {
>>>>> +        kfree_const(comedi_cdev.kobj.name);
>>>>> +        comedi_cdev.kobj.name = NULL;
>>>>>           goto out_unregister_chrdev_region;
>>>>> +    }
>>>>
>>>> A driver should never have to poke around in the internals of a cdev
>>>> object like this.  Please fix the cdev core to not need this if
>>>> cdev_add() fails.
>>
>> Or at least there should be a function that can be called to undo the 
>> allocations of kobject_set_name().
> 
> It's ok to add a pair function, but maybe only one place where used 
> cdev_add() need free name. Your mean all "kfree_const(name);" should be 
> replaced to the new function?
> 
>>
>>>>
>>> Hi,
>>>
>>> I had checked all 67 places that used cdev_add(), and only the 
>>> following 5 functions set the name before the cdev_add():
>>>
>>> 1. comedi_init(), will memleak and will be fixed by this patch.
>>> 2. hfi1_cdev_init(), won't memleak.
>>> 3. qib_cdev_init(), won't memleak.
>>> 4. uio_major_init(), won't memleak.
>>> 5. __register_chrdev(), won't memleak.
>>>
>>> As the result, I just fix the code in comedi_init(). Should I still 
>>> fix the cdev core code, which is free the name in cdev_add() fail path?
>>
>> I'm stuck trying to work out why hfi1_cdev_init() doesn't have the 
>> same problem when cdev_add() returns an error.
>>
> 
> Only user_add() calls the hfi1_cdev_init(), and will call user_remove() 
> if hfi1_cdev_init() failed. In user_remove(), hfi1_cdev_cleanup() will 
> call cdev_del().

No it won't.  hfi1_cdev_cleanup() only calls cdev_del() if device is 
non-null, but device will be null if the call to cdev_add() failed in 
hfi1_cdev_init().

-- 
-=( Ian Abbott <abbotti@mev.co.uk> || MEV Ltd. is a company  )=-
-=( registered in England & Wales.  Regd. number: 02862268.  )=-
-=( Regd. addr.: S11 & 12 Building 67, Europa Business Park, )=-
-=( Bird Hall Lane, STOCKPORT, SK3 0XA, UK. || www.mev.co.uk )=-


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

* Re: [PATCH] comedi: Fix potential memory leak in comedi_init()
  2022-11-01 11:40     ` Ian Abbott
  2022-11-01 11:57       ` shangxiaojing
@ 2022-11-01 16:41       ` Ian Abbott
  2022-11-02  2:51         ` shangxiaojing
  1 sibling, 1 reply; 11+ messages in thread
From: Ian Abbott @ 2022-11-01 16:41 UTC (permalink / raw)
  To: shangxiaojing, Greg KH; +Cc: hsweeten, zhangxuezhi1, fmhess, linux-kernel

On 01/11/2022 11:40, Ian Abbott wrote:
> On 01/11/2022 06:16, shangxiaojing wrote:
>>
>>
>> On 2022/11/1 12:45, Greg KH wrote:
>>> On Tue, Nov 01, 2022 at 11:21:25AM +0800, Shang XiaoJing wrote:
>>>> comedi_init() will goto out_unregister_chrdev_region if cdev_add()
>>>> failed, which won't free the resource alloced in kobject_set_name().
>>>> Call kfree_const() to free the leaked name before goto
>>>> out_unregister_chrdev_region.
>>>>
>>>> unreferenced object 0xffff8881000fa8c0 (size 8):
>>>>    comm "modprobe", pid 239, jiffies 4294905173 (age 51.308s)
>>>>    hex dump (first 8 bytes):
>>>>      63 6f 6d 65 64 69 00 ff                          comedi..
>>>>    backtrace:
>>>>      [<000000005f9878f7>] __kmalloc_node_track_caller+0x4c/0x1c0
>>>>      [<000000000fd70302>] kstrdup+0x3f/0x70
>>>>      [<000000009428bc33>] kstrdup_const+0x46/0x60
>>>>      [<00000000ed50d9de>] kvasprintf_const+0xdb/0xf0
>>>>      [<00000000b2766964>] kobject_set_name_vargs+0x3c/0xe0
>>>>      [<00000000f2424ef7>] kobject_set_name+0x62/0x90
>>>>      [<000000005d5a125b>] 0xffffffffa0013098
>>>>      [<00000000f331e663>] do_one_initcall+0x7a/0x380
>>>>      [<00000000aa7bac96>] do_init_module+0x5c/0x230
>>>>      [<000000005fd72335>] load_module+0x227d/0x2420
>>>>      [<00000000ad550cf1>] __do_sys_finit_module+0xd5/0x140
>>>>      [<00000000069a60c5>] do_syscall_64+0x3f/0x90
>>>>      [<00000000c5e0d521>] entry_SYSCALL_64_after_hwframe+0x63/0xcd
>>>>
>>>> Fixes: ed9eccbe8970 ("Staging: add comedi core")
>>>> Signed-off-by: Shang XiaoJing <shangxiaojing@huawei.com>
>>>> ---
>>>>   drivers/comedi/comedi_fops.c | 5 ++++-
>>>>   1 file changed, 4 insertions(+), 1 deletion(-)
>>>>
>>>> diff --git a/drivers/comedi/comedi_fops.c 
>>>> b/drivers/comedi/comedi_fops.c
>>>> index e2114bcf815a..2c508c2cf6f6 100644
>>>> --- a/drivers/comedi/comedi_fops.c
>>>> +++ b/drivers/comedi/comedi_fops.c
>>>> @@ -3379,8 +3379,11 @@ static int __init comedi_init(void)
>>>>       retval = cdev_add(&comedi_cdev, MKDEV(COMEDI_MAJOR, 0),
>>>>                 COMEDI_NUM_MINORS);
>>>> -    if (retval)
>>>> +    if (retval) {
>>>> +        kfree_const(comedi_cdev.kobj.name);
>>>> +        comedi_cdev.kobj.name = NULL;
>>>>           goto out_unregister_chrdev_region;
>>>> +    }
>>>
>>> A driver should never have to poke around in the internals of a cdev
>>> object like this.  Please fix the cdev core to not need this if
>>> cdev_add() fails.
> 
> Or at least there should be a function that can be called to undo the 
> allocations of kobject_set_name().

Looking at it a bit more, cdev_init() calls kobject_init(), and 
kobject_init() requires a matching call to kobject_put().  Nothing is 
calling kobject_put() in this situation.  Calling cdev_del() will call 
kobject_put(), so is that the correct way to clean up after cdev_init() 
if the call to cdev_add() fails?

-- 
-=( Ian Abbott <abbotti@mev.co.uk> || MEV Ltd. is a company  )=-
-=( registered in England & Wales.  Regd. number: 02862268.  )=-
-=( Regd. addr.: S11 & 12 Building 67, Europa Business Park, )=-
-=( Bird Hall Lane, STOCKPORT, SK3 0XA, UK. || www.mev.co.uk )=-


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

* Re: [PATCH] comedi: Fix potential memory leak in comedi_init()
  2022-11-01 15:59         ` Ian Abbott
@ 2022-11-02  2:41           ` shangxiaojing
  0 siblings, 0 replies; 11+ messages in thread
From: shangxiaojing @ 2022-11-02  2:41 UTC (permalink / raw)
  To: Ian Abbott, Greg KH; +Cc: hsweeten, zhangxuezhi1, fmhess, linux-kernel



On 2022/11/1 23:59, Ian Abbott wrote:
> On 01/11/2022 11:57, shangxiaojing wrote:
>>
>>
>> On 2022/11/1 19:40, Ian Abbott wrote:
>>> On 01/11/2022 06:16, shangxiaojing wrote:
>>>>
>>>>
>>>> On 2022/11/1 12:45, Greg KH wrote:
>>>>> On Tue, Nov 01, 2022 at 11:21:25AM +0800, Shang XiaoJing wrote:
>>>>>> comedi_init() will goto out_unregister_chrdev_region if cdev_add()
>>>>>> failed, which won't free the resource alloced in kobject_set_name().
>>>>>> Call kfree_const() to free the leaked name before goto
>>>>>> out_unregister_chrdev_region.
>>>>>>
>>>>>> unreferenced object 0xffff8881000fa8c0 (size 8):
>>>>>>    comm "modprobe", pid 239, jiffies 4294905173 (age 51.308s)
>>>>>>    hex dump (first 8 bytes):
>>>>>>      63 6f 6d 65 64 69 00 ff                          comedi..
>>>>>>    backtrace:
>>>>>>      [<000000005f9878f7>] __kmalloc_node_track_caller+0x4c/0x1c0
>>>>>>      [<000000000fd70302>] kstrdup+0x3f/0x70
>>>>>>      [<000000009428bc33>] kstrdup_const+0x46/0x60
>>>>>>      [<00000000ed50d9de>] kvasprintf_const+0xdb/0xf0
>>>>>>      [<00000000b2766964>] kobject_set_name_vargs+0x3c/0xe0
>>>>>>      [<00000000f2424ef7>] kobject_set_name+0x62/0x90
>>>>>>      [<000000005d5a125b>] 0xffffffffa0013098
>>>>>>      [<00000000f331e663>] do_one_initcall+0x7a/0x380
>>>>>>      [<00000000aa7bac96>] do_init_module+0x5c/0x230
>>>>>>      [<000000005fd72335>] load_module+0x227d/0x2420
>>>>>>      [<00000000ad550cf1>] __do_sys_finit_module+0xd5/0x140
>>>>>>      [<00000000069a60c5>] do_syscall_64+0x3f/0x90
>>>>>>      [<00000000c5e0d521>] entry_SYSCALL_64_after_hwframe+0x63/0xcd
>>>>>>
>>>>>> Fixes: ed9eccbe8970 ("Staging: add comedi core")
>>>>>> Signed-off-by: Shang XiaoJing <shangxiaojing@huawei.com>
>>>>>> ---
>>>>>>   drivers/comedi/comedi_fops.c | 5 ++++-
>>>>>>   1 file changed, 4 insertions(+), 1 deletion(-)
>>>>>>
>>>>>> diff --git a/drivers/comedi/comedi_fops.c 
>>>>>> b/drivers/comedi/comedi_fops.c
>>>>>> index e2114bcf815a..2c508c2cf6f6 100644
>>>>>> --- a/drivers/comedi/comedi_fops.c
>>>>>> +++ b/drivers/comedi/comedi_fops.c
>>>>>> @@ -3379,8 +3379,11 @@ static int __init comedi_init(void)
>>>>>>       retval = cdev_add(&comedi_cdev, MKDEV(COMEDI_MAJOR, 0),
>>>>>>                 COMEDI_NUM_MINORS);
>>>>>> -    if (retval)
>>>>>> +    if (retval) {
>>>>>> +        kfree_const(comedi_cdev.kobj.name);
>>>>>> +        comedi_cdev.kobj.name = NULL;
>>>>>>           goto out_unregister_chrdev_region;
>>>>>> +    }
>>>>>
>>>>> A driver should never have to poke around in the internals of a cdev
>>>>> object like this.  Please fix the cdev core to not need this if
>>>>> cdev_add() fails.
>>>
>>> Or at least there should be a function that can be called to undo the 
>>> allocations of kobject_set_name().
>>
>> It's ok to add a pair function, but maybe only one place where used 
>> cdev_add() need free name. Your mean all "kfree_const(name);" should 
>> be replaced to the new function?
>>
>>>
>>>>>
>>>> Hi,
>>>>
>>>> I had checked all 67 places that used cdev_add(), and only the 
>>>> following 5 functions set the name before the cdev_add():
>>>>
>>>> 1. comedi_init(), will memleak and will be fixed by this patch.
>>>> 2. hfi1_cdev_init(), won't memleak.
>>>> 3. qib_cdev_init(), won't memleak.
>>>> 4. uio_major_init(), won't memleak.
>>>> 5. __register_chrdev(), won't memleak.
>>>>
>>>> As the result, I just fix the code in comedi_init(). Should I still 
>>>> fix the cdev core code, which is free the name in cdev_add() fail path?
>>>
>>> I'm stuck trying to work out why hfi1_cdev_init() doesn't have the 
>>> same problem when cdev_add() returns an error.
>>>
>>
>> Only user_add() calls the hfi1_cdev_init(), and will call 
>> user_remove() if hfi1_cdev_init() failed. In user_remove(), 
>> hfi1_cdev_cleanup() will call cdev_del().
> 
> No it won't.  hfi1_cdev_cleanup() only calls cdev_del() if device is 
> non-null, but device will be null if the call to cdev_add() failed in 
> hfi1_cdev_init().
> 

Right, device won't be inited, so there has the same potential memleak.

Thanks,
-- 
Shang XiaoJing

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

* Re: [PATCH] comedi: Fix potential memory leak in comedi_init()
  2022-11-01 16:41       ` Ian Abbott
@ 2022-11-02  2:51         ` shangxiaojing
  2022-11-02  2:59           ` Greg KH
  0 siblings, 1 reply; 11+ messages in thread
From: shangxiaojing @ 2022-11-02  2:51 UTC (permalink / raw)
  To: Ian Abbott, Greg KH; +Cc: hsweeten, zhangxuezhi1, fmhess, linux-kernel



On 2022/11/2 0:41, Ian Abbott wrote:
> On 01/11/2022 11:40, Ian Abbott wrote:
>> On 01/11/2022 06:16, shangxiaojing wrote:
>>>
>>>
>>> On 2022/11/1 12:45, Greg KH wrote:
>>>> On Tue, Nov 01, 2022 at 11:21:25AM +0800, Shang XiaoJing wrote:
>>>>> comedi_init() will goto out_unregister_chrdev_region if cdev_add()
>>>>> failed, which won't free the resource alloced in kobject_set_name().
>>>>> Call kfree_const() to free the leaked name before goto
>>>>> out_unregister_chrdev_region.
>>>>>
>>>>> unreferenced object 0xffff8881000fa8c0 (size 8):
>>>>>    comm "modprobe", pid 239, jiffies 4294905173 (age 51.308s)
>>>>>    hex dump (first 8 bytes):
>>>>>      63 6f 6d 65 64 69 00 ff                          comedi..
>>>>>    backtrace:
>>>>>      [<000000005f9878f7>] __kmalloc_node_track_caller+0x4c/0x1c0
>>>>>      [<000000000fd70302>] kstrdup+0x3f/0x70
>>>>>      [<000000009428bc33>] kstrdup_const+0x46/0x60
>>>>>      [<00000000ed50d9de>] kvasprintf_const+0xdb/0xf0
>>>>>      [<00000000b2766964>] kobject_set_name_vargs+0x3c/0xe0
>>>>>      [<00000000f2424ef7>] kobject_set_name+0x62/0x90
>>>>>      [<000000005d5a125b>] 0xffffffffa0013098
>>>>>      [<00000000f331e663>] do_one_initcall+0x7a/0x380
>>>>>      [<00000000aa7bac96>] do_init_module+0x5c/0x230
>>>>>      [<000000005fd72335>] load_module+0x227d/0x2420
>>>>>      [<00000000ad550cf1>] __do_sys_finit_module+0xd5/0x140
>>>>>      [<00000000069a60c5>] do_syscall_64+0x3f/0x90
>>>>>      [<00000000c5e0d521>] entry_SYSCALL_64_after_hwframe+0x63/0xcd
>>>>>
>>>>> Fixes: ed9eccbe8970 ("Staging: add comedi core")
>>>>> Signed-off-by: Shang XiaoJing <shangxiaojing@huawei.com>
>>>>> ---
>>>>>   drivers/comedi/comedi_fops.c | 5 ++++-
>>>>>   1 file changed, 4 insertions(+), 1 deletion(-)
>>>>>
>>>>> diff --git a/drivers/comedi/comedi_fops.c 
>>>>> b/drivers/comedi/comedi_fops.c
>>>>> index e2114bcf815a..2c508c2cf6f6 100644
>>>>> --- a/drivers/comedi/comedi_fops.c
>>>>> +++ b/drivers/comedi/comedi_fops.c
>>>>> @@ -3379,8 +3379,11 @@ static int __init comedi_init(void)
>>>>>       retval = cdev_add(&comedi_cdev, MKDEV(COMEDI_MAJOR, 0),
>>>>>                 COMEDI_NUM_MINORS);
>>>>> -    if (retval)
>>>>> +    if (retval) {
>>>>> +        kfree_const(comedi_cdev.kobj.name);
>>>>> +        comedi_cdev.kobj.name = NULL;
>>>>>           goto out_unregister_chrdev_region;
>>>>> +    }
>>>>
>>>> A driver should never have to poke around in the internals of a cdev
>>>> object like this.  Please fix the cdev core to not need this if
>>>> cdev_add() fails.
>>
>> Or at least there should be a function that can be called to undo the 
>> allocations of kobject_set_name().
> 
> Looking at it a bit more, cdev_init() calls kobject_init(), and 
> kobject_init() requires a matching call to kobject_put().  Nothing is 
> calling kobject_put() in this situation.  Calling cdev_del() will call 
> kobject_put(), so is that the correct way to clean up after cdev_init() 
> if the call to cdev_add() fails?
> 

Some cdev call cdev_del() when cdev_add() failed (like init_dvbdev()), 
and at that time the cdev_unmap() in cdev_del() won't do anything due to 
the failure of cdev_add(), which is calling the kobject_put() when 
cdev_add() failed. But I'm not sure which one is better.

Thanks,
-- 
Shang XiaoJing

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

* Re: [PATCH] comedi: Fix potential memory leak in comedi_init()
  2022-11-02  2:51         ` shangxiaojing
@ 2022-11-02  2:59           ` Greg KH
  2022-11-02  6:06             ` shangxiaojing
  0 siblings, 1 reply; 11+ messages in thread
From: Greg KH @ 2022-11-02  2:59 UTC (permalink / raw)
  To: shangxiaojing; +Cc: Ian Abbott, hsweeten, zhangxuezhi1, fmhess, linux-kernel

On Wed, Nov 02, 2022 at 10:51:35AM +0800, shangxiaojing wrote:
> 
> 
> On 2022/11/2 0:41, Ian Abbott wrote:
> > On 01/11/2022 11:40, Ian Abbott wrote:
> > > On 01/11/2022 06:16, shangxiaojing wrote:
> > > > 
> > > > 
> > > > On 2022/11/1 12:45, Greg KH wrote:
> > > > > On Tue, Nov 01, 2022 at 11:21:25AM +0800, Shang XiaoJing wrote:
> > > > > > comedi_init() will goto out_unregister_chrdev_region if cdev_add()
> > > > > > failed, which won't free the resource alloced in kobject_set_name().
> > > > > > Call kfree_const() to free the leaked name before goto
> > > > > > out_unregister_chrdev_region.
> > > > > > 
> > > > > > unreferenced object 0xffff8881000fa8c0 (size 8):
> > > > > >    comm "modprobe", pid 239, jiffies 4294905173 (age 51.308s)
> > > > > >    hex dump (first 8 bytes):
> > > > > >      63 6f 6d 65 64 69 00 ff                          comedi..
> > > > > >    backtrace:
> > > > > >      [<000000005f9878f7>] __kmalloc_node_track_caller+0x4c/0x1c0
> > > > > >      [<000000000fd70302>] kstrdup+0x3f/0x70
> > > > > >      [<000000009428bc33>] kstrdup_const+0x46/0x60
> > > > > >      [<00000000ed50d9de>] kvasprintf_const+0xdb/0xf0
> > > > > >      [<00000000b2766964>] kobject_set_name_vargs+0x3c/0xe0
> > > > > >      [<00000000f2424ef7>] kobject_set_name+0x62/0x90
> > > > > >      [<000000005d5a125b>] 0xffffffffa0013098
> > > > > >      [<00000000f331e663>] do_one_initcall+0x7a/0x380
> > > > > >      [<00000000aa7bac96>] do_init_module+0x5c/0x230
> > > > > >      [<000000005fd72335>] load_module+0x227d/0x2420
> > > > > >      [<00000000ad550cf1>] __do_sys_finit_module+0xd5/0x140
> > > > > >      [<00000000069a60c5>] do_syscall_64+0x3f/0x90
> > > > > >      [<00000000c5e0d521>] entry_SYSCALL_64_after_hwframe+0x63/0xcd
> > > > > > 
> > > > > > Fixes: ed9eccbe8970 ("Staging: add comedi core")
> > > > > > Signed-off-by: Shang XiaoJing <shangxiaojing@huawei.com>
> > > > > > ---
> > > > > >   drivers/comedi/comedi_fops.c | 5 ++++-
> > > > > >   1 file changed, 4 insertions(+), 1 deletion(-)
> > > > > > 
> > > > > > diff --git a/drivers/comedi/comedi_fops.c
> > > > > > b/drivers/comedi/comedi_fops.c
> > > > > > index e2114bcf815a..2c508c2cf6f6 100644
> > > > > > --- a/drivers/comedi/comedi_fops.c
> > > > > > +++ b/drivers/comedi/comedi_fops.c
> > > > > > @@ -3379,8 +3379,11 @@ static int __init comedi_init(void)
> > > > > >       retval = cdev_add(&comedi_cdev, MKDEV(COMEDI_MAJOR, 0),
> > > > > >                 COMEDI_NUM_MINORS);
> > > > > > -    if (retval)
> > > > > > +    if (retval) {
> > > > > > +        kfree_const(comedi_cdev.kobj.name);
> > > > > > +        comedi_cdev.kobj.name = NULL;
> > > > > >           goto out_unregister_chrdev_region;
> > > > > > +    }
> > > > > 
> > > > > A driver should never have to poke around in the internals of a cdev
> > > > > object like this.  Please fix the cdev core to not need this if
> > > > > cdev_add() fails.
> > > 
> > > Or at least there should be a function that can be called to undo
> > > the allocations of kobject_set_name().
> > 
> > Looking at it a bit more, cdev_init() calls kobject_init(), and
> > kobject_init() requires a matching call to kobject_put().  Nothing is
> > calling kobject_put() in this situation.  Calling cdev_del() will call
> > kobject_put(), so is that the correct way to clean up after cdev_init()
> > if the call to cdev_add() fails?
> > 
> 
> Some cdev call cdev_del() when cdev_add() failed (like init_dvbdev()), and
> at that time the cdev_unmap() in cdev_del() won't do anything due to the
> failure of cdev_add(), which is calling the kobject_put() when cdev_add()
> failed. But I'm not sure which one is better.

My point is that no one calling the cdev_add() call should have to do
this type of "cleanup"  The cdev code should do it automatically, we
don't want to have to audit every user of cdev_add() today, and in the
future for forever, to ensure they got it right.

Let's fix it up in the cdev code itself please.  The kobject in a cdev
is a very odd thing, it's not the "normal" type of kobject that you
expect, so the cdev code should handle all of that on its own and that
should not "leak" into any caller.

thanks,

greg k-h

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

* Re: [PATCH] comedi: Fix potential memory leak in comedi_init()
  2022-11-02  2:59           ` Greg KH
@ 2022-11-02  6:06             ` shangxiaojing
  0 siblings, 0 replies; 11+ messages in thread
From: shangxiaojing @ 2022-11-02  6:06 UTC (permalink / raw)
  To: Greg KH; +Cc: Ian Abbott, hsweeten, zhangxuezhi1, fmhess, linux-kernel



On 2022/11/2 10:59, Greg KH wrote:
> On Wed, Nov 02, 2022 at 10:51:35AM +0800, shangxiaojing wrote:
>>
>>
>> On 2022/11/2 0:41, Ian Abbott wrote:
>>> On 01/11/2022 11:40, Ian Abbott wrote:
>>>> On 01/11/2022 06:16, shangxiaojing wrote:
>>>>>
>>>>>
>>>>> On 2022/11/1 12:45, Greg KH wrote:
>>>>>> On Tue, Nov 01, 2022 at 11:21:25AM +0800, Shang XiaoJing wrote:
>>>>>>> comedi_init() will goto out_unregister_chrdev_region if cdev_add()
>>>>>>> failed, which won't free the resource alloced in kobject_set_name().
>>>>>>> Call kfree_const() to free the leaked name before goto
>>>>>>> out_unregister_chrdev_region.
>>>>>>>
>>>>>>> unreferenced object 0xffff8881000fa8c0 (size 8):
>>>>>>>     comm "modprobe", pid 239, jiffies 4294905173 (age 51.308s)
>>>>>>>     hex dump (first 8 bytes):
>>>>>>>       63 6f 6d 65 64 69 00 ff                          comedi..
>>>>>>>     backtrace:
>>>>>>>       [<000000005f9878f7>] __kmalloc_node_track_caller+0x4c/0x1c0
>>>>>>>       [<000000000fd70302>] kstrdup+0x3f/0x70
>>>>>>>       [<000000009428bc33>] kstrdup_const+0x46/0x60
>>>>>>>       [<00000000ed50d9de>] kvasprintf_const+0xdb/0xf0
>>>>>>>       [<00000000b2766964>] kobject_set_name_vargs+0x3c/0xe0
>>>>>>>       [<00000000f2424ef7>] kobject_set_name+0x62/0x90
>>>>>>>       [<000000005d5a125b>] 0xffffffffa0013098
>>>>>>>       [<00000000f331e663>] do_one_initcall+0x7a/0x380
>>>>>>>       [<00000000aa7bac96>] do_init_module+0x5c/0x230
>>>>>>>       [<000000005fd72335>] load_module+0x227d/0x2420
>>>>>>>       [<00000000ad550cf1>] __do_sys_finit_module+0xd5/0x140
>>>>>>>       [<00000000069a60c5>] do_syscall_64+0x3f/0x90
>>>>>>>       [<00000000c5e0d521>] entry_SYSCALL_64_after_hwframe+0x63/0xcd
>>>>>>>
>>>>>>> Fixes: ed9eccbe8970 ("Staging: add comedi core")
>>>>>>> Signed-off-by: Shang XiaoJing <shangxiaojing@huawei.com>
>>>>>>> ---
>>>>>>>    drivers/comedi/comedi_fops.c | 5 ++++-
>>>>>>>    1 file changed, 4 insertions(+), 1 deletion(-)
>>>>>>>
>>>>>>> diff --git a/drivers/comedi/comedi_fops.c
>>>>>>> b/drivers/comedi/comedi_fops.c
>>>>>>> index e2114bcf815a..2c508c2cf6f6 100644
>>>>>>> --- a/drivers/comedi/comedi_fops.c
>>>>>>> +++ b/drivers/comedi/comedi_fops.c
>>>>>>> @@ -3379,8 +3379,11 @@ static int __init comedi_init(void)
>>>>>>>        retval = cdev_add(&comedi_cdev, MKDEV(COMEDI_MAJOR, 0),
>>>>>>>                  COMEDI_NUM_MINORS);
>>>>>>> -    if (retval)
>>>>>>> +    if (retval) {
>>>>>>> +        kfree_const(comedi_cdev.kobj.name);
>>>>>>> +        comedi_cdev.kobj.name = NULL;
>>>>>>>            goto out_unregister_chrdev_region;
>>>>>>> +    }
>>>>>>
>>>>>> A driver should never have to poke around in the internals of a cdev
>>>>>> object like this.  Please fix the cdev core to not need this if
>>>>>> cdev_add() fails.
>>>>
>>>> Or at least there should be a function that can be called to undo
>>>> the allocations of kobject_set_name().
>>>
>>> Looking at it a bit more, cdev_init() calls kobject_init(), and
>>> kobject_init() requires a matching call to kobject_put().  Nothing is
>>> calling kobject_put() in this situation.  Calling cdev_del() will call
>>> kobject_put(), so is that the correct way to clean up after cdev_init()
>>> if the call to cdev_add() fails?
>>>
>>
>> Some cdev call cdev_del() when cdev_add() failed (like init_dvbdev()), and
>> at that time the cdev_unmap() in cdev_del() won't do anything due to the
>> failure of cdev_add(), which is calling the kobject_put() when cdev_add()
>> failed. But I'm not sure which one is better.
> 
> My point is that no one calling the cdev_add() call should have to do
> this type of "cleanup"  The cdev code should do it automatically, we
> don't want to have to audit every user of cdev_add() today, and in the
> future for forever, to ensure they got it right.
> 
> Let's fix it up in the cdev code itself please.  The kobject in a cdev
> is a very odd thing, it's not the "normal" type of kobject that you
> expect, so the cdev code should handle all of that on its own and that
> should not "leak" into any caller.
> 

ok, I'll fix in cdev code and send v2.

Thanks,
-- 
Shang XiaoJing

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

end of thread, other threads:[~2022-11-02  6:06 UTC | newest]

Thread overview: 11+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-11-01  3:21 [PATCH] comedi: Fix potential memory leak in comedi_init() Shang XiaoJing
2022-11-01  4:45 ` Greg KH
2022-11-01  6:16   ` shangxiaojing
2022-11-01 11:40     ` Ian Abbott
2022-11-01 11:57       ` shangxiaojing
2022-11-01 15:59         ` Ian Abbott
2022-11-02  2:41           ` shangxiaojing
2022-11-01 16:41       ` Ian Abbott
2022-11-02  2:51         ` shangxiaojing
2022-11-02  2:59           ` Greg KH
2022-11-02  6:06             ` shangxiaojing

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.