stat.c (a52dd971f947893bc7735396c74cfa591f0a7558) stat.c (8529f613b6945f4b5bd8c1b69e42aa1cc51b2eb6)
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>

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

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
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>

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

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
202#ifndef INIT_STRUCT_STAT_PADDING
203# define INIT_STRUCT_STAT_PADDING(st) memset(&st, 0, sizeof(st))
204#endif
205
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;
208#if BITS_PER_LONG == 32
209 if (stat->size > MAX_NON_LFS)
210 return -EOVERFLOW;
211#endif
212
206static int cp_new_stat(struct kstat *stat, struct stat __user *statbuf)
207{
208 struct stat tmp;
209
210 if (!valid_dev(stat->dev) || !valid_dev(stat->rdev))
211 return -EOVERFLOW;
212#if BITS_PER_LONG == 32
213 if (stat->size > MAX_NON_LFS)
214 return -EOVERFLOW;
215#endif
216
213 memset(&tmp, 0, sizeof(tmp));
217 INIT_STRUCT_STAT_PADDING(tmp);
214 tmp.st_dev = encode_dev(stat->dev);
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;

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

318{
319 return sys_readlinkat(AT_FDCWD, path, buf, bufsiz);
320}
321
322
323/* ---------- LFS-64 ----------- */
324#ifdef __ARCH_WANT_STAT64
325
218 tmp.st_dev = encode_dev(stat->dev);
219 tmp.st_ino = stat->ino;
220 if (sizeof(tmp.st_ino) < sizeof(stat->ino) && tmp.st_ino != stat->ino)
221 return -EOVERFLOW;
222 tmp.st_mode = stat->mode;
223 tmp.st_nlink = stat->nlink;
224 if (tmp.st_nlink != stat->nlink)
225 return -EOVERFLOW;

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

322{
323 return sys_readlinkat(AT_FDCWD, path, buf, bufsiz);
324}
325
326
327/* ---------- LFS-64 ----------- */
328#ifdef __ARCH_WANT_STAT64
329
330#ifndef INIT_STRUCT_STAT64_PADDING
331# define INIT_STRUCT_STAT64_PADDING(st) memset(&st, 0, sizeof(st))
332#endif
333
326static long cp_new_stat64(struct kstat *stat, struct stat64 __user *statbuf)
327{
328 struct stat64 tmp;
329
334static long cp_new_stat64(struct kstat *stat, struct stat64 __user *statbuf)
335{
336 struct stat64 tmp;
337
330 memset(&tmp, 0, sizeof(struct stat64));
338 INIT_STRUCT_STAT64_PADDING(tmp);
331#ifdef CONFIG_MIPS
332 /* mips has weird padding, so we don't get 64 bits there */
333 if (!new_valid_dev(stat->dev) || !new_valid_dev(stat->rdev))
334 return -EOVERFLOW;
335 tmp.st_dev = new_encode_dev(stat->dev);
336 tmp.st_rdev = new_encode_dev(stat->rdev);
337#else
338 tmp.st_dev = huge_encode_dev(stat->dev);

--- 129 unchanged lines hidden ---
339#ifdef CONFIG_MIPS
340 /* mips has weird padding, so we don't get 64 bits there */
341 if (!new_valid_dev(stat->dev) || !new_valid_dev(stat->rdev))
342 return -EOVERFLOW;
343 tmp.st_dev = new_encode_dev(stat->dev);
344 tmp.st_rdev = new_encode_dev(stat->rdev);
345#else
346 tmp.st_dev = huge_encode_dev(stat->dev);

--- 129 unchanged lines hidden ---