/ 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