mirror of
https://sourceware.org/git/glibc.git
synced 2025-01-11 03:40:06 +00:00
S390: Fix tst-ptrace-singleblock if kernel does not support PTRACE_SINGLEBLOCK.
The request PTRACE_SINGLEBLOCK was introduced in Linux 3.15. Thus the ptrace call will fail on older kernels. Thus the test is now testing PTRACE_SINGLEBLOCK with data argument pointing to a buffer on stack which is assumed to fail. If the request would be interpreted as PTRACE_GETREGS, then the ptrace call will not fail and the regs are written to buf. If we run with a kernel with support for PTRACE_SINGLEBLOCK a ptrace call with data=NULL, returns zero with no error. If we run with a kernel without support for PTRACE_SINGLEBLOCK a ptrace call with data=NULL reports an error. In the latter case, the test is just continuing with PTRACE_CONT. ChangeLog: * sysdeps/unix/sysv/linux/s390/tst-ptrace-singleblock.c: Support running on kernels without PTRACE_SINGLEBLOCK.
This commit is contained in:
parent
38eea35ca7
commit
2c80445787
@ -1,3 +1,8 @@
|
||||
2017-07-11 Stefan Liebler <stli@linux.vnet.ibm.com>
|
||||
|
||||
* sysdeps/unix/sysv/linux/s390/tst-ptrace-singleblock.c:
|
||||
Support running on kernels without PTRACE_SINGLEBLOCK.
|
||||
|
||||
2017-07-10 H.J. Lu <hongjiu.lu@intel.com>
|
||||
|
||||
[BZ #21742]
|
||||
|
@ -26,6 +26,8 @@
|
||||
#include <elf.h>
|
||||
#include <support/xunistd.h>
|
||||
#include <support/check.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
|
||||
/* Ensure that we use the PTRACE_SINGLEBLOCK definition from glibc ptrace.h
|
||||
in tracer_func. We need the kernel ptrace.h for structs ptrace_area
|
||||
@ -63,6 +65,10 @@ tracer_func (int pid)
|
||||
gregset_t regs2;
|
||||
|
||||
int status;
|
||||
int ret;
|
||||
#define MAX_CHARS_IN_BUF 4096
|
||||
char buf[MAX_CHARS_IN_BUF + 1];
|
||||
size_t buf_count;
|
||||
|
||||
while (1)
|
||||
{
|
||||
@ -104,11 +110,55 @@ tracer_func (int pid)
|
||||
The s390 kernel has no support for PTRACE_GETREGS!
|
||||
Thus glibc ptrace.h is adjusted to match kernel ptrace.h.
|
||||
|
||||
The glibc sys/ptrace.h header contains the identifier
|
||||
PTRACE_SINGLEBLOCK in enum __ptrace_request. In contrast, the kernel
|
||||
asm/ptrace.h header defines PTRACE_SINGLEBLOCK.
|
||||
|
||||
This test ensures, that PTRACE_SINGLEBLOCK defined in glibc
|
||||
works as expected. If the kernel would interpret it as
|
||||
PTRACE_GETREGS, then the tracee will not make any progress
|
||||
and this testcase will time out. */
|
||||
TEST_VERIFY_EXIT (ptrace (req_singleblock, pid, NULL, NULL) == 0);
|
||||
and this testcase will time out or the ptrace call will fail with
|
||||
different errors. */
|
||||
|
||||
/* Ptrace request 12 is first done with data argument pointing to
|
||||
a buffer:
|
||||
-If request 12 is interpreted as PTRACE_GETREGS, it will store the regs
|
||||
to buffer without an error.
|
||||
|
||||
-If request 12 is interpreted as PTRACE_SINGLEBLOCK, it will fail
|
||||
as data argument is used as signal-number and the address of
|
||||
buf is no valid signal.
|
||||
|
||||
-If request 12 is not implemented, it will also fail.
|
||||
|
||||
Here the test expects that the buffer is untouched and an error is
|
||||
returned. */
|
||||
memset (buf, 'a', MAX_CHARS_IN_BUF);
|
||||
ret = ptrace (req_singleblock, pid, NULL, buf);
|
||||
buf [MAX_CHARS_IN_BUF] = '\0';
|
||||
buf_count = strspn (buf, "a");
|
||||
TEST_VERIFY_EXIT (buf_count == MAX_CHARS_IN_BUF);
|
||||
TEST_VERIFY_EXIT (ret == -1);
|
||||
|
||||
/* If request 12 is interpreted as PTRACE_GETREGS, the first ptrace
|
||||
call will touch the buffer which is detected by this test. */
|
||||
errno = 0;
|
||||
ret = ptrace (req_singleblock, pid, NULL, NULL);
|
||||
if (ret == 0)
|
||||
{
|
||||
/* The kernel has support for PTRACE_SINGLEBLOCK ptrace request. */
|
||||
TEST_VERIFY_EXIT (errno == 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* The kernel (< 3.15) has no support for PTRACE_SINGLEBLOCK ptrace
|
||||
request. */
|
||||
TEST_VERIFY_EXIT (errno == EIO);
|
||||
TEST_VERIFY_EXIT (ret == -1);
|
||||
|
||||
/* Just continue tracee until it exits normally. */
|
||||
TEST_VERIFY_EXIT (ptrace (PTRACE_CONT, pid, NULL, NULL) == 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user