diff options
Diffstat (limited to 'arch/sparc64/kernel')
-rw-r--r-- | arch/sparc64/kernel/sys_sparc32.c | 5 | ||||
-rw-r--r-- | arch/sparc64/kernel/sys_sunos32.c | 12 |
2 files changed, 15 insertions, 2 deletions
diff --git a/arch/sparc64/kernel/sys_sparc32.c b/arch/sparc64/kernel/sys_sparc32.c index 69444f266e2d..dbc6d1a3be1f 100644 --- a/arch/sparc64/kernel/sys_sparc32.c +++ b/arch/sparc64/kernel/sys_sparc32.c | |||
@@ -337,12 +337,17 @@ asmlinkage long sys32_ftruncate64(unsigned int fd, unsigned long high, unsigned | |||
337 | 337 | ||
338 | int cp_compat_stat(struct kstat *stat, struct compat_stat __user *statbuf) | 338 | int cp_compat_stat(struct kstat *stat, struct compat_stat __user *statbuf) |
339 | { | 339 | { |
340 | compat_ino_t ino; | ||
340 | int err; | 341 | int err; |
341 | 342 | ||
342 | if (stat->size > MAX_NON_LFS || !old_valid_dev(stat->dev) || | 343 | if (stat->size > MAX_NON_LFS || !old_valid_dev(stat->dev) || |
343 | !old_valid_dev(stat->rdev)) | 344 | !old_valid_dev(stat->rdev)) |
344 | return -EOVERFLOW; | 345 | return -EOVERFLOW; |
345 | 346 | ||
347 | ino = stat->ino; | ||
348 | if (sizeof(ino) < sizeof(stat->ino) && ino != stat->ino) | ||
349 | return -EOVERFLOW; | ||
350 | |||
346 | err = put_user(old_encode_dev(stat->dev), &statbuf->st_dev); | 351 | err = put_user(old_encode_dev(stat->dev), &statbuf->st_dev); |
347 | err |= put_user(stat->ino, &statbuf->st_ino); | 352 | err |= put_user(stat->ino, &statbuf->st_ino); |
348 | err |= put_user(stat->mode, &statbuf->st_mode); | 353 | err |= put_user(stat->mode, &statbuf->st_mode); |
diff --git a/arch/sparc64/kernel/sys_sunos32.c b/arch/sparc64/kernel/sys_sunos32.c index 953296b73f3f..e414c8ef0225 100644 --- a/arch/sparc64/kernel/sys_sunos32.c +++ b/arch/sparc64/kernel/sys_sunos32.c | |||
@@ -280,16 +280,20 @@ static int sunos_filldir(void * __buf, const char * name, int namlen, | |||
280 | struct sunos_dirent __user *dirent; | 280 | struct sunos_dirent __user *dirent; |
281 | struct sunos_dirent_callback * buf = (struct sunos_dirent_callback *) __buf; | 281 | struct sunos_dirent_callback * buf = (struct sunos_dirent_callback *) __buf; |
282 | int reclen = ROUND_UP(NAME_OFFSET(dirent) + namlen + 1); | 282 | int reclen = ROUND_UP(NAME_OFFSET(dirent) + namlen + 1); |
283 | u32 d_ino; | ||
283 | 284 | ||
284 | buf->error = -EINVAL; /* only used if we fail.. */ | 285 | buf->error = -EINVAL; /* only used if we fail.. */ |
285 | if (reclen > buf->count) | 286 | if (reclen > buf->count) |
286 | return -EINVAL; | 287 | return -EINVAL; |
288 | d_ino = ino; | ||
289 | if (sizeof(d_ino) < sizeof(ino) && d_ino != ino) | ||
290 | return -EOVERFLOW; | ||
287 | dirent = buf->previous; | 291 | dirent = buf->previous; |
288 | if (dirent) | 292 | if (dirent) |
289 | put_user(offset, &dirent->d_off); | 293 | put_user(offset, &dirent->d_off); |
290 | dirent = buf->curr; | 294 | dirent = buf->curr; |
291 | buf->previous = dirent; | 295 | buf->previous = dirent; |
292 | put_user(ino, &dirent->d_ino); | 296 | put_user(d_ino, &dirent->d_ino); |
293 | put_user(namlen, &dirent->d_namlen); | 297 | put_user(namlen, &dirent->d_namlen); |
294 | put_user(reclen, &dirent->d_reclen); | 298 | put_user(reclen, &dirent->d_reclen); |
295 | if (copy_to_user(dirent->d_name, name, namlen)) | 299 | if (copy_to_user(dirent->d_name, name, namlen)) |
@@ -363,14 +367,18 @@ static int sunos_filldirentry(void * __buf, const char * name, int namlen, | |||
363 | struct sunos_direntry_callback * buf = | 367 | struct sunos_direntry_callback * buf = |
364 | (struct sunos_direntry_callback *) __buf; | 368 | (struct sunos_direntry_callback *) __buf; |
365 | int reclen = ROUND_UP(NAME_OFFSET(dirent) + namlen + 1); | 369 | int reclen = ROUND_UP(NAME_OFFSET(dirent) + namlen + 1); |
370 | u32 d_ino; | ||
366 | 371 | ||
367 | buf->error = -EINVAL; /* only used if we fail.. */ | 372 | buf->error = -EINVAL; /* only used if we fail.. */ |
368 | if (reclen > buf->count) | 373 | if (reclen > buf->count) |
369 | return -EINVAL; | 374 | return -EINVAL; |
375 | d_ino = ino; | ||
376 | if (sizeof(d_ino) < sizeof(ino) && d_ino != ino) | ||
377 | return -EOVERFLOW; | ||
370 | dirent = buf->previous; | 378 | dirent = buf->previous; |
371 | dirent = buf->curr; | 379 | dirent = buf->curr; |
372 | buf->previous = dirent; | 380 | buf->previous = dirent; |
373 | put_user(ino, &dirent->d_ino); | 381 | put_user(d_ino, &dirent->d_ino); |
374 | put_user(namlen, &dirent->d_namlen); | 382 | put_user(namlen, &dirent->d_namlen); |
375 | put_user(reclen, &dirent->d_reclen); | 383 | put_user(reclen, &dirent->d_reclen); |
376 | if (copy_to_user(dirent->d_name, name, namlen)) | 384 | if (copy_to_user(dirent->d_name, name, namlen)) |