blob: a67fb3ec74018dc1336fcb9afc4be1f92b60baeb [file] [log] [blame]
# -*- python -*-
# Copyright (c) 2013 The Native Client 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('env')
if 'TRUSTED_ENV' not in env:
Return()
nexe_command_line = []
if env.Bit('host_mac'):
nexe_command_line += ['-m']
if env.Bit('tests_use_irt'):
nexe_command_line += ['-i']
if not env.SetNonStableBitcodeIfAllowed():
Return()
if env.Bit('bitcode'):
# mmap_prot_exec.c has an external reference to "etext", a symbol
# defined by the native linker, which is disallowed by PNaCl's ABI.
env.Append(LINKFLAGS=['--pnacl-disable-abi-check'])
nexe = env.ComponentProgram('mmap_prot_exec',
'mmap_prot_exec.c',
EXTRA_LIBS=['platform',
'${NONIRT_LIBS}',
'${PTHREAD_LIBS}'])
# Fault injection is used to bypass safety checks, since this test as
# untrusted code cannot actually obtain "blessed" descriptors that are
# marked safe-for-mmap. The encoded fault-injection control string
# says that the failure control at the call-site marked with
# "MMAP_BYPASS_DESCRIPTOR_SAFETY_CHECK" is global (not per-thread),
# and that the first time the program (rather than thread) encounter
# the call-site it should "pass", e.g., let the normal code run;
# subsequently, however, it will "fail" 100 times, with the error
# value specified at the NACL_FI macro, without actually invoking the
# wrapped function, which is the NaClDescIsSafeForMmap predicate.
#
# See native_client/src/trusted/fault_injection/fault_injection.h for
# details of how fault injection works.
node = env.CommandSelLdrTestNacl(
'mmap_prot_exec.out',
nexe,
nexe_command_line + ['-t', env.MakeTempDir(prefix='tmp_mmap_prot')],
sel_ldr_flags=['-a'],
osenv=['NACL_FAULT_INJECTION=' +
'MMAP_BYPASS_DESCRIPTOR_SAFETY_CHECK=GPF/100:' +
'MMAP_FORCE_MMAP_VALIDATION_FAIL=GF:' +
'MMAP_STUBOUT_EMULATION=GF'])
# This test is marked broken for glibc since there is no coordination
# between the addresses at which the test will try to mmap in code and
# where runnable-ld.so or dlopen may have already map in shared
# library code. The test could, in principle, just try a variety of
# locations in user-level code, but the test failures will be
# unpredictable, making the use of deterministic fault injection
# impossible.
env.AddNodeToTestSuite(node, ['small_tests'], 'run_mmap_prot_exec_test',
is_broken=env.Bit('nacl_glibc'))
disabled_syscall_node = env.CommandSelLdrTestNacl(
'mmap_prot_exec_disabled.out',
nexe,
nexe_command_line + ['-t', env.MakeTempDir(prefix='tmp_mmap_prot'), '-d'],
sel_ldr_flags=['-a'],
osenv=['NACL_FAULT_INJECTION=' +
'MMAP_BYPASS_DESCRIPTOR_SAFETY_CHECK=GP1F/100:' +
'MMAP_FORCE_MMAP_VALIDATION_FAIL=GF:' +
'MMAP_STUBOUT_EMULATION=GF',
'NACL_DISABLE_DYNCODE_SYSCALLS=1'])
env.AddNodeToTestSuite(disabled_syscall_node, ['small_tests'],
'run_mmap_prot_exec_disabled_test',
is_broken=env.Bit('nacl_glibc'))
if (env.Bit('tests_use_irt') and env.Bit('nacl_static_link') and
not env.Bit('bitcode')):
nexe = env.ComponentProgram('mmap_code_data_alloc_test',
'mmap_code_data_alloc_test.c')
asm_env = env.Clone()
if env.Bit('bitcode'):
asm_env.PNaClForceNative()
asm_env.AddBiasForPNaCl()
objfile = asm_env.ComponentObject('exec_data', 'exec_data.S')
datafile = asm_env.Command(
'exec_data', objfile,
'${OBJCOPY} -j .text -O binary ${SOURCES} ${TARGET}')
node = env.CommandSelLdrTestNacl('mmap_code_data_alloc_test.out',
nexe, [datafile],
sel_ldr_flags=['-a'])
env.AddNodeToTestSuite(node, ['small_tests'],
'run_mmap_code_data_alloc_test')