Fix the symlink detection when signing TF.zip.

We used to check for 'attr >> 16 == 0xa1ff' (i.e. 0o120777) to detect
symlinks in the input target_files zip (TF.zip). This becomes broken
after we switch to soong_zip, which packs symlinks with 0o120700.

This CL fixes the issue by using stat.S_ISLNK() instead.

Note that we don't need to stage the files with the exact permission
bits as in the input TF.zip. Because this part is covered by mkbootfs
by using the canned or the compiled-in fs_config - as long as the
files/directories are accessible and the symlinks are created.

Bug: 38455129
Test: sign_target_files_apks.py on bullhead TF.zip. Check the
      checksums in SYSTEM/bin/install-recovery.sh.
Change-Id: I51c1fc9a257fb3f18c16c2ed71528abaa6f7d9c9
(cherry picked from commit 406050bdb6)
This commit is contained in:
Tao Bao 2017-05-22 23:16:32 -07:00
parent 66d4710933
commit 3eb353cdb0

View file

@ -93,6 +93,7 @@ import errno
import os
import re
import shutil
import stat
import subprocess
import tempfile
import zipfile
@ -191,6 +192,9 @@ def ProcessTargetFiles(input_tf_zip, output_tf_zip, misc_info,
# tmpdir will only be used to regenerate the recovery-from-boot patch.
tmpdir = tempfile.mkdtemp()
# We're not setting the permissions precisely as in attr, because that work
# will be handled by mkbootfs (using the values from the canned or the
# compiled-in fs_config).
def write_to_temp(fn, attr, data):
fn = os.path.join(tmpdir, fn)
if fn.endswith("/"):
@ -201,7 +205,7 @@ def ProcessTargetFiles(input_tf_zip, output_tf_zip, misc_info,
if d and not os.path.exists(d):
os.makedirs(d)
if attr >> 16 == 0xa1ff:
if stat.S_ISLNK(attr >> 16):
os.symlink(data, fn)
else:
with open(fn, "wb") as f: