]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
tools/nolibc: avoid error in dup2() if old fd equals new fd
authorThomas Weißschuh <thomas.weissschuh@linutronix.de>
Wed, 20 Aug 2025 08:29:27 +0000 (10:29 +0200)
committerThomas Weißschuh <linux@weissschuh.net>
Mon, 1 Sep 2025 18:47:36 +0000 (20:47 +0200)
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: 30ca20517ac1 ("tools headers: Move the nolibc header from rcutorture to tools/include/nolibc/")
Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
Acked-by: Willy Tarreau <w@1wt.eu>
Link: https://lore.kernel.org/r/20250820-nolibc-dup2-einval-v2-1-807185a45c56@linutronix.de
Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>
tools/include/nolibc/sys.h

index 295e71d34abadb7f9c7ca995012b4395b6830975..90aadad31f6cb5a425b8f91dc2dfc9cfafbac9a0 100644 (file)
@@ -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);