--- sys/kern/kern_cpuset.c (revision 322327) +++ sys/kern/kern_cpuset.c (working copy) @@ -1097,7 +1097,7 @@ int error; size_t size; - if (cpusetsize < sizeof(cpuset_t) || cpusetsize > CPU_MAXSIZE / NBBY) + if (cpusetsize < (mp_maxid + NBBY - 1) / NBBY || cpusetsize > CPU_MAXSIZE / NBBY) return (ERANGE); /* In Capability mode, you can only get your own CPU set. */ if (IN_CAPABILITY_MODE(td)) { @@ -1109,7 +1109,7 @@ return (ECAPMODE); } size = cpusetsize; - mask = malloc(size, M_TEMP, M_WAITOK | M_ZERO); + mask = malloc(size >= sizeof(cpuset_t) ? size : sizeof(cpuset_t), M_TEMP, M_WAITOK | M_ZERO); error = cpuset_which(which, id, &p, &ttd, &set); if (error) goto out; @@ -1210,7 +1210,7 @@ cpuset_t *mask; int error; - if (cpusetsize < sizeof(cpuset_t) || cpusetsize > CPU_MAXSIZE / NBBY) + if (cpusetsize < (mp_maxid + NBBY - 1) / NBBY || cpusetsize > CPU_MAXSIZE / NBBY) return (ERANGE); /* In Capability mode, you can only set your own CPU set. */ if (IN_CAPABILITY_MODE(td)) { @@ -1221,7 +1221,7 @@ if (id != -1) return (ECAPMODE); } - mask = malloc(cpusetsize, M_TEMP, M_WAITOK | M_ZERO); + mask = malloc(cpusetsize >= sizeof(cpuset_t) ? cpusetsize : sizeof(cpuset_t), M_TEMP, M_WAITOK | M_ZERO); error = copyin(maskp, mask, cpusetsize); if (error) goto out;