From: <sv...@va...> - 2007-03-11 13:00:42
|
Author: sewardj Date: 2007-03-11 13:00:34 +0000 (Sun, 11 Mar 2007) New Revision: 6640 Log: 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. Modified: trunk/memcheck/mc_replace_strmem.c Modified: trunk/memcheck/mc_replace_strmem.c =================================================================== --- trunk/memcheck/mc_replace_strmem.c 2007-03-10 02:27:44 UTC (rev 6639) +++ trunk/memcheck/mc_replace_strmem.c 2007-03-11 13:00:34 UTC (rev 6640) @@ -670,6 +670,40 @@ 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 ---*/ /*------------------------------------------------------------*/ |