]> git.saurik.com Git - apple/libsystem.git/blob - enable_asan_mode
Libsystem-1292.100.5.tar.gz
[apple/libsystem.git] / 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