From 8a9852209b286fcf600ea92f15193348388a5d69 Mon Sep 17 00:00:00 2001 From: Hans-Christoph Steiner Date: Mon, 22 Mar 2021 14:00:16 +0100 Subject: [PATCH] update: do not die when androguard files to extract icon https://jenkins.debian.net/job/reproducible_fdroid_test/422 https://jenkins.debian.net/job/reproducible_fdroid_test/423 ``` Traceback (most recent call last): File "../fdroid", line 22, in fdroidserver.__main__.main() File "/var/lib/jenkins/userContent/reproducible/reproducible_fdroid_build_apps/fdroidserver/__main__.py", line 227, in main raise e File "/var/lib/jenkins/userContent/reproducible/reproducible_fdroid_build_apps/fdroidserver/__main__.py", line 208, in main mod.main() File "/var/lib/jenkins/userContent/reproducible/reproducible_fdroid_build_apps/fdroidserver/update.py", line 2316, in main apks, cachechanged = process_apks(apkcache, repodirs[0], knownapks, options.use_date_from_apk) File "/var/lib/jenkins/userContent/reproducible/reproducible_fdroid_build_apps/fdroidserver/update.py", line 1746, in process_apks use_date_from_apk, ada, True) File "/var/lib/jenkins/userContent/reproducible/reproducible_fdroid_build_apps/fdroidserver/update.py", line 1619, in process_apk apk = scan_apk(apkfile) File "/var/lib/jenkins/userContent/reproducible/reproducible_fdroid_build_apps/fdroidserver/update.py", line 1385, in scan_apk scan_apk_androguard(apk, apk_file) File "/var/lib/jenkins/userContent/reproducible/reproducible_fdroid_build_apps/fdroidserver/update.py", line 1527, in scan_apk_androguard resource_id = arsc.get_id(apk['packageName'], icon_id) File "/usr/lib/python3/dist-packages/androguard/core/bytecodes/axml/__init__.py", line 1668, in get_id self._analyse() File "/usr/lib/python3/dist-packages/androguard/core/bytecodes/axml/__init__.py", line 1321, in _analyse ate = self.packages[package_name][nb + 3 + nb_i] IndexError: list index out of range ``` --- fdroidserver/update.py | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/fdroidserver/update.py b/fdroidserver/update.py index 988c65a2..f34e8b0f 100644 --- a/fdroidserver/update.py +++ b/fdroidserver/update.py @@ -1395,17 +1395,17 @@ def scan_apk(apk_file): logging.debug('Getting signature of {0}'.format(os.path.basename(apk_file))) apk['sig'] = getsig(apk_file) if not apk['sig']: - raise BuildException("Failed to get apk signature") + raise BuildException(_("Failed to get APK signing key fingerprint")) apk['signer'] = common.apk_signer_fingerprint(os.path.join(os.getcwd(), apk_file)) if not apk.get('signer'): - raise BuildException("Failed to get apk signing key fingerprint") + raise BuildException(_("Failed to get APK signing key fingerprint")) # Get size of the APK apk['size'] = os.path.getsize(apk_file) if 'minSdkVersion' not in apk: - logging.warning("No SDK version information found in {0}".format(apk_file)) + logging.warning(_("No minimum SDK version found in {0}, using default (3).").format(apk_file)) apk['minSdkVersion'] = 3 # aapt defaults to 3 as the min # Check for known vulnerabilities @@ -1524,13 +1524,16 @@ def scan_apk_androguard(apk, apkfile): icon_id_str = apkobject.get_element("application", "icon") if icon_id_str: icon_id = int(icon_id_str.replace("@", "0x"), 16) - resource_id = arsc.get_id(apk['packageName'], icon_id) - if resource_id: - icon_name = arsc.get_id(apk['packageName'], icon_id)[1] - else: - # don't use 'anydpi' aka 0xFFFE aka 65534 since it is XML - icon_name = os.path.splitext(os.path.basename(apkobject.get_app_icon(max_dpi=65534 - 1)))[0] - apk['icons_src'] = _get_apk_icons_src(apkfile, icon_name) + try: + resource_id = arsc.get_id(apk['packageName'], icon_id) + if resource_id: + icon_name = arsc.get_id(apk['packageName'], icon_id)[1] + else: + # don't use 'anydpi' aka 0xFFFE aka 65534 since it is XML + icon_name = os.path.splitext(os.path.basename(apkobject.get_app_icon(max_dpi=65534 - 1)))[0] + apk['icons_src'] = _get_apk_icons_src(apkfile, icon_name) + except Exception as e: + logging.error("Cannot fetch icon from %s: %s" % (apkfile, str(e))) arch_re = re.compile("^lib/(.*)/.*$") arch = set([arch_re.match(file).group(1) for file in apkobject.get_files() if arch_re.match(file)])