From 19df5f5bace7dcc808dd7159337097ec47290080 Mon Sep 17 00:00:00 2001 From: "Aneesh Kumar K.V" Date: Sat, 29 Jan 2011 18:43:42 +0530 Subject: [PATCH] --- yaml --- r: 234288 b: refs/heads/master c: 11a7b371b64ef39fc5fb1b6f2218eef7c4d035e3 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/fs/namei.c | 20 ++++++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index a50c5daed411..631842d0c750 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 326be7b484843988afe57566b627fb7a70beac56 +refs/heads/master: 11a7b371b64ef39fc5fb1b6f2218eef7c4d035e3 diff --git a/trunk/fs/namei.c b/trunk/fs/namei.c index 9d4f32700179..c9b7f5b7e92a 100644 --- a/trunk/fs/namei.c +++ b/trunk/fs/namei.c @@ -2945,15 +2945,27 @@ SYSCALL_DEFINE5(linkat, int, olddfd, const char __user *, oldname, struct dentry *new_dentry; struct nameidata nd; struct path old_path; + int how = 0; int error; char *to; - if ((flags & ~AT_SYMLINK_FOLLOW) != 0) + if ((flags & ~(AT_SYMLINK_FOLLOW | AT_EMPTY_PATH)) != 0) return -EINVAL; + /* + * To use null names we require CAP_DAC_READ_SEARCH + * This ensures that not everyone will be able to create + * handlink using the passed filedescriptor. + */ + if (flags & AT_EMPTY_PATH) { + if (!capable(CAP_DAC_READ_SEARCH)) + return -ENOENT; + how = LOOKUP_EMPTY; + } + + if (flags & AT_SYMLINK_FOLLOW) + how |= LOOKUP_FOLLOW; - error = user_path_at(olddfd, oldname, - flags & AT_SYMLINK_FOLLOW ? LOOKUP_FOLLOW : 0, - &old_path); + error = user_path_at(olddfd, oldname, how, &old_path); if (error) return error;