//===- Environment.cpp - ORC-RT executor environment access ---------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // Implementation of the environment helpers declared in Environment.h. // //===----------------------------------------------------------------------===// // Must precede any include so exposes glibc's secure_getenv. #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #include "Environment.h" #include #if defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || \ defined(__NetBSD__) || defined(__DragonFly__) #include // for issetugid #endif namespace orc_rt { const char *secureGetenv(const char *Name) { #if defined(__GLIBC__) // secure_getenv returns null in "secure execution" mode, which the kernel // sets for set-user-ID / set-group-ID programs (and other privilege // transitions). return ::secure_getenv(Name); #elif defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || \ defined(__NetBSD__) || defined(__DragonFly__) // No secure_getenv; issetugid() reports whether the process was made // set-user-ID / set-group-ID (or otherwise had its ids changed). return ::issetugid() ? nullptr : ::getenv(Name); #else // We cannot verify here that the environment is trustworthy, so fail secure: // refuse to read the variable rather than risk honoring an attacker-supplied // value in a privileged process. // // TODO: Add branches for other libcs/platforms as needed (e.g. musl's // secure_getenv, Windows), so their environment variables aren't ignored. (void)Name; return nullptr; #endif } } // namespace orc_rt