summaryrefslogtreecommitdiffstats
path: root/sys/kern/sys_generic.c
diff options
context:
space:
mode:
authordillon <dillon@FreeBSD.org>2000-05-09 17:43:21 +0000
committerdillon <dillon@FreeBSD.org>2000-05-09 17:43:21 +0000
commit34f50cffe78b54de54c329f3de0add8b54c92f3e (patch)
treee227033b711b0dbba6cdfe7dc1dd00903438df5d /sys/kern/sys_generic.c
parentdb44ba375371f40754feca8fa14a009d49333c03 (diff)
downloadFreeBSD-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/sys_generic.c')
-rw-r--r--sys/kern/sys_generic.c9
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);
OpenPOWER on IntegriCloud