From: Julian Seward Date: Sun, 11 Mar 2007 13:00:34 +0000 (+0000) Subject: It appears glibc-2.5's getenv() function steps along environment X-Git-Tag: svn/VALGRIND_3_3_0~326 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e9a5b6ad4e92717b28f13078a02bec3f8651cfa9;p=thirdparty%2Fvalgrind.git It appears glibc-2.5's getenv() function steps along environment strings in 16-bit chunks, which can cause false errors in some cases (sigh). So do the usual thing and replace it. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@6640 --- diff --git a/memcheck/mc_replace_strmem.c b/memcheck/mc_replace_strmem.c index b7d016f00e..02b90a7673 100644 --- a/memcheck/mc_replace_strmem.c +++ b/memcheck/mc_replace_strmem.c @@ -670,6 +670,40 @@ GLIBC25_MEMPCPY(m_libc_soname, mempcpy) GLIBC25_MEMPCPY(m_ld_so_1, mempcpy) /* ld.so.1 */ +/* getenv. glibc-2.5 steps along the env strings in 2 byte chunks + which means it sometimes overreads. sigh. */ +#define GLIBC25_GETENV(soname, fnname) \ + char* VG_REPLACE_FUNCTION_ZU(soname,fnname)( const char* name0 ); \ + char* VG_REPLACE_FUNCTION_ZU(soname,fnname)( const char* name0 ) \ + { \ + char** ep; \ + char* cand; \ + char* name; \ + extern char** __environ; \ + if (__environ == NULL || name0 == NULL || name0[0] == '\0') \ + return NULL; \ + for (ep = __environ; *ep; ep++) { \ + cand = *ep; \ + name = (char*)name0; \ + /* advance cand and name until either points at zero or \ + until what they both point at differs. */ \ + while (1) { \ + if (*cand == 0 || *name == 0) \ + break; \ + if (*cand != *name) \ + break; \ + cand++; \ + name++; \ + } \ + if (*name == 0 && *cand == '=') \ + return cand+1; \ + } \ + return NULL; \ + } + +GLIBC25_GETENV(m_libc_soname, getenv) + + /*------------------------------------------------------------*/ /*--- AIX stuff only after this point ---*/ /*------------------------------------------------------------*/