[PATCH] fix osf_getdirents()
Return value of filldir callback is just "should we stop here"; it's not a usable channel for passing error values (i.e. ->readdir() will forget anything except "is it non-zero"). Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
2690421743
commit
645e68ed4d
@ -121,24 +121,29 @@ osf_filldir(void *__buf, const char *name, int namlen, loff_t offset,
|
||||
if (reclen > buf->count)
|
||||
return -EINVAL;
|
||||
d_ino = ino;
|
||||
if (sizeof(d_ino) < sizeof(ino) && d_ino != ino)
|
||||
if (sizeof(d_ino) < sizeof(ino) && d_ino != ino) {
|
||||
buf->error = -EOVERFLOW;
|
||||
return -EOVERFLOW;
|
||||
}
|
||||
if (buf->basep) {
|
||||
if (put_user(offset, buf->basep))
|
||||
return -EFAULT;
|
||||
goto Efault;
|
||||
buf->basep = NULL;
|
||||
}
|
||||
dirent = buf->dirent;
|
||||
put_user(d_ino, &dirent->d_ino);
|
||||
put_user(namlen, &dirent->d_namlen);
|
||||
put_user(reclen, &dirent->d_reclen);
|
||||
if (copy_to_user(dirent->d_name, name, namlen) ||
|
||||
if (put_user(d_ino, &dirent->d_ino) ||
|
||||
put_user(namlen, &dirent->d_namlen) ||
|
||||
put_user(reclen, &dirent->d_reclen) ||
|
||||
copy_to_user(dirent->d_name, name, namlen) ||
|
||||
put_user(0, dirent->d_name + namlen))
|
||||
return -EFAULT;
|
||||
goto Efault;
|
||||
dirent = (void __user *)dirent + reclen;
|
||||
buf->dirent = dirent;
|
||||
buf->count -= reclen;
|
||||
return 0;
|
||||
Efault:
|
||||
buf->error = -EFAULT;
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
asmlinkage int
|
||||
|
Loading…
Reference in New Issue
Block a user