| import os | |
| import shutil | |
| import subprocess | |
| import sys | |
| import lldb | |
| from lldbsuite.test.decorators import * | |
| from lldbsuite.test.lldbtest import * | |
| def has_lldb_codesign(): | |
| """Check if the lldb_codesign certificate is available.""" | |
| try: | |
| if sys.platform != "darwin": | |
| return False | |
| result = subprocess.run( | |
| [ | |
| "security", | |
| "find-certificate", | |
| "-c", | |
| "lldb_codesign", | |
| "/Library/Keychains/System.keychain", | |
| ], | |
| capture_output=True, | |
| ) | |
| return result.returncode == 0 | |
| except FileNotFoundError: | |
| return False | |
| @skipUnlessDarwin | |
| class TestdSYMCodesign(TestBase): | |
| NO_DEBUG_INFO_TESTCASE = True | |
| SHARED_BUILD_TESTCASE = False | |
| def build_dsym_with_script(self): | |
| self.build(debug_info="dsym") | |
| exe = self.getBuildArtifact("a.out") | |
| dsym = self.getBuildArtifact("a.out.dSYM") | |
| python_dir = os.path.join(dsym, "Contents", "Resources", "Python") | |
| os.makedirs(python_dir, exist_ok=True) | |
| shutil.copy( | |
| os.path.join(self.getSourceDir(), "dsym_script.py"), | |
| os.path.join(python_dir, "a.py"), | |
| ) | |
| return exe, dsym | |
| def test_adhoc_signed_dsym(self): | |
| """An ad-hoc signed dSYM should not be loaded because the | |
| signature doesn't chain to a trusted root CA.""" | |
| exe, dsym = self.build_dsym_with_script() | |
| subprocess.check_call(["codesign", "-f", "-s", "-", dsym]) | |
| self.runCmd("settings set target.load-script-from-symbol-file trusted") | |
| self.createTestTarget(file_path=exe) | |
| self.expect( | |
| "script -- print('SENTINEL')", | |
| substrs=["SENTINEL"], | |
| ) | |
| # The script should NOT have been loaded. | |
| self.assertFalse( | |
| hasattr(lldb, "_dsym_codesign_test_loaded"), | |
| "Script should not auto-load from ad-hoc signed dSYM", | |
| ) | |
| @unittest.skipUnless(has_lldb_codesign(), "requires lldb_codesign certificate") | |
| def test_trusted_signed_dsym_auto_loads(self): | |
| """A dSYM signed with the trusted lldb_codesign certificate should | |
| auto-load scripts.""" | |
| exe, dsym = self.build_dsym_with_script() | |
| subprocess.check_call(["codesign", "-f", "-s", "lldb_codesign", dsym]) | |
| self.runCmd("settings set target.load-script-from-symbol-file trusted") | |
| self.createTestTarget(file_path=exe) | |
| # The script sets a marker attribute on the lldb module. | |
| self.assertTrue( | |
| getattr(lldb, "_dsym_codesign_test_loaded", False), | |
| "Script should auto-load from trusted signed dSYM", | |
| ) |