|  | #!/system/bin/sh | 
|  |  | 
|  | # | 
|  | # Copyright (C) 2017 The Android Open Source Project | 
|  | # | 
|  | # Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | # you may not use this file except in compliance with the License. | 
|  | # You may obtain a copy of the License at | 
|  | # | 
|  | #      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | # | 
|  | # Unless required by applicable law or agreed to in writing, software | 
|  | # distributed under the License is distributed on an "AS IS" BASIS, | 
|  | # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | # See the License for the specific language governing permissions and | 
|  | # limitations under the License. | 
|  | # | 
|  |  | 
|  | # This script will extract ASAN libraries from /system/asan.tar.gz to /data and then reboot. | 
|  |  | 
|  | # TODO: | 
|  | #   * Timestamp or something to know when to run this again. Right now take the existence of | 
|  | #     /data/lib as we're already done. | 
|  | #   * Need to distinguish pre- from post-decryption for FDE. | 
|  |  | 
|  | SRC=/system/asan.tar.bz2 | 
|  | MD5_FILE=/data/asan.md5sum | 
|  | ASAN_DIR=/data/asan | 
|  | # Minimum /data size in blocks. Arbitrarily 512M. | 
|  | MIN_DATA_SIZE=131072 | 
|  |  | 
|  | # Checks for FDE pre-decrypt state. | 
|  |  | 
|  | VOLD_STATUS=$(getprop vold.decrypt) | 
|  | if [ "$VOLD_STATUS" = "trigger_restart_min_framework" ] ; then | 
|  | log -p i -t asan_install "Pre-decrypt FDE detected (by vold property)!" | 
|  | exit 1 | 
|  | fi | 
|  |  | 
|  | STATFS_BLOCKS=$(stat -f -c '%b' /data) | 
|  | if [ "$STATFS_BLOCKS" -le "$MIN_DATA_SIZE" ] ; then | 
|  | log -p i -t asan_install "Pre-decrypt FDE detected (by /data size)!" | 
|  | exit 1 | 
|  | fi | 
|  |  | 
|  | # Check for ASAN source. | 
|  |  | 
|  | if ! test -f $SRC ; then | 
|  | log -p i -t asan_install "Did not find $SRC!" | 
|  | exit 1 | 
|  | fi | 
|  |  | 
|  | log -p i -t asan_install "Found $SRC, checking whether we need to apply it." | 
|  |  | 
|  | # Checksum check. | 
|  |  | 
|  | ASAN_TAR_MD5=$(md5sum $SRC) | 
|  | if test -f $MD5_FILE ; then | 
|  | INSTALLED_MD5=$(cat $MD5_FILE) | 
|  | if [ "x$ASAN_TAR_MD5" = "x$INSTALLED_MD5" ] ; then | 
|  | log -p i -t asan_install "Checksums match, nothing to be done here." | 
|  | exit 0 | 
|  | fi | 
|  | fi | 
|  |  | 
|  | # Actually apply the source. | 
|  |  | 
|  | # Just clean up, helps with restorecon. | 
|  | rm -rf $ASAN_DIR | 
|  |  | 
|  | log -p i -t asan_install "Untarring $SRC..." | 
|  |  | 
|  | # Unzip from /system/asan.tar.gz into data. Need to pipe as gunzip is not on device. | 
|  | bzip2 -c -d $SRC | tar -x -f - --no-same-owner -C / || exit 1 | 
|  |  | 
|  | # Cannot log here, log would run with system_data_file. | 
|  |  | 
|  | # Set correct permission bits. | 
|  | chmod -R 744 $ASAN_DIR | 
|  | cd $ASAN_DIR ; find . -type d -exec chmod 755 {} \; | 
|  |  | 
|  | restorecon -R -F $ASAN_DIR/*/lib* | 
|  |  | 
|  | log -p i -t asan_install "Fixed selinux labels..." | 
|  |  | 
|  |  | 
|  | # Now write down our checksum to mark the extraction complete. | 
|  | echo "$ASAN_TAR_MD5" > $MD5_FILE | 
|  |  | 
|  | # We want to reboot now. It seems it is not possible to run "reboot" here, the device will | 
|  | # just be stuck. | 
|  |  | 
|  | log -p i -t asan_install "Signaling init to reboot..." | 
|  |  | 
|  | setprop sys.powerctl reboot |