/ enable_asan_mode
enable_asan_mode
  1  #!/bin/bash -e
  2  
  3  if [ $# -ne 1 ]; then
  4      echo "Usage:" 1>&2
  5      echo "  sudo $0 enable       ... enables ASanification of system libraries on your system" 1>&2
  6      echo "  sudo $0 disable      ... reverts the changes and restores the system back to normal" 1>&2
  7      echo "  $0 status            ... prints current mode" 1>&2
  8      exit 1
  9  fi
 10  
 11  LIBSYSTEM_B="/usr/lib/libSystem.B.dylib"
 12  LIBSYSTEM_B_BACKUP="${LIBSYSTEM_B}-asan-mode-backup"
 13  LIBSYSTEM_B_ASAN="/usr/lib/libSystem.B_asan.dylib"
 14  
 15  # If this file is present on the system and we are using a development build
 16  # then the usual memory resource limits won't be applied.
 17  # rdar://problem/43520116
 18  DISABLE_MEM_LIMIT_COOKIE_FILE="/usr/local/share/launchd-disable-memory-limits"
 19  DISABLE_MEM_LIMIT_COOKIE_CONTENTS="kEnableAsanDisableMemLimit"
 20  
 21  function is_mac_os() {
 22    if [ $(sw_vers -productName | grep -c '^Mac OS') -ne 0 ]; then
 23        # Mac OS.
 24        return 0
 25    else
 26        # Something else.
 27        return 1
 28    fi
 29  }
 30  
 31  function show_have_asan_mode_on_msg() {
 32      echo "Looks like your system already has ASan mode enabled, or you have a custom ${LIBSYSTEM_B} file. Not activating." 1>&2
 33  }
 34  
 35  if ! is_mac_os; then
 36      # Check assumption that ${LIBSYSTEM_B} is in the dyld shared cache.
 37      if [ "$(dyld_shared_cache_util -list | grep -c "^${LIBSYSTEM_B}$")" -eq 0 ]; then
 38          echo "Error: Non macOS platform detected but ${LIBSYSTEM_B} is not in your dyld shared cache." 1>&2
 39          exit 1
 40      fi
 41  fi
 42  
 43  case "$1" in
 44    enable)
 45        if [[ $(id -u) != 0 ]]; then echo "Must be run as root." 1>&2; exit 1; fi
 46  
 47        if is_mac_os; then
 48            if [ -f ${LIBSYSTEM_B_BACKUP} ]; then
 49                if [ "`md5 -q ${LIBSYSTEM_B_BACKUP}`" != "`md5 -q ${LIBSYSTEM_B}`" ]; then
 50                    show_have_asan_mode_on_msg
 51                    exit 1
 52                fi
 53            fi
 54            ditto ${LIBSYSTEM_B} ${LIBSYSTEM_B_BACKUP}
 55        else
 56            # libSystem.B.dylib does not exist on non-macos platforms because it
 57            # lives in the dyld cache so we don't have a back up file. Instead
 58            # the presence of `libSystem.B.dylib` indicates that we are using ASan mode.
 59            if [ -f ${LIBSYSTEM_B} ]; then
 60                show_have_asan_mode_on_msg
 61                exit 1
 62            fi
 63            # Disable memory limits because ASan adds memory overhead.
 64            echo "${DISABLE_MEM_LIMIT_COOKIE_CONTENTS}" > "${DISABLE_MEM_LIMIT_COOKIE_FILE}"
 65        fi
 66  
 67        ditto ${LIBSYSTEM_B_ASAN} ${LIBSYSTEM_B}
 68        echo "ASan mode activated. You probably want to reboot now." 1>&2
 69        exit 0
 70    ;;
 71    disable)
 72        if [[ $(id -u) != 0 ]]; then echo "Must be run as root." 1>&2; exit 1; fi
 73        if is_mac_os; then
 74            ditto ${LIBSYSTEM_B_BACKUP} ${LIBSYSTEM_B}
 75        else
 76            if [ ! -f "${LIBSYSTEM_B}" ]; then
 77                echo "ASan mode cannot be disabled if it is not already enabled" 2>&1
 78                exit 1
 79            fi
 80            if [ "`md5 -q ${LIBSYSTEM_B_ASAN}`" != "`md5 -q ${LIBSYSTEM_B}`" ]; then
 81                echo "You appear to have a custom ${LIBSYSTEM_B} file. Not deactivating." 1>&2
 82                exit 1
 83            fi
 84            # Safe to do because we've checked this is the ASan version and the normal versions
 85            # lives in the dyld shared cache.
 86            rm -f ${LIBSYSTEM_B}
 87            if [ ! -f "${DISABLE_MEM_LIMIT_COOKIE_FILE}" ] ; then
 88                echo "Warning: Can't find \"${DISABLE_MEM_LIMIT_COOKIE_FILE}\" so skipping delete" 2>&1
 89            else
 90                # Check the contents of the cookie file and only delete if it matches.
 91                # If it doesn't match we don't delete because we assume the user wants
 92                # to keep the cookie file around.
 93                if [ "$(grep -c "^${DISABLE_MEM_LIMIT_COOKIE_CONTENTS}$" "${DISABLE_MEM_LIMIT_COOKIE_FILE}")" -eq 1 ]; then
 94                    rm -f "${DISABLE_MEM_LIMIT_COOKIE_FILE}"
 95                else
 96                    echo "Warning: Not removing \"${DISABLE_MEM_LIMIT_COOKIE_FILE}\" because it has been modified" 2>&1
 97                fi
 98            fi
 99        fi
100        echo "ASan mode deactivated. You probably want to reboot now." 1>&2
101        exit 0
102    ;;
103    status)
104        if is_mac_os; then
105            if [ ! -f ${LIBSYSTEM_B_BACKUP} ]; then
106                echo "ASan mode is disabled." 1>&2
107                exit 0
108            fi
109  
110            if [ "`md5 -q ${LIBSYSTEM_B_BACKUP}`" == "`md5 -q ${LIBSYSTEM_B}`" ]; then
111                echo "ASan mode is disabled." 1>&2
112                exit 0
113            fi
114        else
115            if [ ! -f ${LIBSYSTEM_B} ]; then
116                echo "ASan mode is disabled." 1>&2
117                exit 0
118            fi
119        fi
120  
121        if [ "`md5 -q ${LIBSYSTEM_B_ASAN}`" == "`md5 -q ${LIBSYSTEM_B}`" ]; then
122            echo "ASan mode is enabled." 1>&2
123            exit 0
124        fi
125  
126        echo "Cannot tell whether ASan mode is enabled or not. You seem to have a custom ${LIBSYSTEM_B} file." 1>&2
127        exit 1
128    ;;
129    *)
130        echo "Invalid argument. Run '$0' for usage instructions." 1>&2
131        exit 1
132    ;;
133  esac