From: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
To: Andrew Morton <akpm@linux-foundation.org>
Cc: linux-security-module@vger.kernel.org,
linux-kernel@vger.kernel.org,
Kentaro Takeda <takedakn@nttdata.co.jp>,
Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>,
Toshiharu Harada <haradats@nttdata.co.jp>
Subject: [TOMOYO #14 (mmotm 2008-12-30-16-05) 03/10] Introduce d_realpath().
Date: Thu, 01 Jan 2009 14:07:44 +0900 [thread overview]
Message-ID: <20090101050940.282118078@I-love.SAKURA.ne.jp> (raw)
In-Reply-To: <20090101050741.372438529@I-love.SAKURA.ne.jp>
[-- Attachment #1: introduce-d_realpath.patch --]
[-- Type: text/plain, Size: 3847 bytes --]
To remove factors that make pathname based access control difficult
(e.g. symbolic links, "..", "//", chroot() etc.), a variant of d_path()
which traverses up to the root of the namespace is needed.
This patch introduces d_realpath(), a variant of d_path().
While d_path() stops traversing at current->fs->root,
d_realpath() doesn't stop traversiong at current->fs->root.
Three differences compared to d_path().
(1) Ignores current process's root directory.
(2) Trailing '/' is added if the pathname refers to a directory.
(3) /proc/PID/ is represented as /proc/self/ if PID equals current->tgid.
Signed-off-by: Kentaro Takeda <takedakn@nttdata.co.jp>
Signed-off-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
Signed-off-by: Toshiharu Harada <haradats@nttdata.co.jp>
---
fs/dcache.c | 84 +++++++++++++++++++++++++++++++++++++++++++++++++
include/linux/dcache.h | 1
2 files changed, 85 insertions(+)
--- linux-2.6.28-mm1.orig/fs/dcache.c
+++ linux-2.6.28-mm1/fs/dcache.c
@@ -32,6 +32,7 @@
#include <linux/seqlock.h>
#include <linux/swap.h>
#include <linux/bootmem.h>
+#include <linux/magic.h>
#include "internal.h"
@@ -1978,6 +1979,89 @@ Elong:
}
/**
+ * d_realpath - Get the realpath of a dentry.
+ *
+ * @path: Pointer to "struct path".
+ * @buffer: Pointer to buffer to return value in.
+ * @buflen: Sizeof @buffer.
+ *
+ * Returns pointer to the realpath on success, an error code othersize.
+ *
+ * If @dentry is a directory, trailing '/' is appended.
+ * /proc/PID/ is replaced by /proc/self/ if PID == task_tgid_nr_ns(current).
+ */
+char *d_realpath(struct path *path, char *buffer, int buflen)
+{
+ struct dentry *dentry = path->dentry;
+ struct vfsmount *vfsmnt = path->mnt;
+ char *end = buffer + buflen;
+
+ spin_lock(&dcache_lock);
+ spin_lock(&vfsmount_lock);
+ if (buflen < 1 || prepend(&end, &buflen, "", 1))
+ goto Elong;
+ /*
+ * Exception: Add trailing '/' for directory.
+ */
+ if (dentry->d_inode && S_ISDIR(dentry->d_inode->i_mode) &&
+ prepend(&end, &buflen, "/", 1))
+ goto Elong;
+ for (;;) {
+ struct dentry *parent;
+ const char *name;
+ int name_len;
+ unsigned long pid;
+
+ if (dentry == vfsmnt->mnt_root || IS_ROOT(dentry)) {
+ /* Global root? */
+ if (vfsmnt->mnt_parent == vfsmnt)
+ break;
+ dentry = vfsmnt->mnt_mountpoint;
+ vfsmnt = vfsmnt->mnt_parent;
+ continue;
+ }
+ parent = dentry->d_parent;
+ prefetch(parent);
+ /*
+ * Exception: Use /proc/self/ rather than /proc/\$/
+ * for current process.
+ */
+ name = dentry->d_name.name;
+ name_len = dentry->d_name.len;
+ if (IS_ROOT(parent) &&
+ parent->d_sb->s_magic == PROC_SUPER_MAGIC &&
+ !strict_strtoul(name, 10, &pid)) {
+ const pid_t tgid
+ = task_tgid_nr_ns(current,
+ dentry->d_sb->s_fs_info);
+ if (tgid && (pid_t) pid == tgid) {
+ name = "self";
+ name_len = 4;
+ }
+ }
+ if (prepend(&end, &buflen, name, name_len))
+ goto Elong;
+ if (prepend(&end, &buflen, "/", 1))
+ goto Elong;
+ dentry = parent;
+ }
+ if (*end == '/') {
+ /* hit the slash */
+ buflen++;
+ end++;
+ }
+ if (prepend_name(&end, &buflen, &dentry->d_name))
+ goto Elong;
+ out:
+ spin_unlock(&vfsmount_lock);
+ spin_unlock(&dcache_lock);
+ return end;
+ Elong:
+ end = ERR_PTR(-ENAMETOOLONG);
+ goto out;
+}
+
+/**
* d_path - return the path of a dentry
* @path: path to report
* @buf: buffer to return value in
--- linux-2.6.28-mm1.orig/include/linux/dcache.h
+++ linux-2.6.28-mm1/include/linux/dcache.h
@@ -305,6 +305,7 @@ extern char *dynamic_dname(struct dentry
extern char *__d_path(const struct path *path, struct path *root, char *, int);
extern char *d_path(const struct path *, char *, int);
extern char *dentry_path(struct dentry *, char *, int);
+extern char *d_realpath(struct path *, char *, int);
/* Allocation counts.. */
--
next prev parent reply other threads:[~2009-01-01 5:22 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-01-01 5:07 [TOMOYO #14 (mmotm 2008-12-30-16-05) 00/10] TOMOYO Linux Tetsuo Handa
2009-01-01 5:07 ` [TOMOYO #14 (mmotm 2008-12-30-16-05) 01/10] Add in_execve flag into task_struct Tetsuo Handa
2009-01-05 8:25 ` James Morris
2009-01-01 5:07 ` [TOMOYO #14 (mmotm 2008-12-30-16-05) 02/10] Singly linked list implementation Tetsuo Handa
2009-01-05 9:07 ` James Morris
2009-01-06 8:13 ` Tetsuo Handa
2009-01-06 9:11 ` James Morris
2009-01-07 6:36 ` Tetsuo Handa
2009-01-07 19:09 ` Serge E. Hallyn
2009-01-08 6:19 ` Tetsuo Handa
2009-01-14 8:57 ` Tetsuo Handa
2009-01-01 5:07 ` Tetsuo Handa [this message]
2009-01-05 9:08 ` [TOMOYO #14 (mmotm 2008-12-30-16-05) 03/10] Introduce d_realpath() James Morris
2009-01-14 8:58 ` Tetsuo Handa
2009-01-01 5:07 ` [TOMOYO #14 (mmotm 2008-12-30-16-05) 04/10] Memory and pathname management functions Tetsuo Handa
2009-01-01 5:07 ` [TOMOYO #14 (mmotm 2008-12-30-16-05) 05/10] Common functions for TOMOYO Linux Tetsuo Handa
2009-01-01 5:07 ` [TOMOYO #14 (mmotm 2008-12-30-16-05) 06/10] File operation restriction part Tetsuo Handa
2009-01-01 5:07 ` [TOMOYO #14 (mmotm 2008-12-30-16-05) 07/10] Domain transition handler Tetsuo Handa
2009-01-01 5:07 ` [TOMOYO #14 (mmotm 2008-12-30-16-05) 08/10] LSM adapter functions Tetsuo Handa
2009-01-01 5:07 ` [TOMOYO #14 (mmotm 2008-12-30-16-05) 09/10] Kconfig and Makefile Tetsuo Handa
2009-01-01 5:07 ` [TOMOYO #14 (mmotm 2008-12-30-16-05) 10/10] MAINTAINERS info Tetsuo Handa
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20090101050940.282118078@I-love.SAKURA.ne.jp \
--to=penguin-kernel@i-love.sakura.ne.jp \
--cc=akpm@linux-foundation.org \
--cc=haradats@nttdata.co.jp \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-security-module@vger.kernel.org \
--cc=takedakn@nttdata.co.jp \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®