| 1180 | /* Local utility functions */ |
| 1181 | |
| 1182 | static void |
| 1183 | Report(bool isFatal, const char *pFormat, ...) |
| 1184 | { |
| 1185 | va_list ap; |
| 1186 | |
| 1187 | ASSERT(pFormat); |
| 1188 | |
| 1189 | va_start(ap, pFormat); |
| 1190 | #if defined(_KERNEL) |
| 1191 | if (isFatal) |
| 1192 | vpanic(pFormat, ap); |
| 1193 | else |
| 1194 | vprintf(pFormat, ap); |
| 1195 | #else |
| 1196 | if (ubsan_flags == -1) { |
| 1197 | char buf[1024]; |
| 1198 | char *p; |
| 1199 | |
| 1200 | ubsan_flags = UBSAN_STDERR; |
| 1201 | |
| 1202 | if (getenv_r("LIBC_UBSAN", buf, sizeof(buf)) != -1) { |
| 1203 | for (p = buf; *p; p++) { |
| 1204 | switch (*p) { |
| 1205 | case 'a': |
| 1206 | SET(ubsan_flags, UBSAN_ABORT); |
| 1207 | break; |
| 1208 | case 'A': |
| 1209 | CLR(ubsan_flags, UBSAN_ABORT); |
| 1210 | break; |
| 1211 | case 'e': |
| 1212 | SET(ubsan_flags, UBSAN_STDERR); |
| 1213 | break; |
| 1214 | case 'E': |
| 1215 | CLR(ubsan_flags, UBSAN_STDERR); |
| 1216 | break; |
| 1217 | case 'l': |
| 1218 | SET(ubsan_flags, UBSAN_SYSLOG); |
| 1219 | break; |
| 1220 | case 'L': |
| 1221 | CLR(ubsan_flags, UBSAN_SYSLOG); |
| 1222 | break; |
| 1223 | case 'o': |
| 1224 | SET(ubsan_flags, UBSAN_STDOUT); |
| 1225 | break; |
| 1226 | case 'O': |
| 1227 | CLR(ubsan_flags, UBSAN_STDOUT); |
| 1228 | break; |
| 1229 | default: |
| 1230 | break; |
| 1231 | } |
| 1232 | } |
| 1233 | } |
| 1234 | } |
| 1235 | |
| 1236 | // The *v*print* functions can flush the va_list argument. |
| 1237 | // Create a local copy for each call to prevent invalid read. |
| 1238 | if (ISSET(ubsan_flags, UBSAN_STDOUT)) { |
| 1239 | va_list tmp; |
no test coverage detected