From b02616f5b1e1867073967e9773e0f72a88bea9d6 Mon Sep 17 00:00:00 2001
From: wadesong <wadesong@codeaurora.org>
Date: Sun, 16 Jul 2017 00:29:47 +0800
Subject: [PATCH] lrdp-v2: Correct SLUB track address calculation

SLUB allocation and freeing tracking storage address calculation
doesn't take into account the length of the red zone header,
resulting in incorrect stack dump when Linux RAM dump parser is
used to parse(with --slabinfo option)dumps generated with
SLUB_DEBUG options enabled.

Change-Id: I50f4c6d304ff1ecd57bfddb1bfa9441ff5cb3ac1
---
 linux-ramdump-parser-v2/parsers/slabinfo.py | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/linux-ramdump-parser-v2/parsers/slabinfo.py b/linux-ramdump-parser-v2/parsers/slabinfo.py
index ff9dcac..28a3dfd 100644
--- a/linux-ramdump-parser-v2/parsers/slabinfo.py
+++ b/linux-ramdump-parser-v2/parsers/slabinfo.py
@@ -76,6 +76,11 @@ class kmem_cache(object):
         self.inuse = ramdump.read_int(addr + offset)
         if self.inuse is None:
             return
+        offset = ramdump.field_offset(
+            'struct kmem_cache', 'red_left_pad')
+        self.red_left_pad = ramdump.read_int(addr + offset)
+        if self.red_left_pad is None:
+            self.red_left_pad = 0
         self.addr = addr
         self.valid = True
 
@@ -147,9 +152,9 @@ class Slabinfo(RamParser):
     def get_track(self, ramdump,  slab, obj, track_type):
         track_size = g_offsetof.sizeof_struct_track
         if slab.offset != 0:
-            p = obj + slab.offset + g_offsetof.sizeof_void_pointer
+            p = obj + slab.red_left_pad + slab.offset + g_offsetof.sizeof_void_pointer
         else:
-            p = obj + slab.inuse
+            p = obj + slab.red_left_pad + slab.inuse
         return p + track_type * track_size
 
     def extract_callstack(self, ramdump, stack, out_file):
-- 
GitLab