[PATCH] Add a C wrapper for prctl [BZ #25896]
Florian Weimer
fw@deneb.enyo.de
Thu Apr 30 07:26:18 GMT 2020
* H. J. Lu via Libc-alpha:
> Add a C wrapper to pass arguments in
>
> /* Control process execution. */
> extern int prctl (int __option, ...) __THROW;
>
> to prctl syscall:
>
> extern int prctl (int, unsigned long int, unsigned long int,
> unsigned long int, unsigned long int);
> ---
> include/sys/prctl.h | 2 ++
> sysdeps/unix/sysv/linux/Makefile | 2 +-
> sysdeps/unix/sysv/linux/prctl.c | 38 +++++++++++++++++++++++++++
> sysdeps/unix/sysv/linux/syscalls.list | 1 -
> 4 files changed, 41 insertions(+), 2 deletions(-)
> create mode 100644 sysdeps/unix/sysv/linux/prctl.c
>
> diff --git a/include/sys/prctl.h b/include/sys/prctl.h
> index 0920ed642b..1a74d83879 100644
> --- a/include/sys/prctl.h
> +++ b/include/sys/prctl.h
> @@ -4,6 +4,8 @@
> # ifndef _ISOMAC
>
> extern int __prctl (int __option, ...);
> +libc_hidden_proto (__prctl)
> +libc_hidden_proto (prctl)
I see we have some internal callers of prctl. I will clean this up
later.
> diff --git a/sysdeps/unix/sysv/linux/prctl.c b/sysdeps/unix/sysv/linux/prctl.c
> new file mode 100644
> index 0000000000..b3fc12ccf5
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/prctl.c
> @@ -0,0 +1,38 @@
> +/* prctl - Linux specific syscall.
> + Copyright (C) 2020 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>
> +
> +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);
> +}
Please add a comment that this over-reads arguments for some option
values, something like:
/* 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). */
Rest looks fine. Generated code is quite a bit worse, but I don't
think this matter here.
More information about the Libc-alpha
mailing list