Page MenuHomeFreeBSD

D30690.id90558.diff
No OneTemporary

D30690.id90558.diff

Index: sys/kern/sys_generic.c
===================================================================
--- sys/kern/sys_generic.c
+++ sys/kern/sys_generic.c
@@ -128,6 +128,8 @@
static void seltdinit(struct thread *);
static int seltdwait(struct thread *, sbintime_t, sbintime_t);
static void seltdclear(struct thread *);
+static int kern_poll_ufds(struct thread *, struct pollfd *, u_int,
+ struct timespec *, sigset_t *);
/*
* One seltd per-thread allocated on demand as needed.
@@ -1414,15 +1416,13 @@
} else
tsp = NULL;
- return (kern_poll(td, uap->fds, uap->nfds, tsp, NULL));
+ return (kern_poll_ufds(td, uap->fds, uap->nfds, tsp, NULL));
}
int
-kern_poll(struct thread *td, struct pollfd *ufds, u_int nfds,
+kern_poll(struct thread *td, struct pollfd *kfds, u_int nfds,
struct timespec *tsp, sigset_t *uset)
{
- struct pollfd *kfds;
- struct pollfd stackfds[32];
sbintime_t sbt, precision, tmp;
time_t over;
struct timespec ts;
@@ -1453,28 +1453,11 @@
} else
sbt = -1;
- /*
- * This is kinda bogus. We have fd limits, but that is not
- * really related to the size of the pollfd array. Make sure
- * we let the process use at least FD_SETSIZE entries and at
- * least enough for the system-wide limits. We want to be reasonably
- * safe, but not overly restrictive.
- */
- if (nfds > maxfilesperproc && nfds > FD_SETSIZE)
- return (EINVAL);
- if (nfds > nitems(stackfds))
- kfds = mallocarray(nfds, sizeof(*kfds), M_TEMP, M_WAITOK);
- else
- kfds = stackfds;
- error = copyin(ufds, kfds, nfds * sizeof(*kfds));
- if (error)
- goto done;
-
if (uset != NULL) {
error = kern_sigprocmask(td, SIG_SETMASK, uset,
&td->td_oldsigmask, 0);
if (error)
- goto done;
+ return (error);
td->td_pflags |= TDP_OLDMASK;
/*
* Make sure that ast() is called on return to
@@ -1501,20 +1484,11 @@
}
seltdclear(td);
-done:
/* poll is not restarted after signals... */
if (error == ERESTART)
error = EINTR;
if (error == EWOULDBLOCK)
error = 0;
- if (error == 0) {
- error = pollout(td, kfds, ufds, nfds);
- if (error)
- goto out;
- }
-out:
- if (nfds > nitems(stackfds))
- free(kfds, M_TEMP);
return (error);
}
@@ -1540,11 +1514,58 @@
} else
ssp = NULL;
/*
- * fds is still a pointer to user space. kern_poll() will
+ * fds is still a pointer to user space. kern_poll_ufds() will
* take care of copyin that array to the kernel space.
*/
- return (kern_poll(td, uap->fds, uap->nfds, tsp, ssp));
+ return (kern_poll_ufds(td, uap->fds, uap->nfds, tsp, ssp));
+}
+
+static int
+kern_poll_ufds(struct thread *td, struct pollfd *ufds, u_int nfds,
+ struct timespec *tsp, sigset_t *set)
+{
+ struct pollfd *kfds;
+ struct pollfd stackfds[32];
+ int error;
+
+ error = kern_poll_maxfds(nfds);
+ if (error != 0)
+ return (error);
+
+ if (nfds > nitems(stackfds))
+ kfds = mallocarray(nfds, sizeof(*kfds), M_TEMP, M_WAITOK);
+ else
+ kfds = stackfds;
+ error = copyin(ufds, kfds, nfds * sizeof(*kfds));
+ if (error != 0)
+ goto out;
+
+ error = kern_poll(td, kfds, nfds, tsp, set);
+ if (error == 0)
+ error = pollout(td, kfds, ufds, nfds);
+
+out:
+ if (nfds > nitems(stackfds))
+ free(kfds, M_TEMP);
+ return (error);
+}
+
+int
+kern_poll_maxfds(u_int nfds)
+{
+
+ /*
+ * This is kinda bogus. We have fd limits, but that is not
+ * really related to the size of the pollfd array. Make sure
+ * we let the process use at least FD_SETSIZE entries and at
+ * least enough for the system-wide limits. We want to be reasonably
+ * safe, but not overly restrictive.
+ */
+ if (nfds > maxfilesperproc && nfds > FD_SETSIZE)
+ return (EINVAL);
+ else
+ return (0);
}
static int
Index: sys/sys/syscallsubr.h
===================================================================
--- sys/sys/syscallsubr.h
+++ sys/sys/syscallsubr.h
@@ -225,6 +225,7 @@
struct filecaps *fcaps1, struct filecaps *fcaps2);
int kern_poll(struct thread *td, struct pollfd *fds, u_int nfds,
struct timespec *tsp, sigset_t *uset);
+int kern_poll_maxfds(u_int nfds);
int kern_posix_error(struct thread *td, int error);
int kern_posix_fadvise(struct thread *td, int fd, off_t offset, off_t len,
int advice);

File Metadata

Mime Type
text/plain
Expires
Tue, Apr 7, 7:44 PM (10 h, 54 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
31047411
Default Alt Text
D30690.id90558.diff (4 KB)

Event Timeline