[PATCH] support kernels without __ARCH_WANT_SYSCALL_NO_FLAGS
Mark Salter
msalter at redhat.com
Thu Apr 26 21:04:01 UTC 2012
On Thu, 2012-04-26 at 12:47 -0400, Rich Felker wrote:
> On Thu, Apr 26, 2012 at 11:00:39AM -0400, Rich Felker wrote:
> > On Thu, Apr 26, 2012 at 10:18:11AM -0400, Mark Salter wrote:
> > > +#ifdef __NR_dup2
> > > _syscall2(int, dup2, int, oldfd, int, newfd)
> > > +#elif defined __NR_dup3
> > > +#include <fcntl.h>
> > > +
> > > +int
> > > +dup2 (int fd, int fd2)
> > > +{
> > > + /* For the degenerate case, check if the fd is valid (by trying to
> > > + get the file status flags) and return it, or else return EBADF. */
> > > + if (fd == fd2)
> > > + return __libc_fcntl(fd, F_GETFL, 0) < 0 ? -1 : fd;
> >
> > Is there a reason this special case is necessary? Not questioning it,
> > I just want to know.
>
> OK, I'll answer my own question: it seems to be a workaround for a
> kernel bug on 64-bit Linux:
>
> http://old.nabble.com/-PATCH--dup2:-Fix-return-value-with-oldfd-%3D%3D-newfd-and-invalid-fd-td23488867.html
>
No that isn't it. There is a semantic difference in how dup2 and dup3
handles the case of fd1 == fd2. dup3 unconditionally sets errno to
EINVAL. dup2 checks if the fd is valid and sets EBADF if not, or returns
the fd if it is valid. So the intent in that case is to let fcntl
validate the fd in that case to emulate dup2 behavior.
--Mark
More information about the uClibc
mailing list