svn commit: r340038 - in head: lib/libc/sys sys/kern
Konstantin Belousov
kostikbel at gmail.com
Fri Nov 2 00:46:11 UTC 2018
On Thu, Nov 01, 2018 at 11:46:23PM +0000, Conrad Meyer wrote:
> Author: cem
> Date: Thu Nov 1 23:46:23 2018
> New Revision: 340038
> URL: https://svnweb.freebsd.org/changeset/base/340038
>
> Log:
> kern_poll: Restore explanatory comment removed in r177374
>
> The comment isn't stale. The check is bogus in the sense that poll(2)
> does not require pollfd entries to be unique in fd space, so there is no
> reason there cannot be more pollfd entries than open or even allowed
> fds. The check is mostly a seatbelt against accidental misuse or
> abuse. FD_SETSIZE, while usually unrelated to poll, is used as an
> arbitrary floor for systems with very low kern.maxfilesperproc.
>
> Additionally, document this possible EINVAL condition in the poll.2
> manual.
>
> No functional change.
>
> Reviewed by: markj
> Sponsored by: Dell EMC Isilon
> Differential Revision: https://reviews.freebsd.org/D17671
>
> Modified:
> head/lib/libc/sys/poll.2
> head/sys/kern/sys_generic.c
>
> Modified: head/lib/libc/sys/poll.2
> ==============================================================================
> --- head/lib/libc/sys/poll.2 Thu Nov 1 23:42:35 2018 (r340037)
> +++ head/lib/libc/sys/poll.2 Thu Nov 1 23:46:23 2018 (r340038)
> @@ -28,7 +28,7 @@
> .\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> .\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> .\"
> -.Dd November 13, 2014
> +.Dd November 1, 2018
> .Dt POLL 2
> .Os
> .Sh NAME
> @@ -232,7 +232,15 @@ points outside the process's allocated address space.
> A signal was delivered before the time limit expired and
> before any of the selected events occurred.
> .It Bq Er EINVAL
> -The specified time limit is invalid. One of its components is negative or too large.
> +The specified time limit is invalid.
> +One of its components is negative or too large.
> +.It Bq Er EINVAL
> +The number of pollfd structures specified by
> +.Fa nfds
> +exceeds the system tunable
> +.Va kern.maxfilesperproc
> +and
> +.Dv FD_SETSIZE .
This is somewhat confusing. Looking only at the man page text, most
straight reading of it is that nfds cannot exceed min(maxfilesperproc,
FD_SETSIZE). But in fact nfds cannot exceed max of it, which is
significantly different, i.e. poll(2) does not suffer from the (userspace)
FD_SETSIZE limitation of select(2).
> .El
> .Sh SEE ALSO
> .Xr accept 2 ,
>
> Modified: head/sys/kern/sys_generic.c
> ==============================================================================
> --- head/sys/kern/sys_generic.c Thu Nov 1 23:42:35 2018 (r340037)
> +++ head/sys/kern/sys_generic.c Thu Nov 1 23:46:23 2018 (r340038)
> @@ -1339,6 +1339,13 @@ kern_poll(struct thread *td, struct pollfd *ufds, u_in
> } 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))
More information about the svn-src-all
mailing list