mirror of
git://sourceware.org/git/glibc.git
synced 2025-03-06 20:58:33 +01:00
Commitff026950e2
("Add a C wrapper for prctl [BZ #25896]") replaced the assembler wrapper with a C function. However, on powerpc64le-linux-gnu, the C variadic function implementation requires extra work in the caller to set up the parameter save area. Calling a function that needs a parameter save area without one (because the prototype used indicates the function is not variadic) corrupts the caller's stack. The Linux manual pages project documents prctl as a non-variadic function. This has resulted in various projects over the years using non-variadic prototypes, including the sanitizer libraries in LLVm and GCC (GCC PR 113728). This commit switches back to the assembler implementation on most targets and only keeps the C implementation for x86-64 x32. Also add the __prctl_time64 alias from commitb39ffab860
("Linux: Add time64 alias for prctl") to sysdeps/unix/sysv/linux/syscalls.list; it was not yet present in commitff026950e2
. This restores the old ABI on powerpc64le-linux-gnu, thus fixing bug 29770. Reviewed-By: Simon Chopin <simon.chopin@canonical.com>
42 lines
1.6 KiB
C
42 lines
1.6 KiB
C
/* prctl - Linux specific syscall. x86-64 x32 version.
|
|
Copyright (C) 2020-2024 Free Software Foundation, Inc.
|
|
This file is part of the GNU C Library.
|
|
|
|
The GNU C Library is free software; you can redistribute it and/or
|
|
modify it under the terms of the GNU Lesser General Public
|
|
License as published by the Free Software Foundation; either
|
|
version 2.1 of the License, or (at your option) any later version.
|
|
|
|
The GNU C Library is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with the GNU C Library; if not, see
|
|
<https://www.gnu.org/licenses/>. */
|
|
|
|
#include <sysdep.h>
|
|
#include <stdarg.h>
|
|
#include <sys/prctl.h>
|
|
|
|
/* Unconditionally read all potential arguments. This may pass
|
|
garbage values to the kernel, but avoids the need for teaching
|
|
glibc the argument counts of individual options (including ones
|
|
that are added to the kernel in the future). */
|
|
|
|
int
|
|
__prctl (int option, ...)
|
|
{
|
|
va_list arg;
|
|
va_start (arg, option);
|
|
unsigned long int arg2 = va_arg (arg, unsigned long int);
|
|
unsigned long int arg3 = va_arg (arg, unsigned long int);
|
|
unsigned long int arg4 = va_arg (arg, unsigned long int);
|
|
unsigned long int arg5 = va_arg (arg, unsigned long int);
|
|
va_end (arg);
|
|
return INLINE_SYSCALL_CALL (prctl, option, arg2, arg3, arg4, arg5);
|
|
}
|
|
|
|
libc_hidden_def (__prctl)
|
|
weak_alias (__prctl, prctl)
|