merge revision(s) 43853: [Backport #9157]

* file.c (rb_readlink): fix buffer overflow on a long symlink. since
	  rb_str_modify_expand() expands from its length but not its capacity,
	  need to set the length properly for each expansion.
	  [ruby-core:58592] [Bug #9157]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_0_0@43959 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nagachika 2013-12-02 14:06:39 +00:00
parent dd7ec71b12
commit 83c337f29a
4 changed files with 30 additions and 4 deletions

View file

@ -1,3 +1,10 @@
Mon Dec 2 22:53:05 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
* file.c (rb_readlink): fix buffer overflow on a long symlink. since
rb_str_modify_expand() expands from its length but not its capacity,
need to set the length properly for each expansion.
[ruby-core:58592] [Bug #9157]
Fri Nov 29 00:31:46 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
* common.mk (Doxyfile): tool/file2lastrev.rb needs running with

1
file.c
View file

@ -2531,6 +2531,7 @@ rb_readlink(VALUE path)
) {
rb_str_modify_expand(v, size);
size *= 2;
rb_str_set_len(v, size);
}
if (rv < 0) {
rb_str_resize(v, 0);

View file

@ -391,6 +391,24 @@ class TestFileExhaustive < Test::Unit::TestCase
rescue NotImplementedError
end
def test_readlink_long_path
return unless @symlinkfile
bug9157 = '[ruby-core:58592] [Bug #9157]'
assert_separately(["-", @symlinkfile, bug9157], <<-"end;")
symlinkfile, bug9157 = *ARGV
100.step(1000, 100) do |n|
File.unlink(symlinkfile)
link = "foo"*n
begin
File.symlink(link, symlinkfile)
rescue Errno::ENAMETOOLONG
break
end
assert_equal(link, File.readlink(symlinkfile), bug9157)
end
end;
end
def test_unlink
assert_equal(1, File.unlink(@file))
make_file("foo", @file)

View file

@ -1,10 +1,10 @@
#define RUBY_VERSION "2.0.0"
#define RUBY_RELEASE_DATE "2013-11-29"
#define RUBY_PATCHLEVEL 354
#define RUBY_RELEASE_DATE "2013-12-02"
#define RUBY_PATCHLEVEL 355
#define RUBY_RELEASE_YEAR 2013
#define RUBY_RELEASE_MONTH 11
#define RUBY_RELEASE_DAY 29
#define RUBY_RELEASE_MONTH 12
#define RUBY_RELEASE_DAY 2
#include "ruby/version.h"