[前][次][番号順一覧][スレッド一覧]

ruby-changes:38956

From: nobu <ko1@a...>
Date: Fri, 26 Jun 2015 12:48:58 +0900 (JST)
Subject: [ruby-changes:38956] nobu:r51037 (trunk): transcode.c: fix race condition

nobu	2015-06-26 12:48:41 +0900 (Fri, 26 Jun 2015)

  New Revision: 51037

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=51037

  Log:
    transcode.c: fix race condition
    
    * transcode.c (load_transcoder_entry): fix transcoder loading race
      condition, by waiting in require.  [ruby-dev:49106] [Bug #11277]

  Modified files:
    trunk/ChangeLog
    trunk/test/ruby/test_transcode.rb
    trunk/transcode.c
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 51036)
+++ ChangeLog	(revision 51037)
@@ -1,3 +1,8 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Fri Jun 26 12:48:37 2015  Nobuyoshi Nakada  <nobu@r...>
+
+	* transcode.c (load_transcoder_entry): fix transcoder loading race
+	  condition, by waiting in require.  [ruby-dev:49106] [Bug #11277]
+
 Fri Jun 26 07:53:56 2015  Eric Wong  <e@8...>
 
 	* enum.c (enum_minmax): simplify return value creation
Index: test/ruby/test_transcode.rb
===================================================================
--- test/ruby/test_transcode.rb	(revision 51036)
+++ test/ruby/test_transcode.rb	(revision 51037)
@@ -2091,4 +2091,22 @@ class TestTranscode < Test::Unit::TestCa https://github.com/ruby/ruby/blob/trunk/test/ruby/test_transcode.rb#L2091
     assert_equal("\x00\x00\xFE\xFF\x00\x00\x00t\x00\x00\x00e\x00\x00\x00s\x00\x00\x00t", result.b, bug)
     end;
   end
+
+  def test_loading_race
+    assert_separately([], <<-'end;') #do
+      bug11277 = '[ruby-dev:49106] [Bug #11277]'
+      num = 2
+      th = (0...num).map do |i|
+        Thread.new {"\u3042".encode("EUC-JP")}
+      end
+      result = nil
+      assert_warning("", bug11277) do
+        assert_nothing_raised(Encoding::ConverterNotFoundError, bug11277) do
+          result = th.map(&:value)
+        end
+      end
+      expected = "\xa4\xa2".force_encoding(Encoding::EUC_JP)
+      assert_equal([expected]*num, result, bug11277)
+    end;
+  end
 end
Index: transcode.c
===================================================================
--- transcode.c	(revision 51036)
+++ transcode.c	(revision 51037)
@@ -370,15 +370,12 @@ load_transcoder_entry(transcoder_entry_t https://github.com/ruby/ruby/blob/trunk/transcode.c#L370
         char *const path = RSTRING_PTR(fn);
 	const int safe = rb_safe_level();
 
-        entry->lib = NULL;
-
         memcpy(path, transcoder_lib_prefix, sizeof(transcoder_lib_prefix) - 1);
         memcpy(path + sizeof(transcoder_lib_prefix) - 1, lib, len);
         rb_str_set_len(fn, total_len);
         FL_UNSET(fn, FL_TAINT);
         OBJ_FREEZE(fn);
-        if (!rb_require_safe(fn, safe > 3 ? 3 : safe))
-            return NULL;
+        rb_require_safe(fn, safe > 3 ? 3 : safe);
     }
 
     if (entry->transcoder)

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]