For making caches for process memory mapping, /proc/$pid/maps files
are scanned. When scanning an entry which file name is started from
`[' was ignore as fake files. As the result a system call using
[vdso] causes `unexpected_backtracing_error'.

This patch accepts the fake files as cache entries if they have
both readable and executable attributes. ([stack] and [heap] does
not have such attributes.)

Signed-off-by: Masatake YAMATO <yam...@redhat.com>
---
 unwind.c | 28 +++++++++++++++++++++-------
 1 file changed, 21 insertions(+), 7 deletions(-)

diff --git a/unwind.c b/unwind.c
index aff6c5a..788ed54 100644
--- a/unwind.c
+++ b/unwind.c
@@ -137,6 +137,7 @@ static void
 build_mmap_cache(struct tcb* tcp)
 {
        unsigned long start_addr, end_addr, mmap_offset;
+       char rflg, xflg;
        char filename[sizeof ("/proc/0123456789/maps")];
        char buffer[PATH_MAX + 80];
        char binary_path[PATH_MAX];
@@ -164,14 +165,27 @@ build_mmap_cache(struct tcb* tcp)
                die_out_of_memory();
 
        while (fgets(buffer, sizeof(buffer), fp) != NULL) {
-               binary_path[0] = '\0'; // 'reset' it just to be paranoid
-
-               sscanf(buffer, "%lx-%lx %*c%*c%*c%*c %lx %*x:%*x %*d %[^\n]",
-                      &start_addr, &end_addr, &mmap_offset, binary_path);
-
-               /* ignore special 'fake files' like "[vdso]", "[heap]", 
"[stack]", */
+               /* 'reset' it just to be paranoid */
+               binary_path[0] = '\0';
+               rflg = xflg = '-';
+
+               sscanf(buffer, "%lx-%lx %c%*c%c%*c %lx %*x:%*x %*d %[^\n]",
+                      &start_addr, &end_addr,
+                      &rflg, &xflg,
+                      &mmap_offset, binary_path);
+
+               /* ignore special 'fake files' like "[heap]", "[stack]",
+                  Normally ip should not jump into there.
+
+                  $ cat /proc/self/maps | grep '\['
+                  01105000-01126000 rw-p 00000000 00:00 0                      
            [heap]
+                  7fff495a0000-7fff495c1000 rw-p 00000000 00:00 0              
            [stack]
+                  7fff495fe000-7fff49600000 r-xp 00000000 00:00 0              
            [vdso]
+                  ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0      
            [vsyscall] */
                if (binary_path[0] == '[') {
-                       continue;
+                       if (!(rflg == 'r' && xflg == 'x'))
+                               continue;
+                       /* [vdso] is acceptable. */
                }
 
                if (binary_path[0] == '\0') {
-- 
1.9.0


------------------------------------------------------------------------------
HPCC Systems Open Source Big Data Platform from LexisNexis Risk Solutions
Find What Matters Most in Your Big Data with HPCC Systems
Open Source. Fast. Scalable. Simple. Ideal for Dirty Data.
Leverages Graph Analysis for Fast Processing & Easy Data Exploration
http://p.sf.net/sfu/hpccsystems
_______________________________________________
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel

Reply via email to