stat.c (e994defb7b6813ba6fa7a2a36e86d2455ad1dc35) | stat.c (a52dd971f947893bc7735396c74cfa591f0a7558) |
---|---|
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> --- 43 unchanged lines hidden (view full) --- 52 generic_fillattr(inode, stat); 53 return 0; 54} 55 56EXPORT_SYMBOL(vfs_getattr); 57 58int vfs_fstat(unsigned int fd, struct kstat *stat) 59{ | 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> --- 43 unchanged lines hidden (view full) --- 52 generic_fillattr(inode, stat); 53 return 0; 54} 55 56EXPORT_SYMBOL(vfs_getattr); 57 58int vfs_fstat(unsigned int fd, struct kstat *stat) 59{ |
60 int fput_needed; 61 struct file *f = fget_light(fd, &fput_needed); | 60 struct file *f = fget(fd); |
62 int error = -EBADF; 63 64 if (f) { 65 error = vfs_getattr(f->f_path.mnt, f->f_path.dentry, stat); | 61 int error = -EBADF; 62 63 if (f) { 64 error = vfs_getattr(f->f_path.mnt, f->f_path.dentry, stat); |
66 fput_light(f, fput_needed); | 65 fput(f); |
67 } 68 return error; 69} 70EXPORT_SYMBOL(vfs_fstat); 71 72int vfs_fstatat(int dfd, const char __user *filename, struct kstat *stat, 73 int flag) 74{ --- 111 unchanged lines hidden (view full) --- 186 if (!error) 187 error = cp_old_stat(&stat, statbuf); 188 189 return error; 190} 191 192#endif /* __ARCH_WANT_OLD_STAT */ 193 | 66 } 67 return error; 68} 69EXPORT_SYMBOL(vfs_fstat); 70 71int vfs_fstatat(int dfd, const char __user *filename, struct kstat *stat, 72 int flag) 73{ --- 111 unchanged lines hidden (view full) --- 185 if (!error) 186 error = cp_old_stat(&stat, statbuf); 187 188 return error; 189} 190 191#endif /* __ARCH_WANT_OLD_STAT */ 192 |
193#if BITS_PER_LONG == 32 194# define choose_32_64(a,b) a 195#else 196# define choose_32_64(a,b) b 197#endif 198 199#define valid_dev(x) choose_32_64(old_valid_dev,new_valid_dev)(x) 200#define encode_dev(x) choose_32_64(old_encode_dev,new_encode_dev)(x) 201 |
|
194static int cp_new_stat(struct kstat *stat, struct stat __user *statbuf) 195{ 196 struct stat tmp; 197 | 202static int cp_new_stat(struct kstat *stat, struct stat __user *statbuf) 203{ 204 struct stat tmp; 205 |
206 if (!valid_dev(stat->dev) || !valid_dev(stat->rdev)) 207 return -EOVERFLOW; |
|
198#if BITS_PER_LONG == 32 | 208#if BITS_PER_LONG == 32 |
199 if (!old_valid_dev(stat->dev) || !old_valid_dev(stat->rdev)) | 209 if (stat->size > MAX_NON_LFS) |
200 return -EOVERFLOW; | 210 return -EOVERFLOW; |
201#else 202 if (!new_valid_dev(stat->dev) || !new_valid_dev(stat->rdev)) 203 return -EOVERFLOW; | |
204#endif 205 206 memset(&tmp, 0, sizeof(tmp)); | 211#endif 212 213 memset(&tmp, 0, sizeof(tmp)); |
207#if BITS_PER_LONG == 32 208 tmp.st_dev = old_encode_dev(stat->dev); 209#else 210 tmp.st_dev = new_encode_dev(stat->dev); 211#endif | 214 tmp.st_dev = encode_dev(stat->dev); |
212 tmp.st_ino = stat->ino; 213 if (sizeof(tmp.st_ino) < sizeof(stat->ino) && tmp.st_ino != stat->ino) 214 return -EOVERFLOW; 215 tmp.st_mode = stat->mode; 216 tmp.st_nlink = stat->nlink; 217 if (tmp.st_nlink != stat->nlink) 218 return -EOVERFLOW; 219 SET_UID(tmp.st_uid, stat->uid); 220 SET_GID(tmp.st_gid, stat->gid); | 215 tmp.st_ino = stat->ino; 216 if (sizeof(tmp.st_ino) < sizeof(stat->ino) && tmp.st_ino != stat->ino) 217 return -EOVERFLOW; 218 tmp.st_mode = stat->mode; 219 tmp.st_nlink = stat->nlink; 220 if (tmp.st_nlink != stat->nlink) 221 return -EOVERFLOW; 222 SET_UID(tmp.st_uid, stat->uid); 223 SET_GID(tmp.st_gid, stat->gid); |
221#if BITS_PER_LONG == 32 222 tmp.st_rdev = old_encode_dev(stat->rdev); 223#else 224 tmp.st_rdev = new_encode_dev(stat->rdev); 225#endif 226#if BITS_PER_LONG == 32 227 if (stat->size > MAX_NON_LFS) 228 return -EOVERFLOW; 229#endif | 224 tmp.st_rdev = encode_dev(stat->rdev); |
230 tmp.st_size = stat->size; 231 tmp.st_atime = stat->atime.tv_sec; 232 tmp.st_mtime = stat->mtime.tv_sec; 233 tmp.st_ctime = stat->ctime.tv_sec; 234#ifdef STAT_HAVE_NSEC 235 tmp.st_atime_nsec = stat->atime.tv_nsec; 236 tmp.st_mtime_nsec = stat->mtime.tv_nsec; 237 tmp.st_ctime_nsec = stat->ctime.tv_nsec; --- 235 unchanged lines hidden --- | 225 tmp.st_size = stat->size; 226 tmp.st_atime = stat->atime.tv_sec; 227 tmp.st_mtime = stat->mtime.tv_sec; 228 tmp.st_ctime = stat->ctime.tv_sec; 229#ifdef STAT_HAVE_NSEC 230 tmp.st_atime_nsec = stat->atime.tv_nsec; 231 tmp.st_mtime_nsec = stat->mtime.tv_nsec; 232 tmp.st_ctime_nsec = stat->ctime.tv_nsec; --- 235 unchanged lines hidden --- |