* Fixed some checks for user addresses. IS_KERNEL_ADDRESS is not the
same as !IS_USER_ADDRESS. * Use the new IoctlSyscallFlagUnsetter helper class in _kern_ioctl(). The former implementation wasn't checking correctly for a previous syscall flag. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24904 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
89df64c56e
commit
08b2313e70
@ -624,7 +624,7 @@ common_close(int fd, bool kernel)
|
|||||||
static ssize_t
|
static ssize_t
|
||||||
common_user_io(int fd, off_t pos, void *buffer, size_t length, bool write)
|
common_user_io(int fd, off_t pos, void *buffer, size_t length, bool write)
|
||||||
{
|
{
|
||||||
if (IS_KERNEL_ADDRESS(buffer))
|
if (!IS_USER_ADDRESS(buffer))
|
||||||
return B_BAD_ADDRESS;
|
return B_BAD_ADDRESS;
|
||||||
|
|
||||||
if (pos < -1)
|
if (pos < -1)
|
||||||
@ -814,7 +814,7 @@ _user_ioctl(int fd, ulong op, void *buffer, size_t length)
|
|||||||
{
|
{
|
||||||
struct file_descriptor *descriptor;
|
struct file_descriptor *descriptor;
|
||||||
|
|
||||||
if (IS_KERNEL_ADDRESS(buffer))
|
if (!IS_USER_ADDRESS(buffer))
|
||||||
return B_BAD_ADDRESS;
|
return B_BAD_ADDRESS;
|
||||||
|
|
||||||
TRACE(("user_ioctl: fd %d\n", fd));
|
TRACE(("user_ioctl: fd %d\n", fd));
|
||||||
@ -835,7 +835,7 @@ _user_read_dir(int fd, struct dirent *buffer, size_t bufferSize, uint32 maxCount
|
|||||||
struct file_descriptor *descriptor;
|
struct file_descriptor *descriptor;
|
||||||
ssize_t retval;
|
ssize_t retval;
|
||||||
|
|
||||||
if (IS_KERNEL_ADDRESS(buffer))
|
if (!IS_USER_ADDRESS(buffer))
|
||||||
return B_BAD_ADDRESS;
|
return B_BAD_ADDRESS;
|
||||||
|
|
||||||
TRACE(("user_read_dir(fd = %d, buffer = %p, bufferSize = %ld, count = %lu)\n", fd, buffer, bufferSize, maxCount));
|
TRACE(("user_read_dir(fd = %d, buffer = %p, bufferSize = %ld, count = %lu)\n", fd, buffer, bufferSize, maxCount));
|
||||||
@ -1120,15 +1120,9 @@ _kern_ioctl(int fd, ulong op, void *buffer, size_t length)
|
|||||||
{
|
{
|
||||||
TRACE(("kern_ioctl: fd %d\n", fd));
|
TRACE(("kern_ioctl: fd %d\n", fd));
|
||||||
|
|
||||||
struct thread *thread = thread_get_current_thread();
|
IoctlSyscallFlagUnsetter _;
|
||||||
bool wasSyscall = atomic_and(&thread->flags, ~THREAD_FLAGS_IOCTL_SYSCALL);
|
|
||||||
|
|
||||||
status_t status = fd_ioctl(true, fd, op, buffer, length);
|
return fd_ioctl(true, fd, op, buffer, length);
|
||||||
|
|
||||||
if (wasSyscall)
|
|
||||||
atomic_or(&thread->flags, THREAD_FLAGS_IOCTL_SYSCALL);
|
|
||||||
|
|
||||||
return status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user