diff options
-rw-r--r-- | arch/x86/include/asm/stat.h | 21 | ||||
-rw-r--r-- | fs/stat.c | 12 |
2 files changed, 31 insertions, 2 deletions
diff --git a/arch/x86/include/asm/stat.h b/arch/x86/include/asm/stat.h index e0b1d9bbcbc6..7b3ddc348585 100644 --- a/arch/x86/include/asm/stat.h +++ b/arch/x86/include/asm/stat.h | |||
@@ -25,6 +25,12 @@ struct stat { | |||
25 | unsigned long __unused5; | 25 | unsigned long __unused5; |
26 | }; | 26 | }; |
27 | 27 | ||
28 | /* We don't need to memset the whole thing just to initialize the padding */ | ||
29 | #define INIT_STRUCT_STAT_PADDING(st) do { \ | ||
30 | st.__unused4 = 0; \ | ||
31 | st.__unused5 = 0; \ | ||
32 | } while (0) | ||
33 | |||
28 | #define STAT64_HAS_BROKEN_ST_INO 1 | 34 | #define STAT64_HAS_BROKEN_ST_INO 1 |
29 | 35 | ||
30 | /* This matches struct stat64 in glibc2.1, hence the absolutely | 36 | /* This matches struct stat64 in glibc2.1, hence the absolutely |
@@ -63,6 +69,12 @@ struct stat64 { | |||
63 | unsigned long long st_ino; | 69 | unsigned long long st_ino; |
64 | }; | 70 | }; |
65 | 71 | ||
72 | /* We don't need to memset the whole thing just to initialize the padding */ | ||
73 | #define INIT_STRUCT_STAT64_PADDING(st) do { \ | ||
74 | memset(&st.__pad0, 0, sizeof(st.__pad0)); \ | ||
75 | memset(&st.__pad3, 0, sizeof(st.__pad3)); \ | ||
76 | } while (0) | ||
77 | |||
66 | #else /* __i386__ */ | 78 | #else /* __i386__ */ |
67 | 79 | ||
68 | struct stat { | 80 | struct stat { |
@@ -87,6 +99,15 @@ struct stat { | |||
87 | unsigned long st_ctime_nsec; | 99 | unsigned long st_ctime_nsec; |
88 | long __unused[3]; | 100 | long __unused[3]; |
89 | }; | 101 | }; |
102 | |||
103 | /* We don't need to memset the whole thing just to initialize the padding */ | ||
104 | #define INIT_STRUCT_STAT_PADDING(st) do { \ | ||
105 | st.__pad0 = 0; \ | ||
106 | st.__unused[0] = 0; \ | ||
107 | st.__unused[1] = 0; \ | ||
108 | st.__unused[2] = 0; \ | ||
109 | } while (0) | ||
110 | |||
90 | #endif | 111 | #endif |
91 | 112 | ||
92 | /* for 32bit emulation and 32 bit kernels */ | 113 | /* for 32bit emulation and 32 bit kernels */ |
@@ -199,6 +199,10 @@ SYSCALL_DEFINE2(fstat, unsigned int, fd, struct __old_kernel_stat __user *, stat | |||
199 | #define valid_dev(x) choose_32_64(old_valid_dev,new_valid_dev)(x) | 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) | 200 | #define encode_dev(x) choose_32_64(old_encode_dev,new_encode_dev)(x) |
201 | 201 | ||
202 | #ifndef INIT_STRUCT_STAT_PADDING | ||
203 | # define INIT_STRUCT_STAT_PADDING(st) memset(&st, 0, sizeof(st)) | ||
204 | #endif | ||
205 | |||
202 | static int cp_new_stat(struct kstat *stat, struct stat __user *statbuf) | 206 | static int cp_new_stat(struct kstat *stat, struct stat __user *statbuf) |
203 | { | 207 | { |
204 | struct stat tmp; | 208 | struct stat tmp; |
@@ -210,7 +214,7 @@ static int cp_new_stat(struct kstat *stat, struct stat __user *statbuf) | |||
210 | return -EOVERFLOW; | 214 | return -EOVERFLOW; |
211 | #endif | 215 | #endif |
212 | 216 | ||
213 | memset(&tmp, 0, sizeof(tmp)); | 217 | INIT_STRUCT_STAT_PADDING(tmp); |
214 | tmp.st_dev = encode_dev(stat->dev); | 218 | tmp.st_dev = encode_dev(stat->dev); |
215 | tmp.st_ino = stat->ino; | 219 | tmp.st_ino = stat->ino; |
216 | if (sizeof(tmp.st_ino) < sizeof(stat->ino) && tmp.st_ino != stat->ino) | 220 | if (sizeof(tmp.st_ino) < sizeof(stat->ino) && tmp.st_ino != stat->ino) |
@@ -323,11 +327,15 @@ SYSCALL_DEFINE3(readlink, const char __user *, path, char __user *, buf, | |||
323 | /* ---------- LFS-64 ----------- */ | 327 | /* ---------- LFS-64 ----------- */ |
324 | #ifdef __ARCH_WANT_STAT64 | 328 | #ifdef __ARCH_WANT_STAT64 |
325 | 329 | ||
330 | #ifndef INIT_STRUCT_STAT64_PADDING | ||
331 | # define INIT_STRUCT_STAT64_PADDING(st) memset(&st, 0, sizeof(st)) | ||
332 | #endif | ||
333 | |||
326 | static long cp_new_stat64(struct kstat *stat, struct stat64 __user *statbuf) | 334 | static long cp_new_stat64(struct kstat *stat, struct stat64 __user *statbuf) |
327 | { | 335 | { |
328 | struct stat64 tmp; | 336 | struct stat64 tmp; |
329 | 337 | ||
330 | memset(&tmp, 0, sizeof(struct stat64)); | 338 | INIT_STRUCT_STAT64_PADDING(tmp); |
331 | #ifdef CONFIG_MIPS | 339 | #ifdef CONFIG_MIPS |
332 | /* mips has weird padding, so we don't get 64 bits there */ | 340 | /* mips has weird padding, so we don't get 64 bits there */ |
333 | if (!new_valid_dev(stat->dev) || !new_valid_dev(stat->rdev)) | 341 | if (!new_valid_dev(stat->dev) || !new_valid_dev(stat->rdev)) |