aboutsummaryrefslogtreecommitdiffstats
diff options
authorGreg Kroah-Hartman <gregkh@suse.de>2010-07-08 16:05:28 -0700
committerGreg Kroah-Hartman <gregkh@suse.de>2010-07-08 16:05:28 -0700
commit0ba5c7e4cee99a0cc5fb557c16ae5ba190d7117f (patch)
tree5a1ca7dc894aec5edb13950080c525a4d9fc1f1f
parentf62de6be18b4ef56cc35f794235668a5e5865636 (diff)
downloadpatches-0ba5c7e4cee99a0cc5fb557c16ae5ba190d7117f.tar.gz
sysfs fix
-rw-r--r--driver-core.current/sysfs-don-t-allow-the-creation-of-symlinks-we-can-t-remove.patch81
-rw-r--r--series2
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)
diff --git a/series b/series
index 811bad414fc6fe..ff207a1b92789c 100644
--- a/series
+++ b/series
@@ -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
+