Subject: Re: sys_select() EBADF bug
To: <>
From: Tad Hunt <tad@entrisphere.com>
List: tech-kern
Date: 11/14/2002 16:00:23
Ignore that last mail.  the rlimit is a count.  It has nothing
to do with the fd numbers.

I need to think some more on this.

-Tad

I said:
;
;Hmm.  I didn't realize that you could shrink the resource limits
;below something that was already open and still have the files open.
;This should fix that problem then:
;
;by making nd unsigned, we can make this cost about the same as
;before by removing the "if(SCARG(uap, nd) < 0)" check.
;
;	sys_select()
;	{
;		...
;		u_int nd;
;		...
;
;		nd = SCARG(uap, nd);
;
;		/*
;		 * it is possible to shrink the resource limits below the current
;		 * number of open files.  Make sure that we handle that case.
;		 */
;		if (nd > p->p_fd->fd_nfiles && nd > p->p_rlimit[RLIMIT_NOFILE].rlim_cur)
;			return (EINVAL);
;		...
;	}
;
;In message <Pine.NEB.4.44.0211141522390.625-100000@lothlorien.starwolf.com>, you said:
;;On Thu, 14 Nov 2002, Tad Hunt wrote:
;;
;;# Currently, select will happily block forever if a bad fd is in the
;;# list and greater than fd_nfiles.  selscan() was already rewritten
;;# to use fd_getfile(), which correctly handles a fd beyond the end
;;# of the array.
;;#
;;# This way, if the process puts a fd > the number of open files in,
;;# it will still get an EBADF error back from select(2).
;;
;;So what do you do in the case the proc.curproc.rlimit.nofiles.* gets
;;pushed below the selected fd?  It's still a valid descriptor.
;;
;;Now, granted, it's a contrived edge case, but...what if?  Theoretically,
;;we might want to keep stdin, stdout, stderr opened, and maybe open a
;;socket or two, but decrease nofiles to 0 to prevent a given process from
;;(re)opening another file (call it paranoia).  What then on select()?
;;
;;				--*greywolf;
;;--
;;NetBSD: No Worries!