Bug #1679


rb_w32_getenv() invalidates previous environment pointers

Added by jeremi_tu (Jarek Jurasz) almost 13 years ago. Updated almost 11 years ago.

Target version:
ruby -v:
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]


On Windows turning on page heap (gflags -p /enable ruby.exe /full) revealed that environment pointers returned by rb_w32_getenv() get invalidated on the next call to this function due to the freeing of the environment buffer.
In particular getenv("RUBYLIB_PREFIX") in rubylib_mangle() frees getenv("RUBYLIB") fetched in ruby_init_loadpath(). This bug is also present in ruby 1.9.1-p129.

The workaround - the RTL version of getenv() - worked fine for me so far.

Actions #1

Updated by jeremi_tu (Jarek Jurasz) over 12 years ago

It does not know about SetEnvironmentVariable() in ruby_setenv() / hash.c.
GetEnvironmentVariable() needs some memory management.
The following leaky version passes the test.

char *
rb_w32_getenv(const char name)
char env[1024];
unsigned len = GetEnvironmentVariable(name, env, sizeof(env));
if (! len) {
return NULL;
Memory leak */
return strdup(env);

Actions #2

Updated by usa (Usaku NAKAMURA) over 12 years ago

  • Category set to core

ISO C and POSIX say that the returned string may be overwritten by a subsequent call of getenv().
So, the behavior of rb_w32_getenv() is collect and the wrong point is rb_init_loadpath().

Actions #3

Updated by akr (Akira Tanaka) almost 11 years ago

  • Project changed from Ruby to Ruby master
  • Category changed from core to core

Updated by naruse (Yui NARUSE) almost 11 years ago

  • Status changed from Open to Assigned
  • Assignee set to arton (Akio Tajima)
Actions #5

Updated by nahi (Hiroshi Nakamura) almost 11 years ago

  • Target version set to 1.9.3

Updated by usa (Usaku NAKAMURA) almost 11 years ago

In current trunk (at least), this problem is not occurred.
The return value of getenv("RUBY_LIB") is rb_str_new()'ed before another getenv() call.

Updated by usa (Usaku NAKAMURA) almost 11 years ago

  • Status changed from Assigned to Closed

Also available in: Atom PDF