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