<pre style='margin:0'>
Clemens Lang (neverpanic) pushed a commit to branch release-2.6
in repository macports-base.

</pre>
<p><a href="https://github.com/macports/macports-base/commit/f9b9677d1ddfe124dbffb94e850b387de818ec69">https://github.com/macports/macports-base/commit/f9b9677d1ddfe124dbffb94e850b387de818ec69</a></p>
<pre style="white-space: pre; background: #F8F8F8"><span style='display:block; white-space:pre;color:#808000;'>commit f9b9677d1ddfe124dbffb94e850b387de818ec69
</span>Author: Saagar Jha <saagar@saagarjha.com>
AuthorDate: Sat Jun 27 19:44:49 2020 -0700

<span style='display:block; white-space:pre;color:#404040;'>    Do not interpose functions before initialization
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Static initializers have no defined order in which they are run;
</span><span style='display:block; white-space:pre;color:#404040;'>    interposed functions, however, take effect at program initialization. In
</span><span style='display:block; white-space:pre;color:#404040;'>    some cases, our interposed functions would be called by libSystem's
</span><span style='display:block; white-space:pre;color:#404040;'>    constructors and prior to *our* constructors, and this would lead to
</span><span style='display:block; white-space:pre;color:#404040;'>    crashes in trace mode as we would be in an uninitialized state. All our
</span><span style='display:block; white-space:pre;color:#404040;'>    interposers now immediately delegate to their interposees until the are
</span><span style='display:block; white-space:pre;color:#404040;'>    sure initialization has been performed.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Closes: https://trac.macports.org/ticket/60702
</span><span style='display:block; white-space:pre;color:#404040;'>    (cherry picked from commit d96e5a85afd0ce3cdd9d8e56409ba89bafd9cccc)
</span>---
 src/darwintracelib1.0/access.c      |  4 ++++
 src/darwintracelib1.0/close.c       |  4 ++++
 src/darwintracelib1.0/darwintrace.c | 24 ++++++++++++++++++++++--
 src/darwintracelib1.0/darwintrace.h | 24 ++++++++++++++++++++++++
 src/darwintracelib1.0/dup2.c        |  4 ++++
 src/darwintracelib1.0/mkdir.c       |  4 ++++
 src/darwintracelib1.0/open.c        |  9 +++++++++
 src/darwintracelib1.0/proc.c        | 12 +++++++++---
 src/darwintracelib1.0/readdir.c     |  8 ++++++++
 src/darwintracelib1.0/readlink.c    |  4 ++++
 src/darwintracelib1.0/rename.c      |  4 ++++
 src/darwintracelib1.0/rmdir.c       |  4 ++++
 src/darwintracelib1.0/stat.c        | 16 ++++++++++++++++
 src/darwintracelib1.0/unlink.c      |  4 ++++
 14 files changed, 120 insertions(+), 5 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/darwintracelib1.0/access.c b/src/darwintracelib1.0/access.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 9db866b9..f44848c1 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/darwintracelib1.0/access.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/darwintracelib1.0/access.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -39,6 +39,10 @@
