stat.c (8d3c202be23c5a915f7053ebd4e96f44700c6a62) stat.c (2d8f30380ab8c706f4e0a8f1aaa22b5886e9ac8a)
1/*
2 * linux/fs/stat.c
3 *
4 * Copyright (C) 1991, 1992 Linus Torvalds
5 */
6
7#include <linux/module.h>
8#include <linux/mm.h>

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

52 generic_fillattr(inode, stat);
53 return 0;
54}
55
56EXPORT_SYMBOL(vfs_getattr);
57
58int vfs_stat_fd(int dfd, char __user *name, struct kstat *stat)
59{
1/*
2 * linux/fs/stat.c
3 *
4 * Copyright (C) 1991, 1992 Linus Torvalds
5 */
6
7#include <linux/module.h>
8#include <linux/mm.h>

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

52 generic_fillattr(inode, stat);
53 return 0;
54}
55
56EXPORT_SYMBOL(vfs_getattr);
57
58int vfs_stat_fd(int dfd, char __user *name, struct kstat *stat)
59{
60 struct nameidata nd;
60 struct path path;
61 int error;
62
61 int error;
62
63 error = __user_walk_fd(dfd, name, LOOKUP_FOLLOW, &nd);
63 error = user_path_at(dfd, name, LOOKUP_FOLLOW, &path);
64 if (!error) {
64 if (!error) {
65 error = vfs_getattr(nd.path.mnt, nd.path.dentry, stat);
66 path_put(&nd.path);
65 error = vfs_getattr(path.mnt, path.dentry, stat);
66 path_put(&path);
67 }
68 return error;
69}
70
71int vfs_stat(char __user *name, struct kstat *stat)
72{
73 return vfs_stat_fd(AT_FDCWD, name, stat);
74}
75
76EXPORT_SYMBOL(vfs_stat);
77
78int vfs_lstat_fd(int dfd, char __user *name, struct kstat *stat)
79{
67 }
68 return error;
69}
70
71int vfs_stat(char __user *name, struct kstat *stat)
72{
73 return vfs_stat_fd(AT_FDCWD, name, stat);
74}
75
76EXPORT_SYMBOL(vfs_stat);
77
78int vfs_lstat_fd(int dfd, char __user *name, struct kstat *stat)
79{
80 struct nameidata nd;
80 struct path path;
81 int error;
82
81 int error;
82
83 error = __user_walk_fd(dfd, name, 0, &nd);
83 error = user_path_at(dfd, name, 0, &path);
84 if (!error) {
84 if (!error) {
85 error = vfs_getattr(nd.path.mnt, nd.path.dentry, stat);
86 path_put(&nd.path);
85 error = vfs_getattr(path.mnt, path.dentry, stat);
86 path_put(&path);
87 }
88 return error;
89}
90
91int vfs_lstat(char __user *name, struct kstat *stat)
92{
93 return vfs_lstat_fd(AT_FDCWD, name, stat);
94}

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

286 int error = vfs_fstat(fd, &stat);
287
288 if (!error)
289 error = cp_new_stat(&stat, statbuf);
290
291 return error;
292}
293
87 }
88 return error;
89}
90
91int vfs_lstat(char __user *name, struct kstat *stat)
92{
93 return vfs_lstat_fd(AT_FDCWD, name, stat);
94}

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

286 int error = vfs_fstat(fd, &stat);
287
288 if (!error)
289 error = cp_new_stat(&stat, statbuf);
290
291 return error;
292}
293
294asmlinkage long sys_readlinkat(int dfd, const char __user *path,
294asmlinkage long sys_readlinkat(int dfd, const char __user *pathname,
295 char __user *buf, int bufsiz)
296{
295 char __user *buf, int bufsiz)
296{
297 struct nameidata nd;
297 struct path path;
298 int error;
299
300 if (bufsiz <= 0)
301 return -EINVAL;
302
298 int error;
299
300 if (bufsiz <= 0)
301 return -EINVAL;
302
303 error = __user_walk_fd(dfd, path, 0, &nd);
303 error = user_path_at(dfd, pathname, 0, &path);
304 if (!error) {
304 if (!error) {
305 struct inode *inode = nd.path.dentry->d_inode;
305 struct inode *inode = path.dentry->d_inode;
306
307 error = -EINVAL;
308 if (inode->i_op && inode->i_op->readlink) {
306
307 error = -EINVAL;
308 if (inode->i_op && inode->i_op->readlink) {
309 error = security_inode_readlink(nd.path.dentry);
309 error = security_inode_readlink(path.dentry);
310 if (!error) {
310 if (!error) {
311 touch_atime(nd.path.mnt, nd.path.dentry);
312 error = inode->i_op->readlink(nd.path.dentry,
311 touch_atime(path.mnt, path.dentry);
312 error = inode->i_op->readlink(path.dentry,
313 buf, bufsiz);
314 }
315 }
313 buf, bufsiz);
314 }
315 }
316 path_put(&nd.path);
316 path_put(&path);
317 }
318 return error;
319}
320
321asmlinkage long sys_readlink(const char __user *path, char __user *buf,
322 int bufsiz)
323{
324 return sys_readlinkat(AT_FDCWD, path, buf, bufsiz);

--- 147 unchanged lines hidden ---
317 }
318 return error;
319}
320
321asmlinkage long sys_readlink(const char __user *path, char __user *buf,
322 int bufsiz)
323{
324 return sys_readlinkat(AT_FDCWD, path, buf, bufsiz);

--- 147 unchanged lines hidden ---