diff options
author | Sebastian Hahn <sebastian@torproject.org> | 2012-02-14 12:21:03 +0100 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2012-02-14 11:18:39 -0500 |
commit | efb7b9dec135594718b765234bc1f745855f60d2 (patch) | |
tree | cf8b42d4c5c221354e0b1bf97a7a6ef8e9f42056 | |
parent | efcdc930fb02d471ef1a5f4c09a30ea512ca5a8b (diff) | |
download | tor-efb7b9dec135594718b765234bc1f745855f60d2.tar.gz tor-efb7b9dec135594718b765234bc1f745855f60d2.zip |
Use _NSGetEnviron() instead of environ where required
OS X would otherwise crash with a segfault when linked statically to
some libraries.
-rw-r--r-- | configure.in | 2 | ||||
-rw-r--r-- | src/common/compat.c | 23 | ||||
-rw-r--r-- | src/common/compat.h | 2 | ||||
-rw-r--r-- | src/or/transports.c | 7 |
4 files changed, 30 insertions, 4 deletions
diff --git a/configure.in b/configure.in index b39d156d4b..7b6d8fb023 100644 --- a/configure.in +++ b/configure.in @@ -292,6 +292,7 @@ dnl Check for functions before libevent, since libevent-1.2 apparently dnl exports strlcpy without defining it in a header. AC_CHECK_FUNCS( + _NSGetEnviron \ accept4 \ clock_gettime \ flock \ @@ -622,6 +623,7 @@ dnl These headers are not essential AC_CHECK_HEADERS( arpa/inet.h \ + crt_externs.h \ grp.h \ ifaddrs.h \ inttypes.h \ diff --git a/src/common/compat.c b/src/common/compat.c index 64c06681da..f25a8ac3b0 100644 --- a/src/common/compat.c +++ b/src/common/compat.c @@ -51,6 +51,9 @@ #ifdef HAVE_ARPA_INET_H #include <arpa/inet.h> #endif +#ifdef HAVE_CRT_EXTERNS_H +#include <crt_externs.h> +#endif #ifndef HAVE_GETTIMEOFDAY #ifdef HAVE_FTIME @@ -1659,6 +1662,26 @@ make_path_absolute(char *fname) #endif } +#ifndef HAVE__NSGETENVIRON +/* FreeBSD needs this; it doesn't seem to hurt other platforms. */ +extern char **environ; +#endif + +/** Return the current environment. This is a portable replacement for + * 'environ'. */ +char ** +get_environment(void) +{ +#ifdef HAVE__NSGETENVIRON + /* This is for compatibility between OSX versions. Otherwise (for example) + * when we do a mostly-static build on OSX 10.7, the resulting binary won't + * work on OSX 10.6. */ + return *_NSGetEnviron(); +#else + return environ; +#endif +} + /** Set *addr to the IP address (in dotted-quad notation) stored in c. * Return 1 on success, 0 if c is badly formatted. (Like inet_aton(c,addr), * but works on Windows and Solaris.) diff --git a/src/common/compat.h b/src/common/compat.h index fa1ef90eb7..65e6cb49e0 100644 --- a/src/common/compat.h +++ b/src/common/compat.h @@ -581,6 +581,8 @@ char *get_user_homedir(const char *username); int get_parent_directory(char *fname); char *make_path_absolute(char *fname); +char **get_environment(void); + int spawn_func(void (*func)(void *), void *data); void spawn_exit(void) ATTR_NORETURN; diff --git a/src/or/transports.c b/src/or/transports.c index d279d7ad11..6d9b352b2a 100644 --- a/src/or/transports.c +++ b/src/or/transports.c @@ -1076,8 +1076,6 @@ set_managed_proxy_environment(LPVOID *envp, const managed_proxy_t *mp) #else /* _WIN32 */ -extern char **environ; - /** Prepare the environment <b>envp</b> of managed proxy <b>mp</b>. * <b>envp</b> is allocated on the heap and should be freed by the * caller after its use. */ @@ -1090,7 +1088,8 @@ set_managed_proxy_environment(char ***envp, const managed_proxy_t *mp) char *transports_to_launch=NULL; char *bindaddr=NULL; int environ_size=0; - char **environ_tmp = environ; + char **environ_tmp = get_environment(); + char **environ_save = environ_tmp; int n_envs = mp->is_server ? ENVIRON_SIZE_SERVER : ENVIRON_SIZE_CLIENT; @@ -1098,7 +1097,7 @@ set_managed_proxy_environment(char ***envp, const managed_proxy_t *mp) environ_size++; environ_tmp++; } - environ_tmp = environ; + environ_tmp = environ_save; /* allocate enough space for our env. vars and a NULL pointer */ *envp = tor_malloc(sizeof(char*)*(environ_size+n_envs+1)); |