| # Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| import logging |
| import os |
| |
| from autotest_lib.client.bin import test, utils |
| from autotest_lib.client.common_lib import error |
| from autotest_lib.client.common_lib.cros import chrome |
| from autotest_lib.client.cros import cros_logging |
| |
| |
| class logging_AsanCrash(test.test): |
| """Verify Address Sanitizer does catch memory errors.""" |
| |
| version = 1 |
| |
| |
| def run_once(self): |
| if not 'asan' in utils.read_file('/etc/ui_use_flags.txt'): |
| raise error.TestFail('Current image not built with ASAN') |
| |
| extension_path = os.path.join(os.path.dirname(__file__), |
| 'asan_crash_ext') |
| |
| with chrome.Chrome(extension_paths=[extension_path]) as cr: |
| pid = utils.get_oldest_pid_by_name('chrome') |
| asan_log_name = '/var/log/chrome/asan_log.%d' % pid |
| logging.info('Browser PID under telemetry control is %d. ' |
| 'So ASAN log is expected at %s.', pid, asan_log_name) |
| |
| logging.info('Initiate simulating memory bug to be caught by ASAN.') |
| extension = cr.get_extension(extension_path) |
| if not extension: |
| raise error.TestFail('Failed to find extension %s' |
| % extension_path) |
| |
| # Catch the exception raised when the browser crashes. |
| cr.did_browser_crash(lambda: extension.ExecuteJavaScript( |
| 'chrome.autotestPrivate.simulateAsanMemoryBug();')) |
| |
| utils.poll_for_condition( |
| lambda: os.path.isfile(asan_log_name), |
| timeout=10, |
| exception=error.TestFail( |
| 'Found no asan log file %s during 10s' |
| % asan_log_name)) |
| ui_log = cros_logging.LogReader(asan_log_name) |
| ui_log.read_all_logs() |
| |
| # We must wait some time until memory bug is simulated (happens |
| # immediately after the return on the call) and caught by ASAN. |
| try: |
| utils.poll_for_condition( |
| lambda: ui_log.can_find('ERROR: AddressSanitizer'), |
| timeout=10, |
| exception=error.TestFail( |
| 'Found no asan log message about ' |
| 'Address Sanitizer catch')) |
| # An example error string is like this |
| # 'testarray:228' <== Memory access at offset 52 overflows |
| # this variable |
| utils.poll_for_condition( |
| lambda: ui_log.can_find("'testarray"), |
| timeout=10, |
| exception=error.TestFail( |
| 'ASAN caught bug but did not mention ' |
| 'the cause in the log')) |
| |
| except: |
| logging.debug('ASAN log content: ' + ui_log.get_logs()) |
| raise |
| |
| # The cbuildbot logic will look for asan logs and process them. |
| # Remove the simulated log file to avoid that. |
| os.remove(asan_log_name) |