Hi Bruno, On 5/17/24 2:10 PM, Bruno Haible wrote: > On NetBSD 9.0 and 10.0, I always see the same tests fail: > > FAIL: test-dup3 > =============== > > ../../gltests/test-dup3.c:113: assertion 'dup3 (fd, fd, o_flags) == -1' failed > FAIL test-dup3 (exit status: 134)
It looks like dup3 behaves differently on NetBSD. It is documented correctly, but I am not sure the reasoning behind the change. For NetBSD the return value [1]: These calls return the new file descriptor value. In the case of dup2() and dup3() this is always the same as newfd. If an error occurs, the value -1 is returned and errno is set to indicate what happened. For GNU/Linux [2]: If oldfd equals newfd, then dup3() fails with the error EINVAL. Currently dup3 is replaced unconditionally. I made this change in a NetBSD virtual machine and the test program passes: $ git diff . diff --git a/lib/dup3.c b/lib/dup3.c index a810d3be19..7674f042a4 100644 --- a/lib/dup3.c +++ b/lib/dup3.c @@ -34,6 +34,15 @@ dup3 (int oldfd, int newfd, int flags) /* Avoid a cygwin crasher. */ setdtablesize (newfd + 1); # endif + +#ifdef __NetBSD__ + if (newfd == oldfd) + { + errno = EINVAL; + return -1; + } +#endif + /* Try the system call first, if it exists. (We may be running with a glibc that has the function but with an older kernel that lacks it.) */ { Sort of messy but does the trick. I haven't applied it in case you have any better ideas. Collin [1] https://man.netbsd.org/dup3.2 [2] https://man7.org/linux/man-pages/man2/dup3.2.html