</span> #include <unistd.h>
 
 static int _dt_access(const char *path, int amode) {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        if (!__darwintrace_initialized) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           return access(path, amode);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>   __darwintrace_setup();
 
        int result = 0;
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/darwintracelib1.0/close.c b/src/darwintracelib1.0/close.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 09c036ec..c52aa44a 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/darwintracelib1.0/close.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/darwintracelib1.0/close.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -48,6 +48,10 @@
</span>  * will be set to the FD to be closed when closing should be allowed.
  */
 static int _dt_close(int fd) {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        if (!__darwintrace_initialized) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           return close(fd);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>   __darwintrace_setup();
 
        FILE *stream = __darwintrace_sock();
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/darwintracelib1.0/darwintrace.c b/src/darwintracelib1.0/darwintrace.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 650c0945..4719bedf 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/darwintracelib1.0/darwintrace.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/darwintracelib1.0/darwintrace.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -88,7 +88,6 @@ volatile int __darwintrace_close_sock = -1;
</span> FILE *__darwintrace_stderr = NULL;
 
 static inline void __darwintrace_log_op(const char *op, const char *path);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-static void __darwintrace_setup_tls() __attribute__((constructor));
</span> static char *__send(const char *buf, uint32_t len, int answer);
 
 /**
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -121,6 +120,27 @@ static _Atomic(char *) filemap;
</span> static char *filemap;
 #endif
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+volatile bool __darwintrace_initialized = false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/**
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * "Constructors" we'd like to run before we do anything. As using
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * __attribute__((constructor)) for these would be unsafe here (as our
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * interposed functions might end up being called first) we'll run them manually
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * before we interpose anything.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+static void (*constructors[])() = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   __darwintrace_setup_tls,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   __darwintrace_store_env,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void __darwintrace_run_constructors() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   for (size_t i = 0; i < sizeof(constructors) / sizeof(*constructors); ++i) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           constructors[i]();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   __darwintrace_initialized = true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> static void __darwintrace_sock_destructor(FILE *dtsock) {
        __darwintrace_close_sock = fileno(dtsock);
        fclose(dtsock);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -132,7 +152,7 @@ static void __darwintrace_sock_destructor(FILE *dtsock) {
</span>  * Setup method called as constructor to set up thread-local storage for the
  * thread id and the darwintrace socket.
  */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-static void __darwintrace_setup_tls() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void __darwintrace_setup_tls() {
</span>   if (0 != (errno = pthread_key_create(&tid_key, NULL))) {
                perror("darwintrace: pthread_key_create");
                abort();
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/darwintracelib1.0/darwintrace.h b/src/darwintracelib1.0/darwintrace.h
</span><span style='display:block; white-space:pre;color:#808080;'>index 3604fb34..8955b248 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/darwintracelib1.0/darwintrace.h
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/darwintracelib1.0/darwintrace.h
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -130,6 +130,12 @@ void __darwintrace_close();
</span>  */
 bool __darwintrace_is_in_sandbox(const char *path, int flags);
 
<span style='display:block; white-space:pre;background:#e0ffe0;'>+/**
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Whether darwintrace has been fully initialized or not. Do not interpose if
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * this has not been set to true.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+volatile bool __darwintrace_initialized;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> #ifdef DARWINTRACE_USE_PRIVATE_API
 #include <errno.h>
 #include <stdlib.h>
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -182,4 +188,22 @@ static inline void __darwintrace_sock_set(FILE *stream) {
</span>           abort();
        }
 }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/**
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Initialize TLS variables.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void __darwintrace_setup_tls();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/**
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Grab environment variables at startup.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void __darwintrace_store_env();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+/**
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Runs our "constructors". By this point all of the system libraries we link
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * against should be fully initialized, so we can call their functions safely.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Once our initialization is complete we may begin interposing.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void __darwintrace_run_constructors() __attribute__((constructor));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> #endif /* defined(DARWINTRACE_USE_PRIVATE_API) */
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/darwintracelib1.0/dup2.c b/src/darwintracelib1.0/dup2.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 3b8e29bf..72ec2d8b 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/darwintracelib1.0/dup2.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/darwintracelib1.0/dup2.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -46,6 +46,10 @@
</span>  * FDs are numbered in ascending order.
  */
 static int _dt_dup2(int filedes, int filedes2) {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        if (!__darwintrace_initialized) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           return dup2(filedes, filedes2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>   __darwintrace_setup();
 
        FILE *stream = __darwintrace_sock();
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/darwintracelib1.0/mkdir.c b/src/darwintracelib1.0/mkdir.c
</span><span style='display:block; white-space:pre;color:#808080;'>index c59c8d84..8bca4dcc 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/darwintracelib1.0/mkdir.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/darwintracelib1.0/mkdir.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -51,6 +51,10 @@
</span>  * outside the sandbox that already exist.
  */
 static int _dt_mkdir(const char *path, mode_t mode) {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        if (!__darwintrace_initialized) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           return mkdir(path, mode);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>   __darwintrace_setup();
 
        int result = 0;
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/darwintracelib1.0/open.c b/src/darwintracelib1.0/open.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 1315db8e..8829a9b0 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/darwintracelib1.0/open.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/darwintracelib1.0/open.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -46,6 +46,15 @@
</span>  * when attempting to create a file, i.e., when \c O_CREAT is set.
  */
 static int _dt_open(const char *path, int flags, ...) {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        if (!__darwintrace_initialized) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           va_list args;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           va_start(args, flags);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           mode_t mode = va_arg(args, int);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           va_end(args);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           return open(path, flags, mode);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>   __darwintrace_setup();
        int result = 0;
 
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/darwintracelib1.0/proc.c b/src/darwintracelib1.0/proc.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 32f8f5ee..3d0fa5cf 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/darwintracelib1.0/proc.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/darwintracelib1.0/proc.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -52,8 +52,6 @@
</span> #include <spawn.h>
 #endif
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-static void store_env() __attribute__((constructor));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span> /**
  * Copy of the DYLD_INSERT_LIBRARIES environment variable to restore it in
  * execve(2). DYLD_INSERT_LIBRARIES is needed to preload this library into any
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -83,7 +81,7 @@ static char *__env_full_darwintrace_log;
</span>  * Copy the environment variables, if they're defined. This is run as
  * a constructor at startup.
  */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-static void store_env() {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+void __darwintrace_store_env() {
</span> #define COPYENV(name, variable, valuevar) do {\
                char *val;\
                if (NULL != (val = getenv(#name))) {\
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -249,6 +247,10 @@ static inline int check_interpreter(const char *restrict path) {
</span>  * using \c check_interpreter.
  */
 static int _dt_execve(const char *path, char *const argv[], char *const envp[]) {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        if (!__darwintrace_initialized) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           return execve(path, argv, envp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>   __darwintrace_setup();
 
        int result = 0;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -291,6 +293,10 @@ DARWINTRACE_INTERPOSE(_dt_execve, execve);
</span>  */
 static int _dt_posix_spawn(pid_t *restrict pid, const char *restrict path, const posix_spawn_file_actions_t *file_actions,
                const posix_spawnattr_t *restrict attrp, char *const argv[restrict], char *const envp[restrict]) {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        if (!__darwintrace_initialized) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           return posix_spawn(pid, path, file_actions, attrp, argv, envp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>   __darwintrace_setup();
 
        int result = 0;
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/darwintracelib1.0/readdir.c b/src/darwintracelib1.0/readdir.c
</span><span style='display:block; white-space:pre;color:#808080;'>index b58b83ab..1ad7dc8b 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/darwintracelib1.0/readdir.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/darwintracelib1.0/readdir.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -67,6 +67,10 @@ struct dirent64  {
</span> size_t __getdirentries64(int fd, void *buf, size_t bufsize, __darwin_off_t *basep);
 
 static size_t _dt_getdirentries64(int fd, void *buf, size_t bufsize, __darwin_off_t *basep) {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        if (!__darwintrace_initialized) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           return __getdirentries64(fd, buf, bufsize, basep);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>   __darwintrace_setup();
 
        size_t sz = __getdirentries64(fd, buf, bufsize, basep);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -123,6 +127,10 @@ struct dirent32 {
</span> int getdirentries(int fd, char *buf, int nbytes, long *basep);
 
 static int _dt_getdirentries(int fd, char *buf, int nbytes, long *basep) {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        if (!__darwintrace_initialized) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           return getdirentries(fd, buf, nbytes, basep);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>   __darwintrace_setup();
 
        size_t sz = getdirentries(fd, buf, nbytes, basep);
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/darwintracelib1.0/readlink.c b/src/darwintracelib1.0/readlink.c
</span><span style='display:block; white-space:pre;color:#808080;'>index cbc2bc12..e8985b00 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/darwintracelib1.0/readlink.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/darwintracelib1.0/readlink.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -43,6 +43,10 @@
</span>  * Deny \c readlink(2) if the file is not within the sandbox bounds.
  */
 static ssize_t _dt_readlink(const char *path, char *buf, size_t bufsiz) {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        if (!__darwintrace_initialized) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           return readlink(path, buf, bufsiz);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>   __darwintrace_setup();
 
        int result = 0;
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/darwintracelib1.0/rename.c b/src/darwintracelib1.0/rename.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 43bce5e5..cb4e500d 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/darwintracelib1.0/rename.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/darwintracelib1.0/rename.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -44,6 +44,10 @@
</span>  * sandbox.
  */
 static int _dt_rename(const char *from, const char *to) {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        if (!__darwintrace_initialized) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           return rename(from, to);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>   __darwintrace_setup();
 
        int result = 0;
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/darwintracelib1.0/rmdir.c b/src/darwintracelib1.0/rmdir.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 1a99d5d3..1147474d 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/darwintracelib1.0/rmdir.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/darwintracelib1.0/rmdir.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -44,6 +44,10 @@
</span>  * sandbox.
  */
 static int _dt_rmdir(const char *path) {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        if (!__darwintrace_initialized) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           return rmdir(path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>   __darwintrace_setup();
 
        int result = 0;
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/darwintracelib1.0/stat.c b/src/darwintracelib1.0/stat.c
</span><span style='display:block; white-space:pre;color:#808080;'>index 379145fa..fc26ad35 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/darwintracelib1.0/stat.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/darwintracelib1.0/stat.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -50,6 +50,10 @@ int stat(const char *path, void *sb);
</span>  * sandbox.
  */
 static int _dt_stat(const char *path, void *sb) {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        if (!__darwintrace_initialized) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           return stat(path, sb);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>   __darwintrace_setup();
 
        int result = 0;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -75,6 +79,10 @@ int stat64(const char *path, void *sb);
</span> int stat$INODE64(const char *path, void *sb);
 
 static int _dt_stat64(const char *path, void *sb) {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        if (!__darwintrace_initialized) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           return stat64(path, sb);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>   __darwintrace_setup();
 
        int result = 0;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -99,6 +107,10 @@ DARWINTRACE_INTERPOSE(_dt_stat64, stat$INODE64);
</span> int lstat(const char *path, void *sb);
 
 static int _dt_lstat(const char *path, void *sb) {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        if (!__darwintrace_initialized) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           return lstat(path, sb);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>   __darwintrace_setup();
 
        int result = 0;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -125,6 +137,10 @@ int lstat64(const char *path, void *sb);
</span> int lstat$INODE64(const char *path, void *sb);
 
 static int _dt_lstat64(const char *path, void *sb) {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        if (!__darwintrace_initialized) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           return lstat64(path, sb);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span>   __darwintrace_setup();
 
        int result = 0;
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/src/darwintracelib1.0/unlink.c b/src/darwintracelib1.0/unlink.c
</span><span style='display:block; white-space:pre;color:#808080;'>index ee7de08f..598db610 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/src/darwintracelib1.0/unlink.c
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/src/darwintracelib1.0/unlink.c
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -44,6 +44,10 @@
</span>  * of the sandbox and simulate non-existence of the file instead.
  */
 static int _dt_unlink(const char *path) {
<span style='display:block; white-space:pre;background:#e0ffe0;'>+        if (!__darwintrace_initialized) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+           return unlink(path);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   
</span>   __darwintrace_setup();
 
        int result = 0;
</pre><pre style='margin:0'>

</pre>