Running 8 building 10 gives "Out of file descriptors" ?

Jilles Tjoelker jilles at stack.nl
Wed Nov 19 21:57:03 UTC 2014


On Wed, Nov 19, 2014 at 01:18:08PM -0700, Ian Lepore wrote:
> On Wed, 2014-11-19 at 11:07 -0800, Dieter BSD wrote:
> > if (fd < 10) {
> >                 fd2 = fcntl(fd, F_DUPFD_CLOEXEC, 10);
> >                 close(fd);
> >                 if (fd2 < 0)
> >                   {
> >                     int limit;
> >                     limit = getdtablesize();
> >                     fprintf(stderr, "sh: setinputfile(): fcntl() returned %d ge\
> > tdtablesize() returned %d\n", fd2, limit);
> >                     perror("sh: fcntl(F_DUPFD_CLOEXEC) failed:");
> >                         error("sh: Out of file descriptors?");
> >                   }
> >                 fd = fd2;
> >         }

> > Result:
> > sh: setinputfile(): fcntl() returned -1 getdtablesize() returned 11095
> > sh: fcntl(F_DUPFD_CLOEXEC) failed:: Invalid argument
> > sh: Out of file descriptors?

> > find /usr/include/ | xargs grep F_DUPFD_CLOEXEC
> > gives no hits in 8.2, but
> > /usr/include/sys/fcntl.h:
> > /new/freebsd/usr/include/fcntl.h:
> > #define    F_DUPFD_CLOEXEC 17         /* Like F_DUPFD, but FD_CLOEXEC is set */
> > in 10.1

> > So, F_DUPFD_CLOEXEC was added after 8.2, and someone changed sh to
> > use it, but couldn't be bothered to fix the error message.

> > If someone would like to fix this, they don't need to build a toolchain,
> > they can use a 2 line script:

> > #!/bin/sh
> > echo Hello, World!

> > So Ian, how did you avoid running into this problem?

> Ohhhh... hmm.  That must have been MFC'd to 8-stable after I had updated
> my 8.2 to 8.4 (which was quite a while ago, more than a year now I
> guess).

> I think this means it's no longer possible to bootstrap a system older
> than 8.4 in a single step.  You'd need to go 8.2 -> 8.4 then install
> that and reboot to go forward from there.  I'm not sure there's an easy
> fix for that, but we could at least update the check in Makefile.inc1 to
> stop the build and tell you that you can't bootstrap a system older than
> 8.4 (right now the cutoff check is 8.0).

> I'm not sure what the project policy is in terms of fixing this (no
> matter how hard it may be) versus changing the cutoff warning.  I'll
> look into it.

Updating the check in Makefile.inc1 makes sense.

If building from 8.2 is supposed to work, it would make most sense to
revert r250267. I don't think making the source a #ifdef mess is worth
it, given that using O_CLOEXEC and F_DUPFD_CLOEXEC is only a minor
optimization in sh and not a correctness issue like in threaded programs
(including libc which may be used from threaded programs).

Not being able to use kernel features in sh that were MFC'ed back three
stable branches ago makes me sad, though.

-- 
Jilles Tjoelker


More information about the freebsd-hackers mailing list