ports/x11/nvidia-driver/files/460-patch-src-nvidia-nvidia_linux.c
Alexey Dokuchaev 48c3156500 Forward-port ``extra-patch-src-nvidia_ctl.c'' patch to 460.xx branch,
I somehow missed it when rebasing other changes.  While here, flatten
and rename 460-* patches, they do not need %%NVSRC%% substitution.

Pointy hat to:	danfe
2021-02-06 11:50:32 +00:00

33 lines
1 KiB
C

--- src/nvidia/nvidia_linux.c.orig 2021-01-21 21:50:34 UTC
+++ src/nvidia/nvidia_linux.c
@@ -35,21 +35,16 @@ int linux_ioctl_nvidia(
struct linux_ioctl_args *args
)
{
- struct file *fp;
- int error;
- cap_rights_t rights;
- u_long cmd;
+ static const uint32_t dir[4] = { IOC_VOID, IOC_IN, IOC_OUT, IOC_INOUT };
- error = fget(td, args->fd, cap_rights_init(&rights, CAP_IOCTL), &fp);
- if (error != 0)
- return error;
-
- cmd = args->cmd;
-
- error = fo_ioctl(fp, cmd, (caddr_t)args->arg, td->td_ucred, td);
- fdrop(fp, td);
-
- return error;
+ if ((args->cmd & (1<<29)) != 0) {
+ /* FreeBSD has only 13 bits to encode the size. */
+ printf("nvidia: pid %d (%s): ioctl cmd=0x%x size too large\n",
+ (int)td->td_proc->p_pid, td->td_proc->p_comm, args->cmd);
+ return (EINVAL);
+ }
+ args->cmd = (args->cmd & ~IOC_DIRMASK) | dir[args->cmd >> 30];
+ return (sys_ioctl(td, (struct ioctl_args *)args));
}
struct linux_ioctl_handler nvidia_handler = {