svn commit: r355068 - head/sys/compat/linux
Vladimir Kondratyev
wulf at FreeBSD.org
Sun Nov 24 20:51:10 UTC 2019
Author: wulf
Date: Sun Nov 24 20:51:09 2019
New Revision: 355068
URL: https://svnweb.freebsd.org/changeset/base/355068
Log:
Linux epoll: Allow passing of any negative timeout value to epoll_wait
Linux epoll allow passing of any negative timeout value to epoll_wait()
to cause unbound blocking
Reviewed by: emaste
MFC after: 1 week
Differential Revision: https://reviews.freebsd.org/D22517
Modified:
head/sys/compat/linux/linux_event.c
Modified: head/sys/compat/linux/linux_event.c
==============================================================================
--- head/sys/compat/linux/linux_event.c Sun Nov 24 20:47:40 2019 (r355067)
+++ head/sys/compat/linux/linux_event.c Sun Nov 24 20:51:09 2019 (r355068)
@@ -557,13 +557,13 @@ linux_epoll_wait_common(struct thread *td, int epfd, s
return (error);
if (epfp->f_type != DTYPE_KQUEUE) {
error = EINVAL;
- goto leave1;
+ goto leave;
}
if (uset != NULL) {
error = kern_sigprocmask(td, SIG_SETMASK, uset,
&omask, 0);
if (error != 0)
- goto leave1;
+ goto leave;
td->td_pflags |= TDP_OLDMASK;
/*
* Make sure that ast() is called on return to
@@ -581,11 +581,12 @@ linux_epoll_wait_common(struct thread *td, int epfd, s
coargs.count = 0;
coargs.error = 0;
- if (timeout != -1) {
- if (timeout < 0) {
- error = EINVAL;
- goto leave0;
- }
+ /*
+ * Linux epoll_wait(2) man page states that timeout of -1 causes caller
+ * to block indefinitely. Real implementation does it if any negative
+ * timeout value is passed.
+ */
+ if (timeout >= 0) {
/* Convert from milliseconds to timespec. */
ts.tv_sec = timeout / 1000;
ts.tv_nsec = (timeout % 1000) * 1000000;
@@ -605,11 +606,10 @@ linux_epoll_wait_common(struct thread *td, int epfd, s
if (error == 0)
td->td_retval[0] = coargs.count;
-leave0:
if (uset != NULL)
error = kern_sigprocmask(td, SIG_SETMASK, &omask,
NULL, 0);
-leave1:
+leave:
fdrop(epfp, td);
return (error);
}
More information about the svn-src-all
mailing list