16d1862363c88c183b0ed7740fca876342cf0474bStephen Hines#!/bin/bash
22d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#===- lib/asan/scripts/asan_device_setup -----------------------------------===#
32d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#
42d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#                     The LLVM Compiler Infrastructure
52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#
62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# This file is distributed under the University of Illinois Open Source
72d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# License. See LICENSE.TXT for details.
82d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#
92d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# Prepare Android device to run ASan applications.
102d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#
112d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#===------------------------------------------------------------------------===#
122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
136d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesset -e
142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesHERE="$(cd "$(dirname "$0")" && pwd)"
162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesrevert=no
182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesextra_options=
192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesdevice=
202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hineslib=
2186277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesuse_su=0
222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesfunction usage {
242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    echo "usage: $0 [--revert] [--device device-id] [--lib path] [--extra-options options]"
252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    echo "  --revert: Uninstall ASan from the device."
262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    echo "  --lib: Path to ASan runtime library."
272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    echo "  --extra-options: Extra ASAN_OPTIONS."
282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    echo "  --device: Install to the given device. Use 'adb devices' to find"
292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    echo "            device-id."
3086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    echo "  --use-su: Use 'su -c' prefix for every adb command instead of using"
3186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    echo "            'adb root' once."
322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    echo
332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    exit 1
342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines}
352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
3686277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesfunction adb_push {
3786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  if [ $use_su -eq 0 ]; then
3886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    $ADB push "$1" "$2"
3986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  else
4086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    local FILENAME=$(basename $1)
4186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    $ADB push "$1" "/data/local/tmp/$FILENAME"
4286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    $ADB shell su -c "rm \\\"$2/$FILENAME\\\"" >&/dev/null
4386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    $ADB shell su -c "cat \\\"/data/local/tmp/$FILENAME\\\" > \\\"$2/$FILENAME\\\""
4486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    $ADB shell su -c "rm \\\"/data/local/tmp/$FILENAME\\\""
4586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  fi
4686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines}
4786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
4886277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesfunction adb_remount {
4986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  if [ $use_su -eq 0 ]; then
5086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    $ADB remount
5186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  else
5286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    local STORAGE=`$ADB shell mount | grep /system | cut -d ' ' -f1`
5386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    if [ "$STORAGE" != "" ]; then
5486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines      echo Remounting $STORAGE at /system
5586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines      $ADB shell su -c "mount -o remount,rw $STORAGE /system"
5686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    else
5786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines      echo Failed to get storage device name for "/system" mount point
5886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    fi
5986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  fi
6086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines}
6186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
6286277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesfunction adb_shell {
6386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  if [ $use_su -eq 0 ]; then
6486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    $ADB shell $@
6586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  else
6686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    $ADB shell su -c "$*"
6786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  fi
6886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines}
6986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
7086277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesfunction adb_root {
7186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  if [ $use_su -eq 0 ]; then
7286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    $ADB root
7386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  fi
7486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines}
7586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
7686277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesfunction adb_wait_for_device {
7786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  $ADB wait-for-device
7886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines}
7986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
8086277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesfunction adb_pull {
8186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  if [ $use_su -eq 0 ]; then
8286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    $ADB pull "$1" "$2"
8386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  else
8486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    local FILENAME=$(basename $1)
8586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    $ADB shell rm "/data/local/tmp/$FILENAME" >&/dev/null
8686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    $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\\\"" &&
8786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    $ADB pull "/data/local/tmp/$FILENAME" "$2" >&/dev/null && $ADB shell "rm \"/data/local/tmp/$FILENAME\""
8886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  fi
8986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines}
9086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
91799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarfunction get_device_arch { # OUT OUT64
926d1862363c88c183b0ed7740fca876342cf0474bStephen Hines    local _outvar=$1
93799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    local _outvar64=$2
9486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    local _ABI=$(adb_shell getprop ro.product.cpu.abi)
956d1862363c88c183b0ed7740fca876342cf0474bStephen Hines    local _ARCH=
96799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    local _ARCH64=
976d1862363c88c183b0ed7740fca876342cf0474bStephen Hines    if [[ $_ABI == x86* ]]; then
986d1862363c88c183b0ed7740fca876342cf0474bStephen Hines        _ARCH=i686
996d1862363c88c183b0ed7740fca876342cf0474bStephen Hines    elif [[ $_ABI == armeabi* ]]; then
1006d1862363c88c183b0ed7740fca876342cf0474bStephen Hines        _ARCH=arm
101799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    elif [[ $_ABI == arm64-v8a* ]]; then
102799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar        _ARCH=arm
103799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar        _ARCH64=aarch64
1046d1862363c88c183b0ed7740fca876342cf0474bStephen Hines    else
1056d1862363c88c183b0ed7740fca876342cf0474bStephen Hines        echo "Unrecognized device ABI: $_ABI"
1066d1862363c88c183b0ed7740fca876342cf0474bStephen Hines        exit 1
1076d1862363c88c183b0ed7740fca876342cf0474bStephen Hines    fi
1086d1862363c88c183b0ed7740fca876342cf0474bStephen Hines    eval $_outvar=\$_ARCH
109799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    eval $_outvar64=\$_ARCH64
1106d1862363c88c183b0ed7740fca876342cf0474bStephen Hines}
1116d1862363c88c183b0ed7740fca876342cf0474bStephen Hines
1122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hineswhile [[ $# > 0 ]]; do
1132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  case $1 in
1142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    --revert)
1152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      revert=yes
1162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      ;;
1172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    --extra-options)
1182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      shift
1192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      if [[ $# == 0 ]]; then
1202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines        echo "--extra-options requires an argument."
1212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines        exit 1
1222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      fi
1232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      extra_options="$1"
1242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      ;;
1252d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    --lib)
1262d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      shift
1272d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      if [[ $# == 0 ]]; then
1282d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines        echo "--lib requires an argument."
1292d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines        exit 1
1302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      fi
1312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      lib="$1"
1322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      ;;
1332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    --device)
1342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      shift
1352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      if [[ $# == 0 ]]; then
1362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines        echo "--device requires an argument."
1372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines        exit 1
1382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      fi
1392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      device="$1"
1402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      ;;
14186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    --use-su)
14286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines      use_su=1
14386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines      ;;
1442d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    *)
1452d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      usage
1462d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines      ;;
1472d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  esac
1482d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines  shift
1492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesdone
1502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
1512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesADB=${ADB:-adb}
1522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesif [[ x$device != x ]]; then
1532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    ADB="$ADB -s $device"
1542d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesfi
1552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
15686277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesif [ $use_su -eq 1 ]; then
15786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  # Test if 'su' is present on the device
15886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  SU_TEST_OUT=`$ADB shell su -c "echo foo" 2>&1 | sed 's/\r$//'`
15986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  if [ $? != 0 -o "$SU_TEST_OUT" != "foo" ]; then
16086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    echo "ERROR: Cannot use 'su -c':"
16186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    echo "$ adb shell su -c \"echo foo\""
16286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    echo $SU_TEST_OUT
16386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    echo "Check that 'su' binary is correctly installed on the device or omit"
16486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    echo "            --use-su flag"
16586277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    exit 1
16686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines  fi
16786277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesfi
16886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
1696d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesecho '>> Remounting /system rw'
17086277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesadb_wait_for_device
17186277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesadb_root
17286277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesadb_wait_for_device
17386277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesadb_remount
17486277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesadb_wait_for_device
1756d1862363c88c183b0ed7740fca876342cf0474bStephen Hines
176799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarget_device_arch ARCH ARCH64
1776d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesecho "Target architecture: $ARCH"
1786d1862363c88c183b0ed7740fca876342cf0474bStephen HinesASAN_RT="libclang_rt.asan-$ARCH-android.so"
179799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarif [[ -n $ARCH64 ]]; then
180799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  echo "Target architecture: $ARCH64"
181799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  ASAN_RT64="libclang_rt.asan-$ARCH64-android.so"
182799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarfi
1832d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
1842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesif [[ x$revert == xyes ]]; then
1852d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    echo '>> Uninstalling ASan'
1866d1862363c88c183b0ed7740fca876342cf0474bStephen Hines
18786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    if ! adb_shell ls -l /system/bin/app_process | grep -o '\->.*app_process' >&/dev/null; then
188799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar      echo '>> Pre-L device detected.'
189799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar      adb_shell mv /system/bin/app_process.real /system/bin/app_process
190799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar      adb_shell rm /system/bin/asanwrapper
191799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    elif ! adb_shell ls -l /system/bin/app_process64.real | grep -o 'No such file or directory' >&/dev/null; then
192799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar      # 64-bit installation.
193799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar      adb_shell mv /system/bin/app_process32.real /system/bin/app_process32
194799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar      adb_shell mv /system/bin/app_process64.real /system/bin/app_process64
195799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar      adb_shell rm /system/bin/asanwrapper
196799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar      adb_shell rm /system/bin/asanwrapper64
1976d1862363c88c183b0ed7740fca876342cf0474bStephen Hines    else
198799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar      # 32-bit installation.
199799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar      adb_shell rm /system/bin/app_process.wrap
200799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar      adb_shell rm /system/bin/asanwrapper
201799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar      adb_shell rm /system/bin/app_process
202799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar      adb_shell ln -s /system/bin/app_process32 /system/bin/app_process
2036d1862363c88c183b0ed7740fca876342cf0474bStephen Hines    fi
2042d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
2052d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    echo '>> Restarting shell'
20686277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    adb_shell stop
20786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    adb_shell start
20886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines
20986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    # Remove the library on the last step to give a chance to the 'su' binary to
21086277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    # be executed without problem.
21186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    adb_shell rm /system/lib/$ASAN_RT
2122d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
2132d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    echo '>> Done'
2142d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    exit 0
2152d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesfi
2162d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
2172d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesif [[ -d "$lib" ]]; then
2182d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    ASAN_RT_PATH="$lib"
2192d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hineselif [[ -f "$lib" && "$lib" == *"$ASAN_RT" ]]; then
2202d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    ASAN_RT_PATH=$(dirname "$lib")
2212d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hineselif [[ -f "$HERE/$ASAN_RT" ]]; then
2222d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    ASAN_RT_PATH="$HERE"
2232d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hineselif [[ $(basename "$HERE") == "bin" ]]; then
2242d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    # We could be in the toolchain's base directory.
225799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    # Consider ../lib, ../lib/asan, ../lib/linux,
226799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    # ../lib/clang/$VERSION/lib/linux, and ../lib64/clang/$VERSION/lib/linux.
227799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    P=$(ls "$HERE"/../lib/"$ASAN_RT" \
228799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar           "$HERE"/../lib/asan/"$ASAN_RT" \
229799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar           "$HERE"/../lib/linux/"$ASAN_RT" \
230799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar           "$HERE"/../lib/clang/*/lib/linux/"$ASAN_RT" \
231799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar           "$HERE"/../lib64/clang/*/lib/linux/"$ASAN_RT" 2>/dev/null | sort | tail -1)
2322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    if [[ -n "$P" ]]; then
2332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines        ASAN_RT_PATH="$(dirname "$P")"
2342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    fi
2352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesfi
2362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
2372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesif [[ -z "$ASAN_RT_PATH" || ! -f "$ASAN_RT_PATH/$ASAN_RT" ]]; then
2386d1862363c88c183b0ed7740fca876342cf0474bStephen Hines    echo ">> ASan runtime library not found"
2392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    exit 1
2402d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesfi
2412d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
242799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarif [[ -n "$ASAN_RT64" ]]; then
243799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  if [[ -z "$ASAN_RT_PATH" || ! -f "$ASAN_RT_PATH/$ASAN_RT64" ]]; then
244799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    echo ">> ASan runtime library not found"
245799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    exit 1
246799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  fi
247799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarfi
248799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
2492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTMPDIRBASE=$(mktemp -d)
2502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTMPDIROLD="$TMPDIRBASE/old"
2512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesTMPDIR="$TMPDIRBASE/new"
2522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesmkdir "$TMPDIROLD"
2532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
25486277eb844c4983c81de62d7c050e92fe7155788Stephen HinesRELEASE=$(adb_shell getprop ro.build.version.release)
2556d1862363c88c183b0ed7740fca876342cf0474bStephen HinesPRE_L=0
2566d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesif echo "$RELEASE" | grep '^4\.' >&/dev/null; then
2576d1862363c88c183b0ed7740fca876342cf0474bStephen Hines    PRE_L=1
2586d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesfi
2596d1862363c88c183b0ed7740fca876342cf0474bStephen Hines
26086277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesif ! adb_shell ls -l /system/bin/app_process | grep -o '\->.*app_process' >&/dev/null; then
2616d1862363c88c183b0ed7740fca876342cf0474bStephen Hines
26286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    if adb_pull /system/bin/app_process.real /dev/null >&/dev/null; then
2636d1862363c88c183b0ed7740fca876342cf0474bStephen Hines        echo '>> Old-style ASan installation detected. Reverting.'
26486277eb844c4983c81de62d7c050e92fe7155788Stephen Hines        adb_shell mv /system/bin/app_process.real /system/bin/app_process
2656d1862363c88c183b0ed7740fca876342cf0474bStephen Hines    fi
2666d1862363c88c183b0ed7740fca876342cf0474bStephen Hines
2676d1862363c88c183b0ed7740fca876342cf0474bStephen Hines    echo '>> Pre-L device detected. Setting up app_process symlink.'
26886277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    adb_shell mv /system/bin/app_process /system/bin/app_process32
26986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    adb_shell ln -s /system/bin/app_process32 /system/bin/app_process
2706d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesfi
2712d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
2722d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesecho '>> Copying files from the device'
273799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarif [[ -n "$ASAN_RT64" ]]; then
274799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  adb_pull /system/lib/"$ASAN_RT" "$TMPDIROLD" || true
275799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  adb_pull /system/lib64/"$ASAN_RT64" "$TMPDIROLD" || true
276799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  adb_pull /system/bin/app_process32 "$TMPDIROLD" || true
277799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  adb_pull /system/bin/app_process32.real "$TMPDIROLD" || true
278799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  adb_pull /system/bin/app_process64 "$TMPDIROLD" || true
279799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  adb_pull /system/bin/app_process64.real "$TMPDIROLD" || true
280799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  adb_pull /system/bin/asanwrapper "$TMPDIROLD" || true
281799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  adb_pull /system/bin/asanwrapper64 "$TMPDIROLD" || true
282799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarelse
283799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  adb_pull /system/lib/"$ASAN_RT" "$TMPDIROLD" || true
284799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  adb_pull /system/bin/app_process32 "$TMPDIROLD" || true
285799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  adb_pull /system/bin/app_process.wrap "$TMPDIROLD" || true
286799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  adb_pull /system/bin/asanwrapper "$TMPDIROLD" || true
287799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarfi
2882d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinescp -r "$TMPDIROLD" "$TMPDIR"
2892d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
290799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarif [[ -f "$TMPDIR/app_process.wrap" || -f "$TMPDIR/app_process64.real" ]]; then
2916d1862363c88c183b0ed7740fca876342cf0474bStephen Hines    echo ">> Previous installation detected"
2922d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hineselse
2936d1862363c88c183b0ed7740fca876342cf0474bStephen Hines    echo ">> New installation"
2942d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesfi
2952d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
2962d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesecho '>> Generating wrappers'
2972d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
2982d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinescp "$ASAN_RT_PATH/$ASAN_RT" "$TMPDIR/"
299799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarif [[ -n "$ASAN_RT64" ]]; then
300799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  cp "$ASAN_RT_PATH/$ASAN_RT64" "$TMPDIR/"
301799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarfi
3022d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
303c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainarASAN_OPTIONS=start_deactivated=1,malloc_context_size=0
304799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
305799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarfunction generate_zygote_wrapper { # from, to, asan_rt
306799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  local _from=$1
307799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  local _to=$2
308799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  local _asan_rt=$3
309c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  if [[ PRE_L -eq 0 ]]; then
310c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar    # LD_PRELOAD parsing is broken in N if it starts with ":". Luckily, it is
311c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar    # unset in the system environment since L.
312c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar    local _ld_preload=$_asan_rt
313c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  else
314c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar    local _ld_preload=\$LD_PRELOAD:$_asan_rt
315c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar  fi
316799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  cat <<EOF >"$TMPDIR/$_from"
317799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#!/system/bin/sh-from-zygote
318799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarASAN_OPTIONS=$ASAN_OPTIONS \\
319799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarASAN_ACTIVATION_OPTIONS=include_if_exists=/data/local/tmp/asan.options.%b \\
320c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga NainarLD_PRELOAD=$_ld_preload \\
321799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarexec $_to \$@
322799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
323799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarEOF
324799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar}
3256d1862363c88c183b0ed7740fca876342cf0474bStephen Hines
3266d1862363c88c183b0ed7740fca876342cf0474bStephen Hines# On Android-L not allowing user segv handler breaks some applications.
32786277eb844c4983c81de62d7c050e92fe7155788Stephen Hinesif [[ PRE_L -eq 0 ]]; then
3286d1862363c88c183b0ed7740fca876342cf0474bStephen Hines    ASAN_OPTIONS="$ASAN_OPTIONS,allow_user_segv_handler=1"
3296d1862363c88c183b0ed7740fca876342cf0474bStephen Hinesfi
3306d1862363c88c183b0ed7740fca876342cf0474bStephen Hines
3312d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesif [[ x$extra_options != x ]] ; then
3322d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    ASAN_OPTIONS="$ASAN_OPTIONS,$extra_options"
3332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesfi
3342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
3352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# Zygote wrapper.
336799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarif [[ -f "$TMPDIR/app_process64" ]]; then
337799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  # A 64-bit device.
338799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  if [[ ! -f "$TMPDIR/app_process64.real" ]]; then
339799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    # New installation.
340799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    mv "$TMPDIR/app_process32" "$TMPDIR/app_process32.real"
341799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    mv "$TMPDIR/app_process64" "$TMPDIR/app_process64.real"
342799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  fi
343799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  generate_zygote_wrapper "app_process32" "/system/bin/app_process32.real" "$ASAN_RT"
344799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  generate_zygote_wrapper "app_process64" "/system/bin/app_process64.real" "$ASAN_RT64"
345799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarelse
346799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  # A 32-bit device.
347799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  generate_zygote_wrapper "app_process.wrap" "/system/bin/app_process32" "$ASAN_RT"
348799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarfi
3492d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
3502d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# General command-line tool wrapper (use for anything that's not started as
3512d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines# zygote).
3522d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinescat <<EOF >"$TMPDIR/asanwrapper"
3532d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines#!/system/bin/sh
3546d1862363c88c183b0ed7740fca876342cf0474bStephen HinesLD_PRELOAD=$ASAN_RT \\
3552d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesexec \$@
3562d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
3572d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen HinesEOF
3582d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
359799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarif [[ -n "$ASAN_RT64" ]]; then
360799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  cat <<EOF >"$TMPDIR/asanwrapper64"
361799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#!/system/bin/sh
362799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarLD_PRELOAD=$ASAN_RT64 \\
363799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarexec \$@
364799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
365799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga NainarEOF
366799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarfi
367799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
368799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarfunction install { # from, to, chmod, chcon
369799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  local _from=$1
370799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  local _to=$2
371799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  local _mode=$3
372799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  local _context=$4
373799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  local _basename="$(basename "$_from")"
374799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  echo "Installing $_to/$_basename $_mode $_context"
375799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  adb_push "$_from" "$_to/$_basename"
376799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  adb_shell chown root.shell "$_to/$_basename"
377799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  if [[ -n "$_mode" ]]; then
378799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    adb_shell chmod "$_mode" "$_to/$_basename"
379799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  fi
380799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  if [[ -n "$_context" ]]; then
381799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    adb_shell chcon "$_context" "$_to/$_basename"
382799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar  fi
383799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar}
3842d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
385799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainarif ! ( cd "$TMPDIRBASE" && diff -qr old/ new/ ) ; then
3866d1862363c88c183b0ed7740fca876342cf0474bStephen Hines    # Make SELinux happy by keeping app_process wrapper and the shell
3876d1862363c88c183b0ed7740fca876342cf0474bStephen Hines    # it runs on in zygote domain.
3886d1862363c88c183b0ed7740fca876342cf0474bStephen Hines    ENFORCING=0
38986277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    if adb_shell getenforce | grep Enforcing >/dev/null; then
3906d1862363c88c183b0ed7740fca876342cf0474bStephen Hines        # Sometimes shell is not allowed to change file contexts.
3916d1862363c88c183b0ed7740fca876342cf0474bStephen Hines        # Temporarily switch to permissive.
3926d1862363c88c183b0ed7740fca876342cf0474bStephen Hines        ENFORCING=1
39386277eb844c4983c81de62d7c050e92fe7155788Stephen Hines        adb_shell setenforce 0
3946d1862363c88c183b0ed7740fca876342cf0474bStephen Hines    fi
3956d1862363c88c183b0ed7740fca876342cf0474bStephen Hines
3966d1862363c88c183b0ed7740fca876342cf0474bStephen Hines    if [[ PRE_L -eq 1 ]]; then
3976d1862363c88c183b0ed7740fca876342cf0474bStephen Hines        CTX=u:object_r:system_file:s0
3986d1862363c88c183b0ed7740fca876342cf0474bStephen Hines    else
3996d1862363c88c183b0ed7740fca876342cf0474bStephen Hines        CTX=u:object_r:zygote_exec:s0
4006d1862363c88c183b0ed7740fca876342cf0474bStephen Hines    fi
401799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
402799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    echo '>> Pushing files to the device'
403799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
404799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    if [[ -n "$ASAN_RT64" ]]; then
405799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar      install "$TMPDIR/$ASAN_RT" /system/lib 644
406799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar      install "$TMPDIR/$ASAN_RT64" /system/lib64 644
407799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar      install "$TMPDIR/app_process32" /system/bin 755 $CTX
408799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar      install "$TMPDIR/app_process32.real" /system/bin 755 $CTX
409799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar      install "$TMPDIR/app_process64" /system/bin 755 $CTX
410799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar      install "$TMPDIR/app_process64.real" /system/bin 755 $CTX
411799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar      install "$TMPDIR/asanwrapper" /system/bin 755
412799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar      install "$TMPDIR/asanwrapper64" /system/bin 755
413799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    else
414799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar      install "$TMPDIR/$ASAN_RT" /system/lib 644
415799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar      install "$TMPDIR/app_process32" /system/bin 755 $CTX
416799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar      install "$TMPDIR/app_process.wrap" /system/bin 755 $CTX
417799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar      install "$TMPDIR/asanwrapper" /system/bin 755 $CTX
418799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
419799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar      adb_shell rm /system/bin/app_process
420799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar      adb_shell ln -s /system/bin/app_process.wrap /system/bin/app_process
421799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    fi
422799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar
423799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    adb_shell cp /system/bin/sh /system/bin/sh-from-zygote
424799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar    adb_shell chcon $CTX /system/bin/sh-from-zygote
4256d1862363c88c183b0ed7740fca876342cf0474bStephen Hines
4266d1862363c88c183b0ed7740fca876342cf0474bStephen Hines    if [ $ENFORCING == 1 ]; then
42786277eb844c4983c81de62d7c050e92fe7155788Stephen Hines        adb_shell setenforce 1
4286d1862363c88c183b0ed7740fca876342cf0474bStephen Hines    fi
4296d1862363c88c183b0ed7740fca876342cf0474bStephen Hines
4302d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    echo '>> Restarting shell (asynchronous)'
43186277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    adb_shell stop
43286277eb844c4983c81de62d7c050e92fe7155788Stephen Hines    adb_shell start
4332d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
4342d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    echo '>> Please wait until the device restarts'
4352d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hineselse
4362d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines    echo '>> Device is up to date'
4372d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesfi
4382d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines
4392d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hinesrm -r "$TMPDIRBASE"
440