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))
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to