summaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
authorAl Viro <viro@zeniv.linux.org.uk>2012-11-29 22:17:21 -0500
committerAl Viro <viro@zeniv.linux.org.uk>2012-11-29 22:17:21 -0500
commit21d8a15ac333b05f1fecdf9fdc30996be2e11d60 (patch)
tree082be97bf4196a0e4ab65300d1c907c12d86aabd /fs
parent0903a0c8491c1e987dfc6eb294199a36760398bc (diff)
downloadlinux-21d8a15ac333b05f1fecdf9fdc30996be2e11d60.tar.gz
linux-21d8a15ac333b05f1fecdf9fdc30996be2e11d60.tar.bz2
linux-21d8a15ac333b05f1fecdf9fdc30996be2e11d60.zip
lookup_one_len: don't accept . and ..
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs')
-rw-r--r--fs/namei.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/fs/namei.c b/fs/namei.c
index 937f9d50c84b..5f4cdf3ad913 100644
--- a/fs/namei.c
+++ b/fs/namei.c
@@ -2131,6 +2131,11 @@ struct dentry *lookup_one_len(const char *name, struct dentry *base, int len)
if (!len)
return ERR_PTR(-EACCES);
+ if (unlikely(name[0] == '.')) {
+ if (len < 2 || (len == 2 && name[1] == '.'))
+ return ERR_PTR(-EACCES);
+ }
+
while (len--) {
c = *(const unsigned char *)name++;
if (c == '/' || c == '\0')