diff mbox

driver: dont update dev_name if it is not changed

Message ID 49EA3176.4010901@kernel.org (mailing list archive)
State Rejected, archived
Headers show

Commit Message

Yinghai Lu April 18, 2009, 8 p.m. UTC
notice one system /proc/iomem some entries missed the name for pci_devices

it turns that dev->dev.kobj name is changed after device_add.

[Impact: fix corrupted names in /proc/iomem ]

Signed-off-by: Yinghai Lu <yinghai@kernel.org>

---
 lib/kobject.c |   13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Comments

Ingo Molnar April 18, 2009, 8:11 p.m. UTC | #1
* Yinghai Lu <yinghai@kernel.org> wrote:

> notice one system /proc/iomem some entries missed the name for pci_devices
> 
> it turns that dev->dev.kobj name is changed after device_add.
> 
> [Impact: fix corrupted names in /proc/iomem ]
> 
> Signed-off-by: Yinghai Lu <yinghai@kernel.org>
> 
> ---
>  lib/kobject.c |   13 +++++++++++--
>  1 file changed, 11 insertions(+), 2 deletions(-)
> 
> Index: linux-2.6/lib/kobject.c
> ===================================================================
> --- linux-2.6.orig/lib/kobject.c
> +++ linux-2.6/lib/kobject.c
> @@ -216,12 +216,21 @@ int kobject_set_name_vargs(struct kobjec
>  				  va_list vargs)
>  {
>  	const char *old_name = kobj->name;
> +	char *new_name;
>  	char *s;
>  
> -	kobj->name = kvasprintf(GFP_KERNEL, fmt, vargs);
> -	if (!kobj->name)
> +	new_name = kvasprintf(GFP_KERNEL, fmt, vargs);
> +	if (!new_name)
>  		return -ENOMEM;
>  
> +	/* different ? */
> +	if (!strcmp(new_name, old_name)) {
> +		kfree(new_name);
> +		return 0;
> +	}
> +
> +	kobj->name = new_name;
> +
>  	/* ewww... some of these buggers have '/' in the name ... */
>  	while ((s = strchr(kobj->name, '/')))
>  		s[0] = '!';

So we used the old name in the resource code, and the kfree() here 
corrupted the /proc/iomem output?

This still looks fragile to me ...

	Ingo
--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Yinghai Lu April 18, 2009, 8:20 p.m. UTC | #2
Ingo Molnar wrote:
> * Yinghai Lu <yinghai@kernel.org> wrote:
> 
>> notice one system /proc/iomem some entries missed the name for pci_devices
>>
>> it turns that dev->dev.kobj name is changed after device_add.
>>
>> [Impact: fix corrupted names in /proc/iomem ]
>>
>> Signed-off-by: Yinghai Lu <yinghai@kernel.org>
>>
>> ---
>>  lib/kobject.c |   13 +++++++++++--
>>  1 file changed, 11 insertions(+), 2 deletions(-)
>>
>> Index: linux-2.6/lib/kobject.c
>> ===================================================================
>> --- linux-2.6.orig/lib/kobject.c
>> +++ linux-2.6/lib/kobject.c
>> @@ -216,12 +216,21 @@ int kobject_set_name_vargs(struct kobjec
>>  				  va_list vargs)
>>  {
>>  	const char *old_name = kobj->name;
>> +	char *new_name;
>>  	char *s;
>>  
>> -	kobj->name = kvasprintf(GFP_KERNEL, fmt, vargs);
>> -	if (!kobj->name)
>> +	new_name = kvasprintf(GFP_KERNEL, fmt, vargs);
>> +	if (!new_name)
>>  		return -ENOMEM;
>>  
>> +	/* different ? */
>> +	if (!strcmp(new_name, old_name)) {
>> +		kfree(new_name);
>> +		return 0;
>> +	}
>> +
>> +	kobj->name = new_name;
>> +
>>  	/* ewww... some of these buggers have '/' in the name ... */
>>  	while ((s = strchr(kobj->name, '/')))
>>  		s[0] = '!';
> 
> So we used the old name in the resource code, and the kfree() here 
> corrupted the /proc/iomem output?
> 
if it is not changed, we still use old_name. and new_name get freed

YH

--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Ingo Molnar April 18, 2009, 8:27 p.m. UTC | #3
* Yinghai Lu <yinghai@kernel.org> wrote:

> Ingo Molnar wrote:
> > * Yinghai Lu <yinghai@kernel.org> wrote:
> > 
> >> notice one system /proc/iomem some entries missed the name for pci_devices
> >>
> >> it turns that dev->dev.kobj name is changed after device_add.
> >>
> >> [Impact: fix corrupted names in /proc/iomem ]
> >>
> >> Signed-off-by: Yinghai Lu <yinghai@kernel.org>
> >>
> >> ---
> >>  lib/kobject.c |   13 +++++++++++--
> >>  1 file changed, 11 insertions(+), 2 deletions(-)
> >>
> >> Index: linux-2.6/lib/kobject.c
> >> ===================================================================
> >> --- linux-2.6.orig/lib/kobject.c
> >> +++ linux-2.6/lib/kobject.c
> >> @@ -216,12 +216,21 @@ int kobject_set_name_vargs(struct kobjec
> >>  				  va_list vargs)
> >>  {
> >>  	const char *old_name = kobj->name;
> >> +	char *new_name;
> >>  	char *s;
> >>  
> >> -	kobj->name = kvasprintf(GFP_KERNEL, fmt, vargs);
> >> -	if (!kobj->name)
> >> +	new_name = kvasprintf(GFP_KERNEL, fmt, vargs);
> >> +	if (!new_name)
> >>  		return -ENOMEM;
> >>  
> >> +	/* different ? */
> >> +	if (!strcmp(new_name, old_name)) {
> >> +		kfree(new_name);
> >> +		return 0;
> >> +	}
> >> +
> >> +	kobj->name = new_name;
> >> +
> >>  	/* ewww... some of these buggers have '/' in the name ... */
> >>  	while ((s = strchr(kobj->name, '/')))
> >>  		s[0] = '!';
> > 
> > So we used the old name in the resource code, and the kfree() here 
> > corrupted the /proc/iomem output?
> > 
> if it is not changed, we still use old_name. and new_name get freed

I know - you are talking about your patch.

But i'm talking about the current, unpatched upstream code. It got a 
string displayed in /proc/iomem that got kfree()d? [and this is why 
the entries vanished?]

That is badness somewhere _else_ (not in the kobject core i think), 
and your patch does not solve the real badness, it works around its 
symptoms AFAICS - like the first patch.

	Ingo
--
To unsubscribe from this list: send the line "unsubscribe linux-pci" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

Index: linux-2.6/lib/kobject.c
===================================================================
--- linux-2.6.orig/lib/kobject.c
+++ linux-2.6/lib/kobject.c
@@ -216,12 +216,21 @@  int kobject_set_name_vargs(struct kobjec
 				  va_list vargs)
 {
 	const char *old_name = kobj->name;
+	char *new_name;
 	char *s;
 
-	kobj->name = kvasprintf(GFP_KERNEL, fmt, vargs);
-	if (!kobj->name)
+	new_name = kvasprintf(GFP_KERNEL, fmt, vargs);
+	if (!new_name)
 		return -ENOMEM;
 
+	/* different ? */
+	if (!strcmp(new_name, old_name)) {
+		kfree(new_name);
+		return 0;
+	}
+
+	kobj->name = new_name;
+
 	/* ewww... some of these buggers have '/' in the name ... */
 	while ((s = strchr(kobj->name, '/')))
 		s[0] = '!';