diff options
author | dillon <dillon@FreeBSD.org> | 2000-05-09 17:43:21 +0000 |
---|---|---|
committer | dillon <dillon@FreeBSD.org> | 2000-05-09 17:43:21 +0000 |
commit | 34f50cffe78b54de54c329f3de0add8b54c92f3e (patch) | |
tree | e227033b711b0dbba6cdfe7dc1dd00903438df5d /sys/kern | |
parent | db44ba375371f40754feca8fa14a009d49333c03 (diff) | |
download | FreeBSD-src-34f50cffe78b54de54c329f3de0add8b54c92f3e.zip FreeBSD-src-34f50cffe78b54de54c329f3de0add8b54c92f3e.tar.gz |
Some ioctl routines assume that the ioctl buffer is aligned, but a
char[] declaration makes no such guarentee. A union is used to force
alignment of the char buffer.
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/sys_generic.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/sys/kern/sys_generic.c b/sys/kern/sys_generic.c index 5ef9059..687e4f9 100644 --- a/sys/kern/sys_generic.c +++ b/sys/kern/sys_generic.c @@ -496,7 +496,10 @@ ioctl(p, uap) caddr_t data, memp; int tmp; #define STK_PARAMS 128 - char stkbuf[STK_PARAMS]; + union { + char stkbuf[STK_PARAMS]; + long align; + } ubuf; fdp = p->p_fd; if ((u_int)uap->fd >= fdp->fd_nfiles || @@ -523,11 +526,11 @@ ioctl(p, uap) if (size > IOCPARM_MAX) return (ENOTTY); memp = NULL; - if (size > sizeof (stkbuf)) { + if (size > sizeof (ubuf.stkbuf)) { memp = (caddr_t)malloc((u_long)size, M_IOCTLOPS, M_WAITOK); data = memp; } else - data = stkbuf; + data = ubuf.stkbuf; if (com&IOC_IN) { if (size) { error = copyin(uap->data, data, (u_int)size); |