1f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#!/bin/bash 2f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#===- lib/asan/scripts/asan_device_setup -----------------------------------===# 3f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot# 4f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot# The LLVM Compiler Infrastructure 5f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot# 6f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot# This file is distributed under the University of Illinois Open Source 7f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot# License. See LICENSE.TXT for details. 8f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot# 9f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot# Prepare Android device to run ASan applications. 10f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot# 11f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#===------------------------------------------------------------------------===# 12f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 13f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotset -e 14f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 15f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotHERE="$(cd "$(dirname "$0")" && pwd)" 16f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 17f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotrevert=no 18f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotextra_options= 19f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotdevice= 20f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotlib= 21f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotuse_su=0 22f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 23f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotfunction usage { 24f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo "usage: $0 [--revert] [--device device-id] [--lib path] [--extra-options options]" 25f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo " --revert: Uninstall ASan from the device." 26f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo " --lib: Path to ASan runtime library." 27f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo " --extra-options: Extra ASAN_OPTIONS." 28f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo " --device: Install to the given device. Use 'adb devices' to find" 29f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo " device-id." 30f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo " --use-su: Use 'su -c' prefix for every adb command instead of using" 31f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo " 'adb root' once." 32f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo 33f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot exit 1 34f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} 35f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 36f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotfunction adb_push { 37f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if [ $use_su -eq 0 ]; then 38f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot $ADB push "$1" "$2" 39f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot else 40f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot local FILENAME=$(basename $1) 41f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot $ADB push "$1" "/data/local/tmp/$FILENAME" 42f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot $ADB shell su -c "rm \\\"$2/$FILENAME\\\"" >&/dev/null 43f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot $ADB shell su -c "cat \\\"/data/local/tmp/$FILENAME\\\" > \\\"$2/$FILENAME\\\"" 44f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot $ADB shell su -c "rm \\\"/data/local/tmp/$FILENAME\\\"" 45f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot fi 46f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} 47f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 48f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotfunction adb_remount { 49f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if [ $use_su -eq 0 ]; then 50f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot $ADB remount 51f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot else 52f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot local STORAGE=`$ADB shell mount | grep /system | cut -d ' ' -f1` 53f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if [ "$STORAGE" != "" ]; then 54f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo Remounting $STORAGE at /system 55f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot $ADB shell su -c "mount -o remount,rw $STORAGE /system" 56f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot else 57f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo Failed to get storage device name for "/system" mount point 58f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot fi 59f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot fi 60f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} 61f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 62f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotfunction adb_shell { 63f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if [ $use_su -eq 0 ]; then 64f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot $ADB shell $@ 65f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot else 66f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot $ADB shell su -c "$*" 67f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot fi 68f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} 69f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 70f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotfunction adb_root { 71f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if [ $use_su -eq 0 ]; then 72f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot $ADB root 73f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot fi 74f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} 75f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 76f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotfunction adb_wait_for_device { 77f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot $ADB wait-for-device 78f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} 79f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 80f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotfunction adb_pull { 81f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if [ $use_su -eq 0 ]; then 82f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot $ADB pull "$1" "$2" 83f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot else 84f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot local FILENAME=$(basename $1) 85f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot $ADB shell rm "/data/local/tmp/$FILENAME" >&/dev/null 86f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot $ADB shell su -c "[ -f \\\"$1\\\" ] && cat \\\"$1\\\" > \\\"/data/local/tmp/$FILENAME\\\" && chown root.shell \\\"/data/local/tmp/$FILENAME\\\" && chmod 755 \\\"/data/local/tmp/$FILENAME\\\"" && 87f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot $ADB pull "/data/local/tmp/$FILENAME" "$2" >&/dev/null && $ADB shell "rm \"/data/local/tmp/$FILENAME\"" 88f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot fi 89f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} 90f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 91f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotfunction get_device_arch { # OUT OUT64 92f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot local _outvar=$1 93f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot local _outvar64=$2 94f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot local _ABI=$(adb_shell getprop ro.product.cpu.abi) 95f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot local _ARCH= 96f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot local _ARCH64= 97f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if [[ $_ABI == x86* ]]; then 98f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot _ARCH=i686 99f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot elif [[ $_ABI == armeabi* ]]; then 100f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot _ARCH=arm 101f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot elif [[ $_ABI == arm64-v8a* ]]; then 102f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot _ARCH=arm 103f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot _ARCH64=aarch64 104f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot else 105f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo "Unrecognized device ABI: $_ABI" 106f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot exit 1 107f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot fi 108f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot eval $_outvar=\$_ARCH 109f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot eval $_outvar64=\$_ARCH64 110f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} 111f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 112f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotwhile [[ $# > 0 ]]; do 113f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot case $1 in 114f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot --revert) 115f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot revert=yes 116f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ;; 117f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot --extra-options) 118f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot shift 119f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if [[ $# == 0 ]]; then 120f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo "--extra-options requires an argument." 121f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot exit 1 122f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot fi 123f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot extra_options="$1" 124f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ;; 125f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot --lib) 126f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot shift 127f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if [[ $# == 0 ]]; then 128f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo "--lib requires an argument." 129f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot exit 1 130f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot fi 131f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot lib="$1" 132f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ;; 133f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot --device) 134f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot shift 135f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if [[ $# == 0 ]]; then 136f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo "--device requires an argument." 137f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot exit 1 138f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot fi 139f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot device="$1" 140f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ;; 141f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot --use-su) 142f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot use_su=1 143f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ;; 144f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot *) 145f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot usage 146f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ;; 147f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot esac 148f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot shift 149f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotdone 150f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 151f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotADB=${ADB:-adb} 152f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotif [[ x$device != x ]]; then 153f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ADB="$ADB -s $device" 154f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotfi 155f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 156f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotif [ $use_su -eq 1 ]; then 157f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot # Test if 'su' is present on the device 158f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot SU_TEST_OUT=`$ADB shell su -c "echo foo" 2>&1 | sed 's/\r$//'` 159f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if [ $? != 0 -o "$SU_TEST_OUT" != "foo" ]; then 160f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo "ERROR: Cannot use 'su -c':" 161f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo "$ adb shell su -c \"echo foo\"" 162f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo $SU_TEST_OUT 163f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo "Check that 'su' binary is correctly installed on the device or omit" 164f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo " --use-su flag" 165f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot exit 1 166f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot fi 167f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotfi 168f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 169f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotecho '>> Remounting /system rw' 170f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotadb_wait_for_device 171f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotadb_root 172f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotadb_wait_for_device 173f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotadb_remount 174f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotadb_wait_for_device 175f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 176f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotget_device_arch ARCH ARCH64 177f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotecho "Target architecture: $ARCH" 178f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotASAN_RT="libclang_rt.asan-$ARCH-android.so" 179f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotif [[ -n $ARCH64 ]]; then 180f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo "Target architecture: $ARCH64" 181f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ASAN_RT64="libclang_rt.asan-$ARCH64-android.so" 182f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotfi 183f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 184f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotif [[ x$revert == xyes ]]; then 185f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo '>> Uninstalling ASan' 186f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 187f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if ! adb_shell ls -l /system/bin/app_process | grep -o '\->.*app_process' >&/dev/null; then 188f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo '>> Pre-L device detected.' 189f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_shell mv /system/bin/app_process.real /system/bin/app_process 190f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_shell rm /system/bin/asanwrapper 191f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot elif ! adb_shell ls -l /system/bin/app_process64.real | grep -o 'No such file or directory' >&/dev/null; then 192f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot # 64-bit installation. 193f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_shell mv /system/bin/app_process32.real /system/bin/app_process32 194f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_shell mv /system/bin/app_process64.real /system/bin/app_process64 195f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_shell rm /system/bin/asanwrapper 196f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_shell rm /system/bin/asanwrapper64 197f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot else 198f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot # 32-bit installation. 199f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_shell rm /system/bin/app_process.wrap 200f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_shell rm /system/bin/asanwrapper 201f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_shell rm /system/bin/app_process 202f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_shell ln -s /system/bin/app_process32 /system/bin/app_process 203f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot fi 204f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 205f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo '>> Restarting shell' 206f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_shell stop 207f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_shell start 208f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 209f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot # Remove the library on the last step to give a chance to the 'su' binary to 210f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot # be executed without problem. 211f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_shell rm /system/lib/$ASAN_RT 212f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 213f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo '>> Done' 214f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot exit 0 215f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotfi 216f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 217f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotif [[ -d "$lib" ]]; then 218f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ASAN_RT_PATH="$lib" 219f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotelif [[ -f "$lib" && "$lib" == *"$ASAN_RT" ]]; then 220f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ASAN_RT_PATH=$(dirname "$lib") 221f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotelif [[ -f "$HERE/$ASAN_RT" ]]; then 222f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ASAN_RT_PATH="$HERE" 223f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotelif [[ $(basename "$HERE") == "bin" ]]; then 224f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot # We could be in the toolchain's base directory. 225f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot # Consider ../lib, ../lib/asan, ../lib/linux, 226f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot # ../lib/clang/$VERSION/lib/linux, and ../lib64/clang/$VERSION/lib/linux. 227f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot P=$(ls "$HERE"/../lib/"$ASAN_RT" \ 228f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot "$HERE"/../lib/asan/"$ASAN_RT" \ 229f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot "$HERE"/../lib/linux/"$ASAN_RT" \ 230f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot "$HERE"/../lib/clang/*/lib/linux/"$ASAN_RT" \ 231f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot "$HERE"/../lib64/clang/*/lib/linux/"$ASAN_RT" 2>/dev/null | sort | tail -1) 232f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if [[ -n "$P" ]]; then 233f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ASAN_RT_PATH="$(dirname "$P")" 234f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot fi 235f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotfi 236f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 237f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotif [[ -z "$ASAN_RT_PATH" || ! -f "$ASAN_RT_PATH/$ASAN_RT" ]]; then 238f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo ">> ASan runtime library not found" 239f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot exit 1 240f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotfi 241f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 242f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotif [[ -n "$ASAN_RT64" ]]; then 243f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if [[ -z "$ASAN_RT_PATH" || ! -f "$ASAN_RT_PATH/$ASAN_RT64" ]]; then 244f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo ">> ASan runtime library not found" 245f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot exit 1 246f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot fi 247f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotfi 248f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 249f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotTMPDIRBASE=$(mktemp -d) 250f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotTMPDIROLD="$TMPDIRBASE/old" 251f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotTMPDIR="$TMPDIRBASE/new" 252f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotmkdir "$TMPDIROLD" 253f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 254f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotRELEASE=$(adb_shell getprop ro.build.version.release) 255f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotPRE_L=0 256f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotif echo "$RELEASE" | grep '^4\.' >&/dev/null; then 257f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot PRE_L=1 258f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotfi 259f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 260f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotif ! adb_shell ls -l /system/bin/app_process | grep -o '\->.*app_process' >&/dev/null; then 261f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 262f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if adb_pull /system/bin/app_process.real /dev/null >&/dev/null; then 263f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo '>> Old-style ASan installation detected. Reverting.' 264f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_shell mv /system/bin/app_process.real /system/bin/app_process 265f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot fi 266f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 267f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo '>> Pre-L device detected. Setting up app_process symlink.' 268f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_shell mv /system/bin/app_process /system/bin/app_process32 269f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_shell ln -s /system/bin/app_process32 /system/bin/app_process 270f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotfi 271f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 272f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotecho '>> Copying files from the device' 273f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotif [[ -n "$ASAN_RT64" ]]; then 274f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_pull /system/lib/"$ASAN_RT" "$TMPDIROLD" || true 275f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_pull /system/lib64/"$ASAN_RT64" "$TMPDIROLD" || true 276f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_pull /system/bin/app_process32 "$TMPDIROLD" || true 277f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_pull /system/bin/app_process32.real "$TMPDIROLD" || true 278f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_pull /system/bin/app_process64 "$TMPDIROLD" || true 279f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_pull /system/bin/app_process64.real "$TMPDIROLD" || true 280f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_pull /system/bin/asanwrapper "$TMPDIROLD" || true 281f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_pull /system/bin/asanwrapper64 "$TMPDIROLD" || true 282f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotelse 283f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_pull /system/lib/"$ASAN_RT" "$TMPDIROLD" || true 284f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_pull /system/bin/app_process32 "$TMPDIROLD" || true 285f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_pull /system/bin/app_process.wrap "$TMPDIROLD" || true 286f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_pull /system/bin/asanwrapper "$TMPDIROLD" || true 287f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotfi 288f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotcp -r "$TMPDIROLD" "$TMPDIR" 289f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 290f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotif [[ -f "$TMPDIR/app_process.wrap" || -f "$TMPDIR/app_process64.real" ]]; then 291f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo ">> Previous installation detected" 292f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotelse 293f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo ">> New installation" 294f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotfi 295f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 296f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotecho '>> Generating wrappers' 297f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 298f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotcp "$ASAN_RT_PATH/$ASAN_RT" "$TMPDIR/" 299f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotif [[ -n "$ASAN_RT64" ]]; then 300f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot cp "$ASAN_RT_PATH/$ASAN_RT64" "$TMPDIR/" 301f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotfi 302f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 303f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotASAN_OPTIONS=start_deactivated=1,malloc_context_size=0 304f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 305f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotfunction generate_zygote_wrapper { # from, to, asan_rt 306f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot local _from=$1 307f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot local _to=$2 308f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot local _asan_rt=$3 309f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if [[ PRE_L -eq 0 ]]; then 310f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot # LD_PRELOAD parsing is broken in N if it starts with ":". Luckily, it is 311f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot # unset in the system environment since L. 312f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot local _ld_preload=$_asan_rt 313f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot else 314f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot local _ld_preload=\$LD_PRELOAD:$_asan_rt 315f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot fi 316f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot cat <<EOF >"$TMPDIR/$_from" 317f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#!/system/bin/sh-from-zygote 318f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotASAN_OPTIONS=$ASAN_OPTIONS \\ 319f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotASAN_ACTIVATION_OPTIONS=include_if_exists=/data/local/tmp/asan.options.%b \\ 320f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotLD_PRELOAD=$_ld_preload \\ 321f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotexec $_to \$@ 322f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 323f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotEOF 324f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} 325f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 326f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot# On Android-L not allowing user segv handler breaks some applications. 327f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotif [[ PRE_L -eq 0 ]]; then 328f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ASAN_OPTIONS="$ASAN_OPTIONS,allow_user_segv_handler=1" 329f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotfi 330f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 331f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotif [[ x$extra_options != x ]] ; then 332f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ASAN_OPTIONS="$ASAN_OPTIONS,$extra_options" 333f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotfi 334f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 335f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot# Zygote wrapper. 336f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotif [[ -f "$TMPDIR/app_process64" ]]; then 337f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot # A 64-bit device. 338f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if [[ ! -f "$TMPDIR/app_process64.real" ]]; then 339f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot # New installation. 340f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot mv "$TMPDIR/app_process32" "$TMPDIR/app_process32.real" 341f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot mv "$TMPDIR/app_process64" "$TMPDIR/app_process64.real" 342f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot fi 343f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot generate_zygote_wrapper "app_process32" "/system/bin/app_process32.real" "$ASAN_RT" 344f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot generate_zygote_wrapper "app_process64" "/system/bin/app_process64.real" "$ASAN_RT64" 345f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotelse 346f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot # A 32-bit device. 347f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot generate_zygote_wrapper "app_process.wrap" "/system/bin/app_process32" "$ASAN_RT" 348f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotfi 349f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 350f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot# General command-line tool wrapper (use for anything that's not started as 351f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot# zygote). 352f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotcat <<EOF >"$TMPDIR/asanwrapper" 353f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#!/system/bin/sh 354f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotLD_PRELOAD=$ASAN_RT \\ 355f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotexec \$@ 356f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 357f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotEOF 358f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 359f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotif [[ -n "$ASAN_RT64" ]]; then 360f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot cat <<EOF >"$TMPDIR/asanwrapper64" 361f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot#!/system/bin/sh 362f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotLD_PRELOAD=$ASAN_RT64 \\ 363f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotexec \$@ 364f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 365f3014761c955345d6e05491608e73228d014afbandroid-build-team RobotEOF 366f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotfi 367f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 368f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotfunction install { # from, to, chmod, chcon 369f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot local _from=$1 370f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot local _to=$2 371f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot local _mode=$3 372f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot local _context=$4 373f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot local _basename="$(basename "$_from")" 374f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo "Installing $_to/$_basename $_mode $_context" 375f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_push "$_from" "$_to/$_basename" 376f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_shell chown root.shell "$_to/$_basename" 377f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if [[ -n "$_mode" ]]; then 378f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_shell chmod "$_mode" "$_to/$_basename" 379f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot fi 380f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if [[ -n "$_context" ]]; then 381f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_shell chcon "$_context" "$_to/$_basename" 382f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot fi 383f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot} 384f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 385f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotif ! ( cd "$TMPDIRBASE" && diff -qr old/ new/ ) ; then 386f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot # Make SELinux happy by keeping app_process wrapper and the shell 387f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot # it runs on in zygote domain. 388f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ENFORCING=0 389f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if adb_shell getenforce | grep Enforcing >/dev/null; then 390f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot # Sometimes shell is not allowed to change file contexts. 391f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot # Temporarily switch to permissive. 392f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot ENFORCING=1 393f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_shell setenforce 0 394f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot fi 395f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 396f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if [[ PRE_L -eq 1 ]]; then 397f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot CTX=u:object_r:system_file:s0 398f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot else 399f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot CTX=u:object_r:zygote_exec:s0 400f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot fi 401f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 402f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo '>> Pushing files to the device' 403f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 404f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if [[ -n "$ASAN_RT64" ]]; then 405f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot install "$TMPDIR/$ASAN_RT" /system/lib 644 406f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot install "$TMPDIR/$ASAN_RT64" /system/lib64 644 407f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot install "$TMPDIR/app_process32" /system/bin 755 $CTX 408f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot install "$TMPDIR/app_process32.real" /system/bin 755 $CTX 409f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot install "$TMPDIR/app_process64" /system/bin 755 $CTX 410f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot install "$TMPDIR/app_process64.real" /system/bin 755 $CTX 411f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot install "$TMPDIR/asanwrapper" /system/bin 755 412f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot install "$TMPDIR/asanwrapper64" /system/bin 755 413f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot else 414f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot install "$TMPDIR/$ASAN_RT" /system/lib 644 415f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot install "$TMPDIR/app_process32" /system/bin 755 $CTX 416f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot install "$TMPDIR/app_process.wrap" /system/bin 755 $CTX 417f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot install "$TMPDIR/asanwrapper" /system/bin 755 $CTX 418f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 419f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_shell rm /system/bin/app_process 420f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_shell ln -s /system/bin/app_process.wrap /system/bin/app_process 421f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot fi 422f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 423f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_shell cp /system/bin/sh /system/bin/sh-from-zygote 424f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_shell chcon $CTX /system/bin/sh-from-zygote 425f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 426f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot if [ $ENFORCING == 1 ]; then 427f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_shell setenforce 1 428f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot fi 429f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 430f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo '>> Restarting shell (asynchronous)' 431f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_shell stop 432f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot adb_shell start 433f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 434f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo '>> Please wait until the device restarts' 435f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotelse 436f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot echo '>> Device is up to date' 437f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotfi 438f3014761c955345d6e05491608e73228d014afbandroid-build-team Robot 439f3014761c955345d6e05491608e73228d014afbandroid-build-team Robotrm -r "$TMPDIRBASE" 440