int
sys_ioctl(struct thread *td, struct ioctl_args *uap)
{
+#ifndef SYS_IOCTL_SMALL_SIZE
+#define SYS_IOCTL_SMALL_SIZE 128
+#endif
+ u_char smalldata[SYS_IOCTL_SMALL_SIZE] __aligned(8);
u_long com;
int arg, error;
u_int size;
- u_char smalldata[128];
caddr_t data;
if (uap->com > 0xffffffff) {
data = (void *)&arg;
size = 0;
} else {
- if (size <= sizeof(smalldata))
- data = smalldata;
- else
+ if (size > SYS_IOCTL_SMALL_SIZE)
data = malloc((u_long)size, M_IOCTLOPS, M_WAITOK);
+ else
+ data = smalldata;
}
} else
data = (void *)&uap->data;
error = copyout(data, uap->data, (u_int)size);
out:
- if (size > 0 && data != (caddr_t)&smalldata)
+ if (size > SYS_IOCTL_SMALL_SIZE)
free(data, M_IOCTLOPS);
return (error);
}