On Mon, Aug 06, 2018 at 06:32:01PM +0200, Claudio Jeker wrote:
> On Mon, Aug 06, 2018 at 06:23:28PM +0200, Matthieu Herrb wrote:
> > Hi,
> > 
> > fcntl(2) says:
> > 
> >  F_GETFD  Get the close-on-exec flag associated with the file
> >           descriptor fd as FD_CLOEXEC.  If the returned value
> >           ANDed with FD_CLOEXEC is 0, the file will remain open
> >           across exec(), otherwise the file will be closed upon
> >           execution of exec() (arg is ignored).
> > 
> > This is wrong. The flag is returned in the low bit of the return
> > value (see sys/kern/kern_descrip.c:443).
> > Moreover the value O_CLOEXEC is not 0x1, so doing the AND described
> > above is never going to provide the good answer.
> > 
> > I've checked that Linux and FreeBSD also return 0x1 when the O_CLOEXEC
> > is set, and none of them defines O_CLOEXEC as 0x1. The same
> > documentation bug is present on FreenBSD.
> > 
> > How to repeat:
> > 
> > #include <err.h>
> > #include <fcntl.h>
> > #include <stdio.h>
> > 
> > int
> > main(int argc, char *argv[])
> > {
> >     int fd, flags;
> > 
> >     fd = open("/dev/null", O_RDWR | O_CLOEXEC);
> >     if (fd < 0)
> >             err(2, "open");
> >     flags = fcntl(fd, F_GETFD, 0);
> >     if (flags < 0)
> >             err(2, "fcntl");
> >     printf("flags 0x%08x O_CLOEXEC 0x%08x\n", flags, O_CLOEXEC);
> >     return 0;
> > }
> 
> There is a difference between FD_CLOEXEC and O_CLOEXEC. FD_CLOEXEC is
> defined as 1 and so the man page is correct.

Ok. This is confusing but you're correct. sigh.
> 
>  
> > Patch
> > 
> > The patch below fixes the documentation.
> > 
> > Index: fcntl.2
> > ===================================================================
> > RCS file: /cvs/OpenBSD/src/lib/libc/sys/fcntl.2,v
> > retrieving revision 1.31
> > diff -u -p -u -r1.31 fcntl.2
> > --- fcntl.2 16 Dec 2014 00:06:49 -0000      1.31
> > +++ fcntl.2 6 Aug 2018 16:10:53 -0000
> > @@ -100,10 +100,7 @@ Get the close-on-exec flag associated wi
> >  .Fa fd
> >  as
> >  .Dv FD_CLOEXEC .
> > -If the returned value ANDed with
> > -.Dv FD_CLOEXEC
> > -is 0,
> > -the file will remain open across
> > +If the returned value is 0, the file will remain open across
> >  .Fn exec ,
> >  otherwise the file will be closed upon execution of
> >  .Fn exec
> > 
> > 
> 
> 
> -- 
> :wq Claudio

-- 
Matthieu Herrb

Reply via email to