Page MenuHomeFreeBSD

D57612.id179902.diff
No OneTemporary

D57612.id179902.diff

diff --git a/sys/compat/linuxkpi/common/src/linux_compat.c b/sys/compat/linuxkpi/common/src/linux_compat.c
--- a/sys/compat/linuxkpi/common/src/linux_compat.c
+++ b/sys/compat/linuxkpi/common/src/linux_compat.c
@@ -51,6 +51,7 @@
#include <sys/mman.h>
#include <sys/stack.h>
#include <sys/stdarg.h>
+#include <sys/syscall.h>
#include <sys/sysent.h>
#include <sys/time.h>
#include <sys/user.h>
@@ -926,9 +927,11 @@
struct task_struct *task = current;
unsigned size;
int error;
+ bool direct;
size = IOCPARM_LEN(cmd);
/* refer to logic in sys_ioctl() */
+ direct = false;
if (size > 0) {
/*
* Setup hint for linux_copyin() and linux_copyout().
@@ -938,7 +941,13 @@
*/
task->bsd_ioctl_data = data;
task->bsd_ioctl_len = size;
- data = (void *)LINUX_IOCTL_MIN_PTR;
+ if (SV_PROC_ABI(td->td_proc) == SV_ABI_FREEBSD &&
+ td->td_sa.code == SYS_ioctl) {
+ direct = true;
+ data = (void *)(uintptr_t)td->td_sa.args[2];
+ } else {
+ data = (void *)LINUX_IOCTL_MIN_PTR;
+ }
} else {
/* fetch user-space pointer */
data = *(void **)data;
@@ -968,11 +977,24 @@
error = ENOTTY;
}
}
+ if (error == 0 && size > 0 && (cmd & IOC_OUT) != 0 && direct) {
+ void *xdata;
+ int error1;
+
+ /*
+ * Ensure that the copyout in sys_generic.c copies
+ * over the data which is possibly modified by the driver.
+ */
+ xdata = malloc(size, M_TEMP, M_WAITOK);
+ error1 = copyin(data, xdata, size);
+ if (error1 != 0)
+ memcpy(task->bsd_ioctl_data, xdata, size);
+ free(xdata, M_TEMP);
+ }
if (size > 0) {
task->bsd_ioctl_data = NULL;
task->bsd_ioctl_len = 0;
}
-
if (error == EWOULDBLOCK) {
/* update kqfilter status, if any */
linux_file_kqfilter_poll(filp,

File Metadata

Mime Type
text/plain
Expires
Wed, Sep 9, 10:44 PM (6 h, 53 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
34047047
Default Alt Text
D57612.id179902.diff (1 KB)

Event Timeline