To make mmap_cache reusable, this change records protection bits of
mmap entry.

* defs.h (MMAP_CACHE_PROT_*): New enums.
* mmap_cache.c (build_mmpa_cache): Don't ignore entries that are not
  executable. Just record the protection bits here.
* unwind.c (print_stack_frame): Ignore entries that are not executable
  here.

Signed-off-by: Masatake YAMATO <yam...@redhat.com>
---
 defs.h       |  9 +++++++++
 mmap_cache.c | 27 ++++++++++++++++++++++-----
 unwind.c     |  4 +++-
 3 files changed, 34 insertions(+), 6 deletions(-)

diff --git a/defs.h b/defs.h
index 1081a962..f49d6f56 100644
--- a/defs.h
+++ b/defs.h
@@ -732,14 +732,23 @@ struct mmap_cache_t {
         * start_addr  is 0x7fabbb09b000
         * end_addr    is 0x7fabbb09f000
         * mmap_offset is 0x179000
+        * protections is MMAP_CACHE_PROT_READABLE|MMAP_CACHE_PROT_EXECUTABLE
         * binary_filename is "/lib/libc-2.11.1.so"
         */
        unsigned long start_addr;
        unsigned long end_addr;
        unsigned long mmap_offset;
+       unsigned char protections;
        char *binary_filename;
 };
 
+enum mmap_cache_protection {
+       MMAP_CACHE_PROT_READABLE   = 1 << 0,
+       MMAP_CACHE_PROT_WRITABLE   = 1 << 1,
+       MMAP_CACHE_PROT_EXECUTABLE = 1 << 2,
+       MMAP_CACHE_PROT_SHARED     = 1 << 3,
+};
+
 enum mmap_cache_rebuild_result {
        MMAP_CACHE_REBUILD_NOCACHE,
        MMAP_CACHE_REBUILD_READY,
diff --git a/mmap_cache.c b/mmap_cache.c
index 0c6e2b7e..a3367027 100644
--- a/mmap_cache.c
+++ b/mmap_cache.c
@@ -68,16 +68,26 @@ build_mmap_cache(struct tcb *tcp)
        while (fgets(buffer, sizeof(buffer), fp) != NULL) {
                struct mmap_cache_t *entry;
                unsigned long start_addr, end_addr, mmap_offset;
+               char read_bit;
+               char write_bit;
                char exec_bit;
+               char shared_bit;
                char binary_path[sizeof(buffer)];
 
-               if (sscanf(buffer, "%lx-%lx %*c%*c%c%*c %lx %*x:%*x %*d %[^\n]",
-                          &start_addr, &end_addr, &exec_bit,
-                          &mmap_offset, binary_path) != 5)
+               if (sscanf(buffer, "%lx-%lx %c%c%c%c %lx %*x:%*x %*d %[^\n]",
+                          &start_addr, &end_addr,
+                          &read_bit, &write_bit, &exec_bit, &shared_bit,
+                          &mmap_offset, binary_path) != 8)
                        continue;
 
-               /* ignore mappings that have no PROT_EXEC bit set */
-               if (exec_bit != 'x')
+               /* skip mappings having unknown protection */
+               if (!(read_bit == '-' || read_bit == 'r'))
+                       continue;
+               if (!(write_bit == '-' || write_bit == 'w'))
+                       continue;
+               if (!(exec_bit == '-' || exec_bit == 'x'))
+                       continue;
+               if (!(shared_bit == 'p' || shared_bit == 's'))
                        continue;
 
                if (end_addr < start_addr) {
@@ -116,6 +126,13 @@ build_mmap_cache(struct tcb *tcp)
                entry->start_addr = start_addr;
                entry->end_addr = end_addr;
                entry->mmap_offset = mmap_offset;
+               entry->protections = (
+                       0
+                       | ((read_bit   == 'r')? MMAP_CACHE_PROT_READABLE  : 0)
+                       | ((write_bit  == 'w')? MMAP_CACHE_PROT_WRITABLE  : 0)
+                       | ((exec_bit   == 'x')? MMAP_CACHE_PROT_EXECUTABLE: 0)
+                       | ((shared_bit == 's')? MMAP_CACHE_PROT_SHARED    : 0)
+                       );
                entry->binary_filename = xstrdup(binary_path);
                tcp->mmap_cache_size++;
        }
diff --git a/unwind.c b/unwind.c
index 56a7b9ce..ef98fc99 100644
--- a/unwind.c
+++ b/unwind.c
@@ -139,7 +139,9 @@ print_stack_frame(struct tcb *tcp,
        }
 
        cur_mmap_cache = mmap_cache_search(tcp, ip);
-       if (cur_mmap_cache) {
+       if (cur_mmap_cache
+           /* ignore mappings that have no PROT_EXEC bit set */
+           && (cur_mmap_cache->protections & MMAP_CACHE_PROT_EXECUTABLE)) {
                unsigned long true_offset;
                unw_word_t function_offset;
 
-- 
2.14.3


------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Strace-devel mailing list
Strace-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/strace-devel

Reply via email to