78 lines
3.2 KiB
Python
78 lines
3.2 KiB
Python
# 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)
|