Commit c847b1b4 authored by Matt Glazar's avatar Matt Glazar Committed by Facebook Github Bot

Fix environ enumeration on Apple platforms

Summary:
environ is documented to not work very well from .dylib-s (dynamic libraries) on macOS. Use the _NSGetEnviron function instead to get a pointer to environ.

<crt_externs.h> is missing from some iOS SDKs, so forward-declare _NSGetEnviron in such cases.

Reviewed By: Orvid, mzlee

Differential Revision: D4491044

fbshipit-source-id: 886d19bdd63dea14225992446b7ba132faf35054
parent c10a6640
...@@ -18,6 +18,12 @@ ...@@ -18,6 +18,12 @@
#include <cstdlib> #include <cstdlib>
#if defined(__APPLE__)
#if __has_include(<crt_externs.h>)
#include <crt_externs.h>
#endif
#endif
extern "C" { extern "C" {
#ifdef _WIN32 #ifdef _WIN32
// These are technically supposed to be defined linux/limits.h and // These are technically supposed to be defined linux/limits.h and
...@@ -35,6 +41,10 @@ char* realpath(const char* path, char* resolved_path); ...@@ -35,6 +41,10 @@ char* realpath(const char* path, char* resolved_path);
int setenv(const char* name, const char* value, int overwrite); int setenv(const char* name, const char* value, int overwrite);
int unsetenv(const char* name); int unsetenv(const char* name);
#elif defined(__APPLE__) #elif defined(__APPLE__)
extern char** environ; // environ doesn't work well with dylibs, so use _NSGetEnviron instead.
#if !__has_include(<crt_externs.h>)
char*** _NSGetEnviron(void);
#endif
#define environ (*_NSGetEnviron())
#endif #endif
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment