Project

General

Profile

Bug #1679

rb_w32_getenv() invalidates previous environment pointers

Added by Jarek Jurasz over 6 years ago. Updated over 4 years ago.

Status:
Closed
Priority:
Normal
Assignee:
ruby -v:
ruby 1.8.6 (2007-03-13 patchlevel 0) [i386-mswin32]
Backport:
2.0.0: UNKNOWN, 2.1: UNKNOWN, 2.2: UNKNOWN, 2.3: UNKNOWN
[ruby-core:23983]

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 4 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 4 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 6 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 6 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 over 4 years ago

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

#4 [ruby-core:37374] Updated by Yui NARUSE over 4 years ago

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

#5 Updated by Hiroshi Nakamura over 4 years ago

  • Target version set to 1.9.3

#6 [ruby-core:37656] Updated by Usaku NAKAMURA over 4 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 [ruby-core:37657] Updated by Usaku NAKAMURA over 4 years ago

  • Status changed from Assigned to Closed

Also available in: Atom PDF