diff options
| -rw-r--r-- | driver-core.current/sysfs-don-t-allow-the-creation-of-symlinks-we-can-t-remove.patch | 81 | ||||
| -rw-r--r-- | series | 2 |
2 files changed, 83 insertions, 0 deletions
diff --git a/driver-core.current/sysfs-don-t-allow-the-creation-of-symlinks-we-can-t-remove.patch b/driver-core.current/sysfs-don-t-allow-the-creation-of-symlinks-we-can-t-remove.patch new file mode 100644 index 00000000000000..0b09951270d704 --- /dev/null +++ b/driver-core.current/sysfs-don-t-allow-the-creation-of-symlinks-we-can-t-remove.patch @@ -0,0 +1,81 @@ +From ebiederm@xmission.com Thu Jul 8 16:02:17 2010 +From: ebiederm@xmission.com (Eric W. Biederman) +Date: Thu, 08 Jul 2010 09:31:24 -0700 +Subject: sysfs: Don't allow the creation of symlinks we can't remove +To: Greg KH <gregkh@suse.de> +Cc: Andrew Morton <akpm@linux-foundation.org>, "Rafael J. Wysocki" <rjw@sisk.pl>, "Maciej W. Rozycki" <macro@linux-mips.org>, Kay Sievers <kay.sievers@vrfy.org>, Johannes Berg <johannes@sipsolutions.net>, Greg KH <greg@kroah.com> +Message-ID: <m1630q7x5v.fsf_-_@fess.ebiederm.org> + + +Recently my tagged sysfs support revealed a flaw in the device core +that a few rare drivers are running into such that we don't always put +network devices in a class subdirectory named net/. + +Since we are not creating the class directory the network devices wind +up in a non-tagged directory, but the symlinks to the network devices +from /sys/class/net are in a tagged directory. All of which works +until we go to remove or rename the symlink. When we remove or rename +a symlink we look in the namespace of the target of the symlink. +Since the target of the symlink is in a non-tagged sysfs directory we +don't have a namespace to look in, and we fail to remove the symlink. + +Detect this problem up front and simply don't create symlinks we won't +be able to remove later. This prevents symlink leakage and fails in +a much clearer and more understandable way. + +Signed-off-by: Eric W. Biederman <ebiederm@xmission.com> +Cc: Andrew Morton <akpm@linux-foundation.org> +Cc: Rafael J. Wysocki <rjw@sisk.pl> +Cc: Maciej W. Rozycki <macro@linux-mips.org> +Cc: Kay Sievers <kay.sievers@vrfy.org> +Cc: Johannes Berg <johannes@sipsolutions.net> +Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> + +--- + fs/sysfs/symlink.c | 23 ++++++++++++++++++----- + 1 file changed, 18 insertions(+), 5 deletions(-) + +--- a/fs/sysfs/symlink.c ++++ b/fs/sysfs/symlink.c +@@ -28,6 +28,7 @@ static int sysfs_do_create_link(struct k + struct sysfs_dirent *target_sd = NULL; + struct sysfs_dirent *sd = NULL; + struct sysfs_addrm_cxt acxt; ++ enum kobj_ns_type ns_type; + int error; + + BUG_ON(!name); +@@ -58,16 +59,28 @@ static int sysfs_do_create_link(struct k + if (!sd) + goto out_put; + +- if (sysfs_ns_type(parent_sd)) ++ ns_type = sysfs_ns_type(parent_sd); ++ if (ns_type) + sd->s_ns = target->ktype->namespace(target); + sd->s_symlink.target_sd = target_sd; + target_sd = NULL; /* reference is now owned by the symlink */ + + sysfs_addrm_start(&acxt, parent_sd); +- if (warn) +- error = sysfs_add_one(&acxt, sd); +- else +- error = __sysfs_add_one(&acxt, sd); ++ /* Symlinks must be between directories with the same ns_type */ ++ if (ns_type == sysfs_ns_type(sd->s_symlink.target_sd->s_parent)) { ++ if (warn) ++ error = sysfs_add_one(&acxt, sd); ++ else ++ error = __sysfs_add_one(&acxt, sd); ++ } else { ++ error = -EINVAL; ++ WARN(1, KERN_WARNING ++ "sysfs: symlink across ns_types %s/%s -> %s/%s\n", ++ parent_sd->s_name, ++ sd->s_name, ++ sd->s_symlink.target_sd->s_parent->s_name, ++ sd->s_symlink.target_sd->s_name); ++ } + sysfs_addrm_finish(&acxt); + + if (error) @@ -8,6 +8,7 @@ gregkh/gkh-version.patch ################################# # Driver core patches for 2.6.35 ################################# +driver-core.current/sysfs-don-t-allow-the-creation-of-symlinks-we-can-t-remove.patch ################################# # TTY patches for 2.6.35 @@ -188,3 +189,4 @@ usb/usb-musb-do-not-override-dma-mode-in-channel-program.patch # staging stuff is now in the staging-next tree on git.kernel.org + |
