aboutsummaryrefslogtreecommitdiffstats
path: root/fs
diff options
context:
space:
mode:
Diffstat (limited to 'fs')
-rw-r--r--fs/inotify.c13
-rw-r--r--fs/xattr.c2
2 files changed, 11 insertions, 4 deletions
diff --git a/fs/inotify.c b/fs/inotify.c
index bf7ce1d2412b..2fecb7af4a77 100644
--- a/fs/inotify.c
+++ b/fs/inotify.c
@@ -364,11 +364,12 @@ static int inotify_dev_get_wd(struct inotify_device *dev,
364/* 364/*
365 * find_inode - resolve a user-given path to a specific inode and return a nd 365 * find_inode - resolve a user-given path to a specific inode and return a nd
366 */ 366 */
367static int find_inode(const char __user *dirname, struct nameidata *nd) 367static int find_inode(const char __user *dirname, struct nameidata *nd,
368 unsigned flags)
368{ 369{
369 int error; 370 int error;
370 371
371 error = __user_walk(dirname, LOOKUP_FOLLOW, nd); 372 error = __user_walk(dirname, flags, nd);
372 if (error) 373 if (error)
373 return error; 374 return error;
374 /* you can only watch an inode if you have read permissions on it */ 375 /* you can only watch an inode if you have read permissions on it */
@@ -933,6 +934,7 @@ asmlinkage long sys_inotify_add_watch(int fd, const char __user *path, u32 mask)
933 struct file *filp; 934 struct file *filp;
934 int ret, fput_needed; 935 int ret, fput_needed;
935 int mask_add = 0; 936 int mask_add = 0;
937 unsigned flags = 0;
936 938
937 filp = fget_light(fd, &fput_needed); 939 filp = fget_light(fd, &fput_needed);
938 if (unlikely(!filp)) 940 if (unlikely(!filp))
@@ -944,7 +946,12 @@ asmlinkage long sys_inotify_add_watch(int fd, const char __user *path, u32 mask)
944 goto fput_and_out; 946 goto fput_and_out;
945 } 947 }
946 948
947 ret = find_inode(path, &nd); 949 if (!(mask & IN_DONT_FOLLOW))
950 flags |= LOOKUP_FOLLOW;
951 if (mask & IN_ONLYDIR)
952 flags |= LOOKUP_DIRECTORY;
953
954 ret = find_inode(path, &nd, flags);
948 if (unlikely(ret)) 955 if (unlikely(ret))
949 goto fput_and_out; 956 goto fput_and_out;
950 957
diff --git a/fs/xattr.c b/fs/xattr.c
index a9db22557998..bcc2156d4d28 100644
--- a/fs/xattr.c
+++ b/fs/xattr.c
@@ -245,7 +245,7 @@ listxattr(struct dentry *d, char __user *list, size_t size)
245 error = d->d_inode->i_op->listxattr(d, klist, size); 245 error = d->d_inode->i_op->listxattr(d, klist, size);
246 } else { 246 } else {
247 error = security_inode_listsecurity(d->d_inode, klist, size); 247 error = security_inode_listsecurity(d->d_inode, klist, size);
248 if (size && error >= size) 248 if (size && error > size)
249 error = -ERANGE; 249 error = -ERANGE;
250 } 250 }
251 if (error > 0) { 251 if (error > 0) {