Index: compiler-rt/lib/sanitizer_common/sanitizer_rtems.cc =================================================================== --- compiler-rt/lib/sanitizer_common/sanitizer_rtems.cc +++ compiler-rt/lib/sanitizer_common/sanitizer_rtems.cc @@ -34,6 +34,11 @@ #define __mmap_free free #define __mmap_memset memset +static const __asan::uptr __sanitizer_env_len = 1024; +// This variable needs to not be in .bss because we don't want +// zero-initialization by the OS. +char __sanitizer_env[__sanitizer_env_len] __attribute__((section(".data"))); + namespace __sanitizer { #include "sanitizer_syscall_generic.inc" @@ -239,8 +244,26 @@ return true; } -char **GetArgv() { return NULL; } -const char *GetEnv(const char *name) { return NULL; } +char **GetArgv() { return nullptr; } + +const char *GetEnv(const char *name) { + char *const env = __sanitizer_env; + uptr env_len = __sanitizer_env_len; + // To avoid buffer overrun, give up if buffer is not null terminated. + if (env[env_len - 1] != '\0') + return nullptr; + + uptr name_len = internal_strlen(name); + uptr end = env_len - name_len - 2; + uptr i = 0; + while (i <= end) { + if (internal_strncmp(&env[i], name, name_len) == 0 && + env[i + name_len] == '=') + return &env[i + name_len + 1]; + i += internal_strlen(env) + 1; + } + return nullptr; +} uptr ReadBinaryName(/*out*/char *buf, uptr buf_len) { internal_strncpy(buf, "StubBinaryName", buf_len);