tools/nolibc: add support for prctl()
It will be used to disable core dumps from the child spawned to validate the stack protector functionality. Signed-off-by: Thomas Weißschuh <linux@weissschuh.net> Signed-off-by: Willy Tarreau <w@1wt.eu> Signed-off-by: Paul E. McKenney <paulmck@kernel.org>
This commit is contained in:
parent
79d8d4cad2
commit
208aa9d94c
|
@ -22,6 +22,7 @@
|
|||
#include <linux/fcntl.h> /* for O_* and AT_* */
|
||||
#include <linux/stat.h> /* for statx() */
|
||||
#include <linux/reboot.h> /* for LINUX_REBOOT_* */
|
||||
#include <linux/prctl.h>
|
||||
|
||||
#include "arch.h"
|
||||
#include "errno.h"
|
||||
|
@ -875,6 +876,32 @@ int open(const char *path, int flags, ...)
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
* int prctl(int option, unsigned long arg2, unsigned long arg3,
|
||||
* unsigned long arg4, unsigned long arg5);
|
||||
*/
|
||||
|
||||
static __attribute__((unused))
|
||||
int sys_prctl(int option, unsigned long arg2, unsigned long arg3,
|
||||
unsigned long arg4, unsigned long arg5)
|
||||
{
|
||||
return my_syscall5(__NR_prctl, option, arg2, arg3, arg4, arg5);
|
||||
}
|
||||
|
||||
static __attribute__((unused))
|
||||
int prctl(int option, unsigned long arg2, unsigned long arg3,
|
||||
unsigned long arg4, unsigned long arg5)
|
||||
{
|
||||
int ret = sys_prctl(option, arg2, arg3, arg4, arg5);
|
||||
|
||||
if (ret < 0) {
|
||||
SET_ERRNO(-ret);
|
||||
ret = -1;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* int pivot_root(const char *new, const char *old);
|
||||
*/
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
#include <sys/ioctl.h>
|
||||
#include <sys/mman.h>
|
||||
#include <sys/mount.h>
|
||||
#include <sys/prctl.h>
|
||||
#include <sys/reboot.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/syscall.h>
|
||||
|
@ -580,6 +581,7 @@ int run_syscall(int min, int max)
|
|||
CASE_TEST(poll_null); EXPECT_SYSZR(1, poll(NULL, 0, 0)); break;
|
||||
CASE_TEST(poll_stdout); EXPECT_SYSNE(1, ({ struct pollfd fds = { 1, POLLOUT, 0}; poll(&fds, 1, 0); }), -1); break;
|
||||
CASE_TEST(poll_fault); EXPECT_SYSER(1, poll((void *)1, 1, 0), -1, EFAULT); break;
|
||||
CASE_TEST(prctl); EXPECT_SYSER(1, prctl(PR_SET_NAME, (unsigned long)NULL, 0, 0, 0), -1, EFAULT); break;
|
||||
CASE_TEST(read_badf); EXPECT_SYSER(1, read(-1, &tmp, 1), -1, EBADF); break;
|
||||
CASE_TEST(sched_yield); EXPECT_SYSZR(1, sched_yield()); break;
|
||||
CASE_TEST(select_null); EXPECT_SYSZR(1, ({ struct timeval tv = { 0 }; select(0, NULL, NULL, NULL, &tv); })); break;
|
||||
|
|
Loading…
Reference in New Issue