stat.c (836fb7e7b978e5f3b8b52e40838ddc50264723f0) stat.c (7955119e02d9fdf78a39fba8073f19ca6152613e)
1/*
2 * linux/fs/stat.c
3 *
4 * Copyright (C) 1991, 1992 Linus Torvalds
5 */
6
7#include <linux/export.h>
8#include <linux/mm.h>

--- 286 unchanged lines hidden (view full) ---

295}
296
297SYSCALL_DEFINE4(readlinkat, int, dfd, const char __user *, pathname,
298 char __user *, buf, int, bufsiz)
299{
300 struct path path;
301 int error;
302 int empty = 0;
1/*
2 * linux/fs/stat.c
3 *
4 * Copyright (C) 1991, 1992 Linus Torvalds
5 */
6
7#include <linux/export.h>
8#include <linux/mm.h>

--- 286 unchanged lines hidden (view full) ---

295}
296
297SYSCALL_DEFINE4(readlinkat, int, dfd, const char __user *, pathname,
298 char __user *, buf, int, bufsiz)
299{
300 struct path path;
301 int error;
302 int empty = 0;
303 unsigned int lookup_flags = LOOKUP_EMPTY;
303
304 if (bufsiz <= 0)
305 return -EINVAL;
306
304
305 if (bufsiz <= 0)
306 return -EINVAL;
307
307 error = user_path_at_empty(dfd, pathname, LOOKUP_EMPTY, &path, &empty);
308retry:
309 error = user_path_at_empty(dfd, pathname, lookup_flags, &path, &empty);
308 if (!error) {
309 struct inode *inode = path.dentry->d_inode;
310
311 error = empty ? -ENOENT : -EINVAL;
312 if (inode->i_op->readlink) {
313 error = security_inode_readlink(path.dentry);
314 if (!error) {
315 touch_atime(&path);
316 error = inode->i_op->readlink(path.dentry,
317 buf, bufsiz);
318 }
319 }
320 path_put(&path);
310 if (!error) {
311 struct inode *inode = path.dentry->d_inode;
312
313 error = empty ? -ENOENT : -EINVAL;
314 if (inode->i_op->readlink) {
315 error = security_inode_readlink(path.dentry);
316 if (!error) {
317 touch_atime(&path);
318 error = inode->i_op->readlink(path.dentry,
319 buf, bufsiz);
320 }
321 }
322 path_put(&path);
323 if (retry_estale(error, lookup_flags)) {
324 lookup_flags |= LOOKUP_REVAL;
325 goto retry;
326 }
321 }
322 return error;
323}
324
325SYSCALL_DEFINE3(readlink, const char __user *, path, char __user *, buf,
326 int, bufsiz)
327{
328 return sys_readlinkat(AT_FDCWD, path, buf, bufsiz);

--- 152 unchanged lines hidden ---
327 }
328 return error;
329}
330
331SYSCALL_DEFINE3(readlink, const char __user *, path, char __user *, buf,
332 int, bufsiz)
333{
334 return sys_readlinkat(AT_FDCWD, path, buf, bufsiz);

--- 152 unchanged lines hidden ---