diff options
Diffstat (limited to 'arch/sparc')
-rw-r--r-- | arch/sparc/kernel/sys_sunos.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/arch/sparc/kernel/sys_sunos.c b/arch/sparc/kernel/sys_sunos.c index 9d2cd97d1c3a..6f3ac548ee66 100644 --- a/arch/sparc/kernel/sys_sunos.c +++ b/arch/sparc/kernel/sys_sunos.c | |||
@@ -325,21 +325,25 @@ struct sunos_dirent_callback { | |||
325 | #define ROUND_UP(x) (((x)+sizeof(long)-1) & ~(sizeof(long)-1)) | 325 | #define ROUND_UP(x) (((x)+sizeof(long)-1) & ~(sizeof(long)-1)) |
326 | 326 | ||
327 | static int sunos_filldir(void * __buf, const char * name, int namlen, | 327 | static int sunos_filldir(void * __buf, const char * name, int namlen, |
328 | loff_t offset, ino_t ino, unsigned int d_type) | 328 | loff_t offset, u64 ino, unsigned int d_type) |
329 | { | 329 | { |
330 | struct sunos_dirent __user *dirent; | 330 | struct sunos_dirent __user *dirent; |
331 | struct sunos_dirent_callback * buf = __buf; | 331 | struct sunos_dirent_callback * buf = __buf; |
332 | unsigned long d_ino; | ||
332 | int reclen = ROUND_UP(NAME_OFFSET(dirent) + namlen + 1); | 333 | int reclen = ROUND_UP(NAME_OFFSET(dirent) + namlen + 1); |
333 | 334 | ||
334 | buf->error = -EINVAL; /* only used if we fail.. */ | 335 | buf->error = -EINVAL; /* only used if we fail.. */ |
335 | if (reclen > buf->count) | 336 | if (reclen > buf->count) |
336 | return -EINVAL; | 337 | return -EINVAL; |
338 | d_ino = ino; | ||
339 | if (sizeof(d_ino) < sizeof(ino) && d_ino != ino) | ||
340 | return -EOVERFLOW; | ||
337 | dirent = buf->previous; | 341 | dirent = buf->previous; |
338 | if (dirent) | 342 | if (dirent) |
339 | put_user(offset, &dirent->d_off); | 343 | put_user(offset, &dirent->d_off); |
340 | dirent = buf->curr; | 344 | dirent = buf->curr; |
341 | buf->previous = dirent; | 345 | buf->previous = dirent; |
342 | put_user(ino, &dirent->d_ino); | 346 | put_user(d_ino, &dirent->d_ino); |
343 | put_user(namlen, &dirent->d_namlen); | 347 | put_user(namlen, &dirent->d_namlen); |
344 | put_user(reclen, &dirent->d_reclen); | 348 | put_user(reclen, &dirent->d_reclen); |
345 | copy_to_user(dirent->d_name, name, namlen); | 349 | copy_to_user(dirent->d_name, name, namlen); |
@@ -406,19 +410,23 @@ struct sunos_direntry_callback { | |||
406 | }; | 410 | }; |
407 | 411 | ||
408 | static int sunos_filldirentry(void * __buf, const char * name, int namlen, | 412 | static int sunos_filldirentry(void * __buf, const char * name, int namlen, |
409 | loff_t offset, ino_t ino, unsigned int d_type) | 413 | loff_t offset, u64 ino, unsigned int d_type) |
410 | { | 414 | { |
411 | struct sunos_direntry __user *dirent; | 415 | struct sunos_direntry __user *dirent; |
412 | struct sunos_direntry_callback *buf = __buf; | 416 | struct sunos_direntry_callback *buf = __buf; |
417 | unsigned long d_ino; | ||
413 | int reclen = ROUND_UP(NAME_OFFSET(dirent) + namlen + 1); | 418 | int reclen = ROUND_UP(NAME_OFFSET(dirent) + namlen + 1); |
414 | 419 | ||
415 | buf->error = -EINVAL; /* only used if we fail.. */ | 420 | buf->error = -EINVAL; /* only used if we fail.. */ |
416 | if (reclen > buf->count) | 421 | if (reclen > buf->count) |
417 | return -EINVAL; | 422 | return -EINVAL; |
423 | d_ino = ino; | ||
424 | if (sizeof(d_ino) < sizeof(ino) && d_ino != ino) | ||
425 | return -EOVERFLOW; | ||
418 | dirent = buf->previous; | 426 | dirent = buf->previous; |
419 | dirent = buf->curr; | 427 | dirent = buf->curr; |
420 | buf->previous = dirent; | 428 | buf->previous = dirent; |
421 | put_user(ino, &dirent->d_ino); | 429 | put_user(d_ino, &dirent->d_ino); |
422 | put_user(namlen, &dirent->d_namlen); | 430 | put_user(namlen, &dirent->d_namlen); |
423 | put_user(reclen, &dirent->d_reclen); | 431 | put_user(reclen, &dirent->d_reclen); |
424 | copy_to_user(dirent->d_name, name, namlen); | 432 | copy_to_user(dirent->d_name, name, namlen); |