Q: s390/s390x SIGSEGV SEGV_MAPERR reporting
Dmitry V. Levin
ldv at altlinux.org
Sun Mar 1 01:08:06 UTC 2015
On Sat, Feb 28, 2015 at 04:27:21PM -0500, Mike Frysinger wrote:
> i guess we just ignore the failure on s390/s390x and let upstream sort it out.
I was going to apply the following patch but, surprisingly,
it fails on ppc64:
[00001fffffeb61c4] mmap(NULL, 65536, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x1ffffff80000
...
[pid 12345] [0000000010000760] --- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_ACCERR, si_addr=0x1ffffff80000} ---
--- a/tests/pc.c
+++ b/tests/pc.c
@@ -1,23 +1,18 @@
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-#include <dlfcn.h>
-#include <fcntl.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/wait.h>
-#include <sys/sendfile.h>
int main(void)
{
- const unsigned long pagesize = sysconf(_SC_PAGESIZE);
+ const unsigned long size = sysconf(_SC_PAGESIZE);
+ void *addr;
- /* write instruction pointer length to the log */
- if (write(-1, NULL, 2 * sizeof(void *)) >= 0)
+ addr = mmap(NULL, size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ if (!addr || addr == MAP_FAILED)
return 77;
- /* just a noticeable line in the log */
- if (munmap(&main, 0) >= 0)
+ /* write instruction pointer length to the log */
+ if (write(-1, NULL, 2 * sizeof(void *)) >= 0)
return 77;
int pid = fork();
@@ -25,29 +20,13 @@ int main(void)
return 77;
if (!pid) {
- const unsigned long mask = ~(pagesize - 1);
- unsigned long addr = (unsigned long) &main & mask;
- unsigned long size = pagesize << 1;
+ union {
+ void (*f)(void);
+ void *p;
+ } crash = { .p = addr };
-#ifdef HAVE_DLADDR
- Dl_info info;
- if (dladdr(&main, &info)) {
- const unsigned long base =
- (unsigned long) info.dli_fbase & mask;
- if (base < addr) {
- size += addr - base;
- addr = base;
- }
- } else
-#endif
- {
- addr -= size;
- size <<= 1;
- }
+ crash.f();
- /* SIGSEGV is expected */
- (void) munmap((void *) addr, size);
- (void) munmap((void *) addr, size);
return 77;
}
@@ -57,10 +36,5 @@ int main(void)
WTERMSIG(status) != SIGSEGV)
return 77;
- /* dump process map for debug purposes */
- close(0);
- if (!open("/proc/self/maps", O_RDONLY))
- (void) sendfile(1, 0, NULL, pagesize);
-
return 0;
}
--- a/tests/pc.test
+++ b/tests/pc.test
@@ -17,13 +17,13 @@ $STRACE $args > "$OUT" 2> "$LOG" || {
fail_ "$STRACE $args does not work"
}
-len="$(sed -n 's/^\[[[:xdigit:]]\+\] write(-1, NULL, \([[:digit:]]\{1,2\}\))[[:space:]]\+= -1 .*/\1/p' "$LOG")" &&
+len="$(sed -n 's/^\[[[:xdigit:]]\+\] write(-1, NULL, \([[:digit:]]\{1,2\}\)) \+= -1 .*/\1/p' "$LOG")" &&
[ -n "$len" ] &&
pid="$(sed -n 's/^\[[[:xdigit:]]\{'"$len"'\}\] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_\(KILLED\|DUMPED\), si_pid=\([[:digit:]]\+\), .*/\2/p' "$LOG")" &&
[ -n "$pid" ] &&
-ip="$(sed -n 's/^\[pid \+'"$pid"'\] \[\([[:xdigit:]]\{'"$len"'\}\)] --- SIGSEGV {.*} ---$/\1/p' "$LOG")" &&
-[ -n "$ip" ] &&
-addr="$(echo "$ip" |sed 's/^0\+//')" &&
+addr="$(sed -n 's/^\[pid \+'"$pid"'\] \[\([[:xdigit:]]\{'"$len"'\}\)] --- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_[^,]\+, si_addr=0x[[:xdigit:]]\+} ---$/\1/p' "$LOG")" &&
+[ -n "$addr" ] &&
+addr="$(echo "$addr" |sed 's/^0\+//')" &&
[ -n "$addr" ] || {
cat "$OUT" "$LOG"
fail_ "$STRACE $args output mismatch"
@@ -37,8 +37,7 @@ grep_log()
}
}
-grep_log '\[[[:xdigit:]]\{'"$len"'\}\] munmap(0x[[:xdigit:]]\+, 0)[[:space:]]\+= -1 .*'
-grep_log '\[pid \+'"$pid"'\] \['"$ip"'\] --- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0x'"$addr"'} ---'
+grep_log '\[[[:xdigit:]]\+\] [^(]*mmap[^(]*(NULL, [[:digit:]]\+, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) \+= 0x'"$addr"
grep_log '\[pid \+'"$pid"'\] \[?\{'"$len"'\}\] +++ killed by SIGSEGV\( (core dumped)\)\? +++'
grep_log '\[?\{'"$len"'\}\] +++ exited with 0 +++'
--
ldv
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <http://lists.strace.io/pipermail/strace-devel/attachments/20150301/5069b183/attachment.bin>
More information about the Strace-devel
mailing list