Bug #1679

rb_w32_getenv() invalidates previous environment pointers

Added by Jarek Jurasz almost 6 years ago. Updated over 3 years ago.

[ruby-core:23983]
Status:Closed
Priority:Normal
Assignee:Akio Tajima
ruby -v:ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32] Backport:

Description

=begin
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.
=end

Associated revisions

Revision 32310
Added by Nobuyoshi Nakada over 3 years ago

  • ruby.c (ruby_init_loadpath_safe): ensure RUBYLIB_PREFIX stored before RUBYLIB, even if MANGLED_PATH is enabled. fixed #1679. MANGLED_PATH is disabled by the default and will be removed completely in the future.

Revision 32310
Added by Nobuyoshi Nakada over 3 years ago

  • ruby.c (ruby_init_loadpath_safe): ensure RUBYLIB_PREFIX stored before RUBYLIB, even if MANGLED_PATH is enabled. fixed #1679. MANGLED_PATH is disabled by the default and will be removed completely in the future.

History

#1 Updated by Jarek Jurasz over 5 years ago

=begin
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) {
map_errno(GetLastError());
return NULL;
}
/
Memory leak */
return strdup(env);
}
=end

#2 Updated by Usaku NAKAMURA over 5 years ago

  • Category set to core

=begin
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().
=end

#3 Updated by Akira Tanaka almost 4 years ago

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

#4 Updated by Yui NARUSE almost 4 years ago

  • Status changed from Open to Assigned
  • Assignee set to Akio Tajima

#5 Updated by Hiroshi Nakamura almost 4 years ago

  • Target version set to 1.9.3

#6 Updated by Usaku NAKAMURA over 3 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.

#7 Updated by Usaku NAKAMURA over 3 years ago

  • Status changed from Assigned to Closed

Also available in: Atom PDF