Commit d1ff0e2d authored by Thomas Weißschuh's avatar Thomas Weißschuh Committed by Thomas Weißschuh
Browse files

tools/nolibc: avoid error in dup2() if old fd equals new fd



dup2() allows both 'old' and 'new' to have the same value, which dup3()
does not. If libc dup2() is implemented through the dup3() system call,
then it would incorrectly fail in this case.

Avoid the error by handling old == new explicitly.

Fixes: 30ca2051 ("tools headers: Move the nolibc header from rcutorture to tools/include/nolibc/")
Signed-off-by: default avatarThomas Weißschuh <thomas.weissschuh@linutronix.de>
Acked-by: default avatarWilly Tarreau <w@1wt.eu>
Link: https://lore.kernel.org/r/20250820-nolibc-dup2-einval-v2-1-807185a45c56@linutronix.de


Signed-off-by: default avatarThomas Weißschuh <linux@weissschuh.net>
parent 850047b1
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -238,6 +238,19 @@ static __attribute__((unused))
int sys_dup2(int old, int new)
{
#if defined(__NR_dup3)
	int ret, nr_fcntl;

#ifdef __NR_fcntl64
	nr_fcntl = __NR_fcntl64;
#else
	nr_fcntl = __NR_fcntl;
#endif

	if (old == new) {
		ret = my_syscall2(nr_fcntl, old, F_GETFD);
		return ret < 0 ? ret : old;
	}

	return my_syscall3(__NR_dup3, old, new, 0);
#elif defined(__NR_dup2)
	return my_syscall2(__NR_dup2, old, new);