Page MenuHomeFreeBSD

D17670.diff
No OneTemporary

D17670.diff

Index: head/sys/kern/sys_generic.c
===================================================================
--- head/sys/kern/sys_generic.c
+++ head/sys/kern/sys_generic.c
@@ -1304,16 +1304,15 @@
}
int
-kern_poll(struct thread *td, struct pollfd *fds, u_int nfds,
+kern_poll(struct thread *td, struct pollfd *ufds, u_int nfds,
struct timespec *tsp, sigset_t *uset)
{
- struct pollfd *bits;
- struct pollfd smallbits[32];
+ struct pollfd *kfds;
+ struct pollfd stackfds[32];
sbintime_t sbt, precision, tmp;
time_t over;
struct timespec ts;
int error;
- size_t ni;
precision = 0;
if (tsp != NULL) {
@@ -1342,12 +1341,11 @@
if (nfds > maxfilesperproc && nfds > FD_SETSIZE)
return (EINVAL);
- ni = nfds * sizeof(struct pollfd);
- if (ni > sizeof(smallbits))
- bits = malloc(ni, M_TEMP, M_WAITOK);
+ if (nfds > nitems(stackfds))
+ kfds = mallocarray(nfds, sizeof(*kfds), M_TEMP, M_WAITOK);
else
- bits = smallbits;
- error = copyin(fds, bits, ni);
+ kfds = stackfds;
+ error = copyin(ufds, kfds, nfds * sizeof(*kfds));
if (error)
goto done;
@@ -1370,7 +1368,7 @@
seltdinit(td);
/* Iterate until the timeout expires or descriptors become ready. */
for (;;) {
- error = pollscan(td, bits, nfds);
+ error = pollscan(td, kfds, nfds);
if (error || td->td_retval[0] != 0)
break;
error = seltdwait(td, sbt, precision);
@@ -1389,13 +1387,13 @@
if (error == EWOULDBLOCK)
error = 0;
if (error == 0) {
- error = pollout(td, bits, fds, nfds);
+ error = pollout(td, kfds, ufds, nfds);
if (error)
goto out;
}
out:
- if (ni > sizeof(smallbits))
- free(bits, M_TEMP);
+ if (nfds > nitems(stackfds))
+ free(kfds, M_TEMP);
return (error);
}

File Metadata

Mime Type
text/plain
Expires
Tue, Mar 31, 2:05 PM (14 h, 45 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
30633078
Default Alt Text
D17670.diff (1 KB)

Event Timeline