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