diff --git a/AUTHORS b/AUTHORS index 9338289..4844f85 100644 --- a/AUTHORS +++ b/AUTHORS @@ -7,4 +7,4 @@ other contributors: Rémi Denis-Courmont (readv, recvmsg) Clément Stenac (pread) Dominik Kuhlen (recvfrom) - + Sami Liedes (LD_PRELOAD conservation) diff --git a/src/zzuf.c b/src/zzuf.c index 8025ccc..25cd629 100644 --- a/src/zzuf.c +++ b/src/zzuf.c @@ -909,18 +909,34 @@ static int run_process(struct opts *opts, int pipes[][2]) setenv("ZZUF_MAXRATIO", buf, 1); #if defined HAVE_FORK - libpath = malloc(len + strlen("/.libs/" FILENAME EXTRAINFO) + 1); + /* Meaningless but makes sure there is space for everything */ + libpath = malloc(len + strlen(LIBDIR "/.libs/" FILENAME EXTRAINFO) + 1); strcpy(libpath, opts->oldargv[0]); + /* Replace "/path/binaryname" with "/path/.libs/libzzuf.$(EXT)" + * and "binaryname" with ".libs/libzzuf.$(EXT)" + * Write the result in libpath. */ tmp = strrchr(libpath, '/'); strcpy(tmp ? tmp + 1 : libpath, ".libs/" FILENAME); - ret = access(libpath, R_OK); - strcpy(tmp ? tmp + 1 : libpath, ".libs/" FILENAME EXTRAINFO); - if(ret == 0) - setenv(PRELOAD, libpath, 1); - else - setenv(PRELOAD, LIBDIR "/" FILENAME EXTRAINFO, 1); + ret = access(libpath, R_OK); + if(ret < 0) + strcpy(libpath, LIBDIR "/" FILENAME); + + /* OSF1 only */ + strcat(libpath, EXTRAINFO); + + /* Do not clobber previous LD_PRELOAD values */ + tmp = getenv(PRELOAD); + if(tmp && *tmp) + { + char *bigbuf = malloc(strlen(tmp) + strlen(libpath) + 2); + sprintf(bigbuf, "%s:%s", tmp, libpath); + free(libpath); + libpath = bigbuf; + } + + setenv(PRELOAD, libpath, 1); free(libpath); if(execvp(opts->newargv[0], opts->newargv))