From: Szabolcs Nagy Date: Fri, 15 Jul 2022 13:10:53 +0000 (+0100) Subject: aarch64: morello: fix missing variadic argument in fcntl X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ed90470cc02574d8a0f1aae6c38089b43cc6e5f6;p=thirdparty%2Fglibc.git aarch64: morello: fix missing variadic argument in fcntl In fcntl va_arg is currently used even if the caller did not pass any variadic arguments. This is undefined behaviour and does not work with the Morello purecap ABI, so use a helper macro. When the argument is missing, the result of the helper macro is arbitrary as it will be ignored by the kernel, we just have to ensure it does not cause a runtime crash. --- diff --git a/sysdeps/unix/sysv/linux/aarch64/morello/sysdep.h b/sysdeps/unix/sysv/linux/aarch64/morello/sysdep.h index 5db89b096d7..bad64a0674a 100644 --- a/sysdeps/unix/sysv/linux/aarch64/morello/sysdep.h +++ b/sysdeps/unix/sysv/linux/aarch64/morello/sysdep.h @@ -105,6 +105,8 @@ typedef __intcap_t __sysarg_t; LOAD_ARGS_6 (c0, c1, c2, c3, c4, c5) \ register __sysarg_t _x6 asm ("c6") = _x6tmp; +# define FCNTL_VA_ARG(a, t) (a ? va_arg(a, t) : 0) + #endif /* __ASSEMBLER__ */ /* Disable pointer mangling for purecap ABI. */ diff --git a/sysdeps/unix/sysv/linux/fcntl64.c b/sysdeps/unix/sysv/linux/fcntl64.c index 5192b2d6726..0b6afd3b59e 100644 --- a/sysdeps/unix/sysv/linux/fcntl64.c +++ b/sysdeps/unix/sysv/linux/fcntl64.c @@ -29,6 +29,10 @@ # define __NR_fcntl64 __NR_fcntl #endif +#ifndef FCNTL_VA_ARG +# define FCNTL_VA_ARG(a, t) va_arg(a, t) +#endif + #ifndef FCNTL_ADJUST_CMD # define FCNTL_ADJUST_CMD(__cmd) __cmd #endif @@ -40,7 +44,7 @@ __libc_fcntl64 (int fd, int cmd, ...) void *arg; va_start (ap, cmd); - arg = va_arg (ap, void *); + arg = FCNTL_VA_ARG (ap, void *); va_end (ap); cmd = FCNTL_ADJUST_CMD (cmd); diff --git a/sysdeps/unix/sysv/linux/fcntl_nocancel.c b/sysdeps/unix/sysv/linux/fcntl_nocancel.c index 7c38e223990..f21b56d95bf 100644 --- a/sysdeps/unix/sysv/linux/fcntl_nocancel.c +++ b/sysdeps/unix/sysv/linux/fcntl_nocancel.c @@ -26,6 +26,10 @@ # define __NR_fcntl64 __NR_fcntl #endif +#ifndef FCNTL_VA_ARG +# define FCNTL_VA_ARG(a, t) va_arg(a, t) +#endif + #ifndef FCNTL_ADJUST_CMD # define FCNTL_ADJUST_CMD(__cmd) __cmd #endif @@ -37,7 +41,7 @@ __fcntl64_nocancel (int fd, int cmd, ...) void *arg; va_start (ap, cmd); - arg = va_arg (ap, void *); + arg = FCNTL_VA_ARG (ap, void *); va_end (ap); cmd = FCNTL_ADJUST_CMD (cmd);