diff --git a/glibc.spec b/glibc.spec index 34e08b3..df0e771 100644 --- a/glibc.spec +++ b/glibc.spec @@ -62,7 +62,7 @@ ############################################################################## Name: glibc Version: 2.28 -Release: 93 +Release: 94 Summary: The GNU libc libraries License: %{all_license} URL: http://www.gnu.org/software/glibc/ @@ -156,6 +156,7 @@ Patch69: getcwd-Set-errno-to-ERANGE-for-size-1-CVE-2021-3999.patch Patch70: x86-Fix-__wcsncmp_avx2-in-strcmp-avx2.S-BZ-28755.patch Patch71: x86-Add-the-virtual-machine-detection-in-init_cacheinfo.patch Patch72: gmon-Fix-allocated-buffer-overflow-bug-29444.patch +Patch73: mips-Fix-argument-passing-for-inlined-syscalls-on-Linux-BZ-25523.patch Provides: ldconfig rtld(GNU_HASH) bundled(gnulib) @@ -1215,6 +1216,9 @@ fi %endif %changelog +* Tue Jul 18 2023 Zhou Zhifa - 2.28-94 +- mips: Fix argument passing for inlined syscalls on Linux [BZ #25523] + * Thu Feb 23 2023 Qingqing Li - 2.28-93 - gmon: Fix allocated buffer overflow (bug 29444) diff --git a/mips-Fix-argument-passing-for-inlined-syscalls-on-Linux-BZ-25523.patch b/mips-Fix-argument-passing-for-inlined-syscalls-on-Linux-BZ-25523.patch new file mode 100644 index 0000000..ff7581c --- /dev/null +++ b/mips-Fix-argument-passing-for-inlined-syscalls-on-Linux-BZ-25523.patch @@ -0,0 +1,353 @@ +From 4fbba6fe904d0094ddc4284066b3860d119cbd4a Mon Sep 17 00:00:00 2001 +From: WANG Xuerui +Date: Thu, 13 Feb 2020 00:57:03 +0800 +Subject: [PATCH] mips: Fix argument passing for inlined syscalls on Linux [BZ + #25523] + +According to [gcc documentation][1], temporary variables must be used for +the desired content to not be call-clobbered. + +Fix the Linux inline syscall templates by adding temporary variables, +much like what x86 did before +(commit 381a0c26d73e0f074c962e0ab53b99a6c327066d). + +Tested with gcc 9.2.0, both cross-compiled and natively on Loongson +3A4000. + +[1]: https://gcc.gnu.org/onlinedocs/gcc/Local-Register-Variables.html +--- + sysdeps/unix/sysv/linux/mips/mips32/sysdep.h | 30 ++++++--- + .../unix/sysv/linux/mips/mips64/n32/sysdep.h | 63 ++++++++++++------- + .../unix/sysv/linux/mips/mips64/n64/sysdep.h | 63 ++++++++++++------- + 3 files changed, 104 insertions(+), 52 deletions(-) + +diff --git a/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h b/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h +index beefcf284b..c275d63f67 100644 +--- a/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h ++++ b/sysdeps/unix/sysv/linux/mips/mips32/sysdep.h +@@ -178,10 +178,11 @@ union __mips_syscall_return + long _sys_result; \ + \ + { \ ++ long _arg1 = (long) (arg1); \ + register long __s0 asm ("$16") __attribute__ ((unused)) \ + = (number); \ + register long __v0 asm ("$2"); \ +- register long __a0 asm ("$4") = (long) (arg1); \ ++ register long __a0 asm ("$4") = _arg1; \ + register long __a3 asm ("$7"); \ + __asm__ volatile ( \ + ".set\tnoreorder\n\t" \ +@@ -202,11 +203,13 @@ union __mips_syscall_return + long _sys_result; \ + \ + { \ ++ long _arg1 = (long) (arg1); \ ++ long _arg2 = (long) (arg2); \ + register long __s0 asm ("$16") __attribute__ ((unused)) \ + = (number); \ + register long __v0 asm ("$2"); \ +- register long __a0 asm ("$4") = (long) (arg1); \ +- register long __a1 asm ("$5") = (long) (arg2); \ ++ register long __a0 asm ("$4") = _arg1; \ ++ register long __a1 asm ("$5") = _arg2; \ + register long __a3 asm ("$7"); \ + __asm__ volatile ( \ + ".set\tnoreorder\n\t" \ +@@ -228,12 +231,15 @@ union __mips_syscall_return + long _sys_result; \ + \ + { \ ++ long _arg1 = (long) (arg1); \ ++ long _arg2 = (long) (arg2); \ ++ long _arg3 = (long) (arg3); \ + register long __s0 asm ("$16") __attribute__ ((unused)) \ + = (number); \ + register long __v0 asm ("$2"); \ +- register long __a0 asm ("$4") = (long) (arg1); \ +- register long __a1 asm ("$5") = (long) (arg2); \ +- register long __a2 asm ("$6") = (long) (arg3); \ ++ register long __a0 asm ("$4") = _arg1; \ ++ register long __a1 asm ("$5") = _arg2; \ ++ register long __a2 asm ("$6") = _arg3; \ + register long __a3 asm ("$7"); \ + __asm__ volatile ( \ + ".set\tnoreorder\n\t" \ +@@ -255,13 +261,17 @@ union __mips_syscall_return + long _sys_result; \ + \ + { \ ++ long _arg1 = (long) (arg1); \ ++ long _arg2 = (long) (arg2); \ ++ long _arg3 = (long) (arg3); \ ++ long _arg4 = (long) (arg4); \ + register long __s0 asm ("$16") __attribute__ ((unused)) \ + = (number); \ + register long __v0 asm ("$2"); \ +- register long __a0 asm ("$4") = (long) (arg1); \ +- register long __a1 asm ("$5") = (long) (arg2); \ +- register long __a2 asm ("$6") = (long) (arg3); \ +- register long __a3 asm ("$7") = (long) (arg4); \ ++ register long __a0 asm ("$4") = _arg1; \ ++ register long __a1 asm ("$5") = _arg2; \ ++ register long __a2 asm ("$6") = _arg3; \ ++ register long __a3 asm ("$7") = _arg4; \ + __asm__ volatile ( \ + ".set\tnoreorder\n\t" \ + v0_init \ +diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h b/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h +index f96636538a..958a889147 100644 +--- a/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h ++++ b/sysdeps/unix/sysv/linux/mips/mips64/n32/sysdep.h +@@ -138,10 +138,11 @@ + long _sys_result; \ + \ + { \ ++ long long _arg1 = ARGIFY (arg1); \ + register long long __s0 asm ("$16") __attribute__ ((unused)) \ + = (number); \ + register long long __v0 asm ("$2"); \ +- register long long __a0 asm ("$4") = ARGIFY (arg1); \ ++ register long long __a0 asm ("$4") = _arg1; \ + register long long __a3 asm ("$7"); \ + __asm__ volatile ( \ + ".set\tnoreorder\n\t" \ +@@ -162,11 +163,13 @@ + long _sys_result; \ + \ + { \ ++ long long _arg1 = ARGIFY (arg1); \ ++ long long _arg2 = ARGIFY (arg2); \ + register long long __s0 asm ("$16") __attribute__ ((unused)) \ + = (number); \ + register long long __v0 asm ("$2"); \ +- register long long __a0 asm ("$4") = ARGIFY (arg1); \ +- register long long __a1 asm ("$5") = ARGIFY (arg2); \ ++ register long long __a0 asm ("$4") = _arg1; \ ++ register long long __a1 asm ("$5") = _arg2; \ + register long long __a3 asm ("$7"); \ + __asm__ volatile ( \ + ".set\tnoreorder\n\t" \ +@@ -188,12 +191,15 @@ + long _sys_result; \ + \ + { \ ++ long long _arg1 = ARGIFY (arg1); \ ++ long long _arg2 = ARGIFY (arg2); \ ++ long long _arg3 = ARGIFY (arg3); \ + register long long __s0 asm ("$16") __attribute__ ((unused)) \ + = (number); \ + register long long __v0 asm ("$2"); \ +- register long long __a0 asm ("$4") = ARGIFY (arg1); \ +- register long long __a1 asm ("$5") = ARGIFY (arg2); \ +- register long long __a2 asm ("$6") = ARGIFY (arg3); \ ++ register long long __a0 asm ("$4") = _arg1; \ ++ register long long __a1 asm ("$5") = _arg2; \ ++ register long long __a2 asm ("$6") = _arg3; \ + register long long __a3 asm ("$7"); \ + __asm__ volatile ( \ + ".set\tnoreorder\n\t" \ +@@ -215,13 +221,17 @@ + long _sys_result; \ + \ + { \ ++ long long _arg1 = ARGIFY (arg1); \ ++ long long _arg2 = ARGIFY (arg2); \ ++ long long _arg3 = ARGIFY (arg3); \ ++ long long _arg4 = ARGIFY (arg4); \ + register long long __s0 asm ("$16") __attribute__ ((unused)) \ + = (number); \ + register long long __v0 asm ("$2"); \ +- register long long __a0 asm ("$4") = ARGIFY (arg1); \ +- register long long __a1 asm ("$5") = ARGIFY (arg2); \ +- register long long __a2 asm ("$6") = ARGIFY (arg3); \ +- register long long __a3 asm ("$7") = ARGIFY (arg4); \ ++ register long long __a0 asm ("$4") = _arg1; \ ++ register long long __a1 asm ("$5") = _arg2; \ ++ register long long __a2 asm ("$6") = _arg3; \ ++ register long long __a3 asm ("$7") = _arg4; \ + __asm__ volatile ( \ + ".set\tnoreorder\n\t" \ + v0_init \ +@@ -242,14 +252,19 @@ + long _sys_result; \ + \ + { \ ++ long long _arg1 = ARGIFY (arg1); \ ++ long long _arg2 = ARGIFY (arg2); \ ++ long long _arg3 = ARGIFY (arg3); \ ++ long long _arg4 = ARGIFY (arg4); \ ++ long long _arg5 = ARGIFY (arg5); \ + register long long __s0 asm ("$16") __attribute__ ((unused)) \ + = (number); \ + register long long __v0 asm ("$2"); \ +- register long long __a0 asm ("$4") = ARGIFY (arg1); \ +- register long long __a1 asm ("$5") = ARGIFY (arg2); \ +- register long long __a2 asm ("$6") = ARGIFY (arg3); \ +- register long long __a3 asm ("$7") = ARGIFY (arg4); \ +- register long long __a4 asm ("$8") = ARGIFY (arg5); \ ++ register long long __a0 asm ("$4") = _arg1; \ ++ register long long __a1 asm ("$5") = _arg2; \ ++ register long long __a2 asm ("$6") = _arg3; \ ++ register long long __a3 asm ("$7") = _arg4; \ ++ register long long __a4 asm ("$8") = _arg5; \ + __asm__ volatile ( \ + ".set\tnoreorder\n\t" \ + v0_init \ +@@ -270,15 +285,21 @@ + long _sys_result; \ + \ + { \ ++ long long _arg1 = ARGIFY (arg1); \ ++ long long _arg2 = ARGIFY (arg2); \ ++ long long _arg3 = ARGIFY (arg3); \ ++ long long _arg4 = ARGIFY (arg4); \ ++ long long _arg5 = ARGIFY (arg5); \ ++ long long _arg6 = ARGIFY (arg6); \ + register long long __s0 asm ("$16") __attribute__ ((unused)) \ + = (number); \ + register long long __v0 asm ("$2"); \ +- register long long __a0 asm ("$4") = ARGIFY (arg1); \ +- register long long __a1 asm ("$5") = ARGIFY (arg2); \ +- register long long __a2 asm ("$6") = ARGIFY (arg3); \ +- register long long __a3 asm ("$7") = ARGIFY (arg4); \ +- register long long __a4 asm ("$8") = ARGIFY (arg5); \ +- register long long __a5 asm ("$9") = ARGIFY (arg6); \ ++ register long long __a0 asm ("$4") = _arg1; \ ++ register long long __a1 asm ("$5") = _arg2; \ ++ register long long __a2 asm ("$6") = _arg3; \ ++ register long long __a3 asm ("$7") = _arg4; \ ++ register long long __a4 asm ("$8") = _arg5; \ ++ register long long __a5 asm ("$9") = _arg6; \ + __asm__ volatile ( \ + ".set\tnoreorder\n\t" \ + v0_init \ +diff --git a/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h b/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h +index 9d30291f84..f47613deaf 100644 +--- a/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h ++++ b/sysdeps/unix/sysv/linux/mips/mips64/n64/sysdep.h +@@ -134,10 +134,11 @@ + long _sys_result; \ + \ + { \ ++ long _arg1 = (long) (arg1); \ + register long __s0 asm ("$16") __attribute__ ((unused)) \ + = (number); \ + register long __v0 asm ("$2"); \ +- register long __a0 asm ("$4") = (long) (arg1); \ ++ register long __a0 asm ("$4") = _arg1; \ + register long __a3 asm ("$7"); \ + __asm__ volatile ( \ + ".set\tnoreorder\n\t" \ +@@ -158,11 +159,13 @@ + long _sys_result; \ + \ + { \ ++ long _arg1 = (long) (arg1); \ ++ long _arg2 = (long) (arg2); \ + register long __s0 asm ("$16") __attribute__ ((unused)) \ + = (number); \ + register long __v0 asm ("$2"); \ +- register long __a0 asm ("$4") = (long) (arg1); \ +- register long __a1 asm ("$5") = (long) (arg2); \ ++ register long __a0 asm ("$4") = _arg1; \ ++ register long __a1 asm ("$5") = _arg2; \ + register long __a3 asm ("$7"); \ + __asm__ volatile ( \ + ".set\tnoreorder\n\t" \ +@@ -184,12 +187,15 @@ + long _sys_result; \ + \ + { \ ++ long _arg1 = (long) (arg1); \ ++ long _arg2 = (long) (arg2); \ ++ long _arg3 = (long) (arg3); \ + register long __s0 asm ("$16") __attribute__ ((unused)) \ + = (number); \ + register long __v0 asm ("$2"); \ +- register long __a0 asm ("$4") = (long) (arg1); \ +- register long __a1 asm ("$5") = (long) (arg2); \ +- register long __a2 asm ("$6") = (long) (arg3); \ ++ register long __a0 asm ("$4") = _arg1; \ ++ register long __a1 asm ("$5") = _arg2; \ ++ register long __a2 asm ("$6") = _arg3; \ + register long __a3 asm ("$7"); \ + __asm__ volatile ( \ + ".set\tnoreorder\n\t" \ +@@ -211,13 +217,17 @@ + long _sys_result; \ + \ + { \ ++ long _arg1 = (long) (arg1); \ ++ long _arg2 = (long) (arg2); \ ++ long _arg3 = (long) (arg3); \ ++ long _arg4 = (long) (arg4); \ + register long __s0 asm ("$16") __attribute__ ((unused)) \ + = (number); \ + register long __v0 asm ("$2"); \ +- register long __a0 asm ("$4") = (long) (arg1); \ +- register long __a1 asm ("$5") = (long) (arg2); \ +- register long __a2 asm ("$6") = (long) (arg3); \ +- register long __a3 asm ("$7") = (long) (arg4); \ ++ register long __a0 asm ("$4") = _arg1; \ ++ register long __a1 asm ("$5") = _arg2; \ ++ register long __a2 asm ("$6") = _arg3; \ ++ register long __a3 asm ("$7") = _arg4; \ + __asm__ volatile ( \ + ".set\tnoreorder\n\t" \ + v0_init \ +@@ -238,14 +248,19 @@ + long _sys_result; \ + \ + { \ ++ long _arg1 = (long) (arg1); \ ++ long _arg2 = (long) (arg2); \ ++ long _arg3 = (long) (arg3); \ ++ long _arg4 = (long) (arg4); \ ++ long _arg5 = (long) (arg5); \ + register long __s0 asm ("$16") __attribute__ ((unused)) \ + = (number); \ + register long __v0 asm ("$2"); \ +- register long __a0 asm ("$4") = (long) (arg1); \ +- register long __a1 asm ("$5") = (long) (arg2); \ +- register long __a2 asm ("$6") = (long) (arg3); \ +- register long __a3 asm ("$7") = (long) (arg4); \ +- register long __a4 asm ("$8") = (long) (arg5); \ ++ register long __a0 asm ("$4") = _arg1; \ ++ register long __a1 asm ("$5") = _arg2; \ ++ register long __a2 asm ("$6") = _arg3; \ ++ register long __a3 asm ("$7") = _arg4; \ ++ register long __a4 asm ("$8") = _arg5; \ + __asm__ volatile ( \ + ".set\tnoreorder\n\t" \ + v0_init \ +@@ -266,15 +281,21 @@ + long _sys_result; \ + \ + { \ ++ long _arg1 = (long) (arg1); \ ++ long _arg2 = (long) (arg2); \ ++ long _arg3 = (long) (arg3); \ ++ long _arg4 = (long) (arg4); \ ++ long _arg5 = (long) (arg5); \ ++ long _arg6 = (long) (arg6); \ + register long __s0 asm ("$16") __attribute__ ((unused)) \ + = (number); \ + register long __v0 asm ("$2"); \ +- register long __a0 asm ("$4") = (long) (arg1); \ +- register long __a1 asm ("$5") = (long) (arg2); \ +- register long __a2 asm ("$6") = (long) (arg3); \ +- register long __a3 asm ("$7") = (long) (arg4); \ +- register long __a4 asm ("$8") = (long) (arg5); \ +- register long __a5 asm ("$9") = (long) (arg6); \ ++ register long __a0 asm ("$4") = _arg1; \ ++ register long __a1 asm ("$5") = _arg2; \ ++ register long __a2 asm ("$6") = _arg3; \ ++ register long __a3 asm ("$7") = _arg4; \ ++ register long __a4 asm ("$8") = _arg5; \ ++ register long __a5 asm ("$9") = _arg6; \ + __asm__ volatile ( \ + ".set\tnoreorder\n\t" \ + v0_init \ +-- +2.24.1