diff options
Diffstat (limited to 'fs')
-rw-r--r-- | fs/inotify.c | 13 | ||||
-rw-r--r-- | fs/xattr.c | 2 |
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 | */ |
367 | static int find_inode(const char __user *dirname, struct nameidata *nd) | 367 | static 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) { |