From: Stephen Hemminger <hidden> Date: 2004-02-13 18:30:09
quoted hunk
[0 tv@tao /sys/class/misc]$ uname -a
Linux tao 2.6.2-rc2 #6 Mon Jan 26 10:54:50 EET 2004 i686 GNU/Linux
[0 tv@tao /sys/class/misc]$ echo *
intermezzo net/tun psaux rtc uinput
[0 tv@tao /sys/class/misc]$
Seems like that's all because of this:
static struct miscdevice tun_miscdev = {
.minor = TUN_MINOR,
.name = "net/tun",
.fops = &tun_fops
};
Name is apparently meant to be a filename, not a path.
Don't know what should be done to it; maybe
static struct miscdevice tun_miscdev = {
.minor = TUN_MINOR,
.name = "tun",
.fops = &tun_fops,
.devfs_name = "misc/net/tun",
};
But I havent tried that out.
I'd suggest this, to flush out all the problems. Later,
it can be changed to return -EINVAL or BUG_ON.
--- 1.26/drivers/char/misc.c Thu Jan 15 13:05:56 2004+++ edited/misc.c Fri Feb 13 19:35:45 2004
@@ -212,6 +212,9 @@intmisc_register(structmiscdevice*misc){structmiscdevice*c;++if(misc->name&&strchr(misc->name,'/'))+printk("%s: name contains slash when registering %s.\n",__func__,misc->name);down(&misc_sem);list_for_each_entry(c,&misc_list,list){
Don't fix it just for misc_register, the fix needs to go into class_device.
diff -Nru a/drivers/base/class.c b/drivers/base/class.c
--- a/drivers/base/class.c Fri Feb 13 10:23:36 2004+++ b/drivers/base/class.c Fri Feb 13 10:23:36 2004
From: Stephen Hemminger <hidden> Date: 2004-02-13 19:21:18
The patch to check for / in class_device is not enough.
The misc_register function needs to check return value of the things it calls!
diff -Nru a/drivers/char/misc.c b/drivers/char/misc.c
--- a/drivers/char/misc.c Fri Feb 13 11:15:29 2004+++ b/drivers/char/misc.c Fri Feb 13 11:15:29 2004
On Fri, Feb 13, 2004 at 10:27:55AM -0800, Stephen Hemminger wrote:
quoted
[0 tv@tao /sys/class/misc]$ uname -a
Linux tao 2.6.2-rc2 #6 Mon Jan 26 10:54:50 EET 2004 i686 GNU/Linux
[0 tv@tao /sys/class/misc]$ echo *
intermezzo net/tun psaux rtc uinput
[0 tv@tao /sys/class/misc]$
Seems like that's all because of this:
static struct miscdevice tun_miscdev = {
.minor = TUN_MINOR,
.name = "net/tun",
.fops = &tun_fops
};
Name is apparently meant to be a filename, not a path.
Don't know what should be done to it; maybe
static struct miscdevice tun_miscdev = {
.minor = TUN_MINOR,
.name = "tun",
.fops = &tun_fops,
.devfs_name = "misc/net/tun",
};
But I havent tried that out.
I'd suggest this, to flush out all the problems. Later,
it can be changed to return -EINVAL or BUG_ON.
--- 1.26/drivers/char/misc.c Thu Jan 15 13:05:56 2004+++ edited/misc.c Fri Feb 13 19:35:45 2004
@@ -212,6 +212,9 @@intmisc_register(structmiscdevice*misc){structmiscdevice*c;++if(misc->name&&strchr(misc->name,'/'))+printk("%s: name contains slash when registering %s.\n",__func__,misc->name);down(&misc_sem);list_for_each_entry(c,&misc_list,list){
Don't fix it just for misc_register, the fix needs to go into class_device.
No, the "fix" is to just not do this in the driver. I'm not going to
apply this patch, sorry.
thanks,
greg k-h
From: Stephen Hemminger <hidden> Date: 2004-02-13 20:46:12
No, the "fix" is to just not do this in the driver. I'm not going to
apply this patch, sorry.
thanks,
greg k-h
Bah, kernel API's should check there arguments. One of my peeve's about sysfs is
that it is far too lazy about checking it's inputs. Especially, when the restrictions
are not well documented, the code needs to validate.
On Fri, Feb 13, 2004 at 12:45:55PM -0800, Stephen Hemminger wrote:
quoted
No, the "fix" is to just not do this in the driver. I'm not going to
apply this patch, sorry.
thanks,
greg k-h
Bah, kernel API's should check there arguments. One of my peeve's about sysfs is
that it is far too lazy about checking it's inputs. Especially, when the restrictions
are not well documented, the code needs to validate.
But isn't a '/' character a valid character for a file or directory
name? :)
Yeah, it's pathalogical, but why burden the core from something that is
instantly obvious to the developer as a "wrong" thing to do?
It's much easier to see, "Oh, my driver created a stupid directory name
because of the string I told it to use", than "why in the world is the
driver core rejecting my register call when I _know_ it's a correct
structure".
thanks,
greg k-h