update extract_kernel.py

commit 8b727765111bde78d1b1174e0ed54db819605dd8
Author: Yifan Hong <elsk@google.com>
Date:   Wed Sep 4 12:40:13 2019 -0700

    extract-kernel: Fix indexing

    The original script always tries to extract from index
    0 even if header is found in positive indices. Fix that.

    Also, continue to try other positions if previous run failed.

    Test: builds
    Bug: 139348603

    Change-Id: Ia54fc709de9ae587fc64b59d94a1fa4ae669c14f
pull/41/head
cfig 6 years ago
parent 4a819179f4
commit e250513570
No known key found for this signature in database
GPG Key ID: B104C307F0FDABB7

@ -47,7 +47,10 @@ def get_version(input_bytes, start_idx):
null_idx = input_bytes.find('\x00', start_idx)
if null_idx < 0:
return None
try:
linux_banner = input_bytes[start_idx:null_idx].decode()
except UnicodeDecodeError:
return None
mo = re.match(LINUX_BANNER_REGEX, linux_banner)
if mo:
return mo.group(1)
@ -97,19 +100,25 @@ def dump_configs(input_bytes):
return o
def try_decompress(cmd, search_bytes, input_bytes):
idx = input_bytes.find(search_bytes)
if idx < 0:
return None
idx = 0
def try_decompress_bytes(cmd, input_bytes):
sp = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
o, _ = sp.communicate(input=input_bytes[idx:])
o, _ = sp.communicate(input=input_bytes)
# ignore errors
return o
def try_decompress(cmd, search_bytes, input_bytes):
idx = 0
while True:
idx = input_bytes.find(search_bytes, idx)
if idx < 0:
raise StopIteration()
yield try_decompress_bytes(cmd, input_bytes[idx:])
idx += 1
def decompress_dump(func, input_bytes):
"""
Run func(input_bytes) first; and if that fails (returns value evaluates to
@ -119,15 +128,15 @@ def decompress_dump(func, input_bytes):
if o:
return o
for cmd, search_bytes in COMPRESSION_ALGO:
decompressed = try_decompress(cmd, search_bytes, input_bytes)
for decompressed in try_decompress(cmd, search_bytes, input_bytes):
if decompressed:
o = func(decompressed)
o = decompress_dump(func, decompressed)
if o:
return o
# Force decompress the whole file even if header doesn't match
decompressed = try_decompress(cmd, b"", input_bytes)
decompressed = try_decompress_bytes(cmd, input_bytes)
if decompressed:
o = func(decompressed)
o = decompress_dump(func, decompressed)
if o:
return o

Loading…
Cancel
Save