diff --git a/linux-ramdump-parser-v2/dmesglib.py b/linux-ramdump-parser-v2/dmesglib.py index a9d00e5f107c6277aecddbaa36d9754c332526e9..c22a2dbc2ae2131cc68d4519ae87b274e0da7726 100644 --- a/linux-ramdump-parser-v2/dmesglib.py +++ b/linux-ramdump-parser-v2/dmesglib.py @@ -14,6 +14,8 @@ import string from parser_util import cleanupString +LOG_MAGIC = 0x5d7aefca + class DmesgLib(object): def __init__(self, ramdump, outfile): @@ -46,6 +48,58 @@ class DmesgLib(object): else: return idx + msg_len + def verify_log_helper(self, msg, verbose): + # return early if CONFIG_LOG_BUF_MAGIC is not defined + log_align_addr = self.ramdump.addr_lookup('__log_align') + if (log_align_addr is None): + return True + + len_offset = self.ramdump.field_offset(self.struct_name, 'len') + text_offset = self.ramdump.field_offset(self.struct_name, 'text_len') + dict_offset = self.ramdump.field_offset(self.struct_name, 'dict_len') + magic_offset = self.ramdump.field_offset(self.struct_name, 'magic') + msg_len = self.ramdump.read_u16(msg + len_offset) + text_len = self.ramdump.read_u16(msg + text_offset) + dict_len = self.ramdump.read_u16(msg + dict_offset) + magic = self.ramdump.read_u32(msg + magic_offset) + log_size = self.ramdump.sizeof(self.struct_name) + log_align = self.ramdump.read_u32(log_align_addr) + is_logwrap_marker = not bool(text_len | msg_len | dict_len) + + err = [] + if (magic != LOG_MAGIC): + err.append('Bad Magic') + + computed_msg_len = (text_len + dict_len + log_size + log_align - 1) & ~(log_align - 1) + if (not is_logwrap_marker and (msg_len != computed_msg_len)): + err.append('Bad length') + + err = ' '.join(err) + if (err): + if (verbose): + f = '--------- Corrupted Dmesg {} for record @ {:x} ---------\n'.format(err, msg) + self.outfile.write(f) + f = self.ramdump.hexdump(msg - 0x40, 0xC0) + self.outfile.write(f) + return False + return True + + def verify_log(self, msg, logbuf_addr, last_idx): + logbuf_size = self.ramdump.sizeof('__log_buf') + log_size = self.ramdump.sizeof(self.struct_name) + + verbose = True + while msg != logbuf_addr + last_idx: + if (self.verify_log_helper(msg, verbose)): + return msg + verbose = False + msg = msg + 0x4 + if (msg > logbuf_addr + logbuf_size - log_size): + msg = logbuf_addr + self.wrap_cnt += 1 + + return logbuf_addr + last_idx + def extract_dmesg_flat(self): addr = self.ramdump.read_word(self.ramdump.addr_lookup('log_buf')) size = self.ramdump.read_word(self.ramdump.addr_lookup('log_buf_len')) @@ -75,6 +129,7 @@ class DmesgLib(object): timestamp / 1000000000, (timestamp % 1000000000) / 1000, partial) self.outfile.write(f) curr_idx = self.log_next(curr_idx, logbuf_addr) + curr_idx = self.verify_log(curr_idx, logbuf_addr, last_idx) def extract_dmesg(self): if re.search('3.7.\d', self.ramdump.version) is not None: