shell bypass 403

GrazzMean Shell

Uname: Linux web3.us.cloudlogin.co 5.10.226-xeon-hst #2 SMP Fri Sep 13 12:28:44 UTC 2024 x86_64
Software: Apache
PHP version: 8.1.31 [ PHP INFO ] PHP os: Linux
Server Ip: 162.210.96.117
Your Ip: 3.145.6.179
User: edustar (269686) | Group: tty (888)
Safe Mode: OFF
Disable Function:
NONE

name : p358-p374.patch
From c31e7c1e8b2895ef33204938487597e2b3acaaf7 Mon Sep 17 00:00:00 2001
From: nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Fri, 2 Mar 2012 02:45:35 +0000
Subject: [PATCH 01/19] merge revision(s) 25230,34866:

	* marshal.c (struct {dump,load}_arg): manage with dfree, instead
	  of using local variable which may be moved by context switch.
	  [ruby-dev:39425]

	* marshal.c (mark_dump_arg): mark destination string.  patch by
	  Vit Ondruch.  [Bug #4339]

	* marshal.c (clear_dump_arg, clear_load_arg): clean up also data
	  tables as same as symbols tables.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@34867 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog                 |  14 +++++
 marshal.c                 | 145 +++++++++++++++++++++++-----------------------
 test/ruby/test_marshal.rb |  28 +++++++++
 version.h                 |  10 ++--
 4 files changed, 120 insertions(+), 77 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index a09237e..352a30f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+Fri Mar  2 11:44:33 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
+
+	* marshal.c (mark_dump_arg): mark destination string.  patch by
+	  Vit Ondruch.  [Bug #4339]
+
+	* marshal.c (clear_dump_arg, clear_load_arg): clean up also data
+	  tables as same as symbols tables.
+
+Fri Mar  2 11:44:33 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
+
+	* marshal.c (struct {dump,load}_arg): manage with dfree, instead
+	  of using local variable which may be moved by context switch.
+	  [ruby-dev:39425]
+
 Wed Feb  8 14:06:59 2012  Hiroshi Nakamura  <nahi@ruby-lang.org>
 
 	* ext/openssl/ossl_ssl.c: Add SSL constants and allow to unset SSL
diff --git a/marshal.c b/marshal.c
index 35e0d60..632f6ca 100644
--- a/marshal.c
+++ b/marshal.c
@@ -85,12 +85,10 @@
 static ID s_getc, s_read, s_write, s_binmode;
 
 struct dump_arg {
-    VALUE obj;
     VALUE str, dest;
     st_table *symbols;
     st_table *data;
     int taint;
-    VALUE wrapper;
 };
 
 struct dump_call_arg {
@@ -104,20 +102,31 @@ struct dump_call_arg {
     struct dump_arg *arg;
     ID sym;
 {
-    if (!DATA_PTR(arg->wrapper)) {
+    if (!arg->symbols) {
         rb_raise(rb_eRuntimeError, "Marshal.dump reentered at %s",
 		 rb_id2name(sym));
     }
 }
 
+static void clear_dump_arg _((struct dump_arg *arg));
+
 static void
 mark_dump_arg(ptr)
     void *ptr;
 {
     struct dump_arg *p = ptr;
-    if (!ptr)
+    if (!p->symbols)
         return;
     rb_mark_set(p->data);
+    rb_gc_mark(p->str);
+}
+
+static void
+free_dump_arg(ptr)
+    void *ptr;
+{
+    clear_dump_arg(ptr);
+    xfree(ptr);
 }
 
 static VALUE
@@ -699,32 +708,18 @@ class2path(klass)
     }
 }
 
-static VALUE
-dump(arg)
-    struct dump_call_arg *arg;
-{
-    w_object(arg->obj, arg->arg, arg->limit);
-    if (arg->arg->dest) {
-	rb_io_write(arg->arg->dest, arg->arg->str);
-	rb_str_resize(arg->arg->str, 0);
-    }
-    return 0;
-}
-
-static VALUE
-dump_ensure(arg)
+static void
+clear_dump_arg(arg)
     struct dump_arg *arg;
 {
-    if (!DATA_PTR(arg->wrapper)) return 0;
+    if (!arg->symbols) return;
     st_free_table(arg->symbols);
+    arg->symbols = 0;
     st_free_table(arg->data);
-    DATA_PTR(arg->wrapper) = 0;
-    arg->wrapper = 0;
+    arg->data = 0;
     if (arg->taint) {
 	OBJ_TAINT(arg->str);
     }
-
-    return 0;
 }
 
 /*
@@ -760,8 +755,8 @@ class2path(klass)
 {
     VALUE obj, port, a1, a2;
     int limit = -1;
-    struct dump_arg arg;
-    struct dump_call_arg c_arg;
+    struct dump_arg *arg;
+    VALUE wrapper;
 
     port = Qnil;
     rb_scan_args(argc, argv, "12", &obj, &a1, &a2);
@@ -775,37 +770,40 @@ class2path(klass)
 	else if (NIL_P(a1)) goto type_error;
 	else port = a1;
     }
-    arg.dest = 0;
-    arg.symbols = st_init_numtable();
-    arg.data    = st_init_numtable();
-    arg.taint   = Qfalse;
-    arg.str = rb_str_buf_new(0);
-    RBASIC(arg.str)->klass = 0;
-    arg.wrapper = Data_Wrap_Struct(rb_cData, mark_dump_arg, 0, &arg);
+    wrapper = Data_Make_Struct(rb_cData, struct dump_arg, mark_dump_arg, free_dump_arg, arg);
+    arg->dest = 0;
+    arg->symbols = st_init_numtable();
+    arg->data    = st_init_numtable();
+    arg->taint   = Qfalse;
+    arg->str = rb_str_buf_new(0);
+    RBASIC(arg->str)->klass = 0;
     if (!NIL_P(port)) {
 	if (!rb_respond_to(port, s_write)) {
 	  type_error:
 	    rb_raise(rb_eTypeError, "instance of IO needed");
 	}
-	arg.dest = port;
+	arg->dest = port;
 	if (rb_respond_to(port, s_binmode)) {
 	    rb_funcall2(port, s_binmode, 0, 0);
-	    check_dump_arg(&arg, s_binmode);
+	    check_dump_arg(arg, s_binmode);
 	}
     }
     else {
-	port = arg.str;
+	port = arg->str;
     }
 
-    c_arg.obj   = obj;
-    c_arg.arg   = &arg;
-    c_arg.limit = limit;
+    w_byte(MARSHAL_MAJOR, arg);
+    w_byte(MARSHAL_MINOR, arg);
 
-    w_byte(MARSHAL_MAJOR, &arg);
-    w_byte(MARSHAL_MINOR, &arg);
+    w_object(obj, arg, limit);
+    if (arg->dest) {
+	rb_io_write(arg->dest, arg->str);
+	rb_str_resize(arg->str, 0);
+    }
 
-    rb_ensure(dump, (VALUE)&c_arg, dump_ensure, (VALUE)&arg);
-    RBASIC(arg.str)->klass = rb_cString;
+    RBASIC(arg->str)->klass = rb_cString;
+    clear_dump_arg(arg);
+    RB_GC_GUARD(wrapper);
 
     return port;
 }
@@ -817,7 +815,6 @@ struct load_arg {
     st_table *data;
     VALUE proc;
     int taint;
-    VALUE wrapper;
 };
 
 static void
@@ -825,22 +822,31 @@ struct load_arg {
     struct load_arg *arg;
     ID sym;
 {
-    if (!DATA_PTR(arg->wrapper)) {
+    if (!arg->symbols) {
         rb_raise(rb_eRuntimeError, "Marshal.load reentered at %s",
 		 rb_id2name(sym));
     }
 }
 
+static void clear_load_arg _((struct load_arg *arg));
+
 static void
 mark_load_arg(ptr)
     void *ptr;
 {
     struct load_arg *p = ptr;
-    if (!ptr)
+    if (!p->symbols)
         return;
     rb_mark_tbl(p->data);
 }
 
+static void
+free_load_arg(void *ptr)
+{
+    clear_load_arg(ptr);
+    xfree(ptr);
+}
+
 static VALUE r_object _((struct load_arg *arg));
 
 static int
@@ -1415,23 +1421,15 @@ struct load_arg {
     return r_object0(arg, arg->proc, 0, Qnil);
 }
 
-static VALUE
-load(arg)
-    struct load_arg *arg;
-{
-    return r_object(arg);
-}
-
-static VALUE
-load_ensure(arg)
+static void
+clear_load_arg(arg)
     struct load_arg *arg;
 {
-    if (!DATA_PTR(arg->wrapper)) return 0;
+    if (!arg->symbols) return;
     st_free_table(arg->symbols);
+    arg->symbols = 0;
     st_free_table(arg->data);
-    DATA_PTR(arg->wrapper) = 0;
-    arg->wrapper = 0;
-    return 0;
+    arg->data = 0;
 }
 
 /*
@@ -1452,8 +1450,8 @@ struct load_arg {
 {
     VALUE port, proc;
     int major, minor, taint = Qfalse;
-    VALUE v;
-    struct load_arg arg;
+    VALUE v, wrapper;
+    struct load_arg *arg;
 
     rb_scan_args(argc, argv, "11", &port, &proc);
     v = rb_check_string_type(port);
@@ -1470,17 +1468,18 @@ struct load_arg {
     else {
 	rb_raise(rb_eTypeError, "instance of IO needed");
     }
-    arg.src = port;
-    arg.offset = 0;
-    arg.symbols = st_init_numtable();
-    arg.data    = st_init_numtable();
-    arg.proc = 0;
-    arg.wrapper = Data_Wrap_Struct(rb_cData, mark_load_arg, 0, &arg);
-    arg.taint = taint;
-
-    major = r_byte(&arg);
-    minor = r_byte(&arg);
+    wrapper = Data_Make_Struct(rb_cData, struct load_arg, mark_load_arg, free_load_arg, arg);
+    arg->src = port;
+    arg->offset = 0;
+    arg->symbols = st_init_numtable();
+    arg->data    = st_init_numtable();
+    arg->proc = 0;
+    arg->taint = taint;
+
+    major = r_byte(arg);
+    minor = r_byte(arg);
     if (major != MARSHAL_MAJOR || minor > MARSHAL_MINOR) {
+	clear_load_arg(arg);
 	rb_raise(rb_eTypeError, "incompatible marshal file format (can't be read)\n\
 \tformat version %d.%d required; %d.%d given",
 		 MARSHAL_MAJOR, MARSHAL_MINOR, major, minor);
@@ -1491,8 +1490,10 @@ struct load_arg {
 		MARSHAL_MAJOR, MARSHAL_MINOR, major, minor);
     }
 
-    if (!NIL_P(proc)) arg.proc = proc;
-    v = rb_ensure(load, (VALUE)&arg, load_ensure, (VALUE)&arg);
+    if (!NIL_P(proc)) arg->proc = proc;
+    v = r_object(arg);
+    clear_load_arg(arg);
+    RB_GC_GUARD(wrapper);
 
     return v;
 }
diff --git a/test/ruby/test_marshal.rb b/test/ruby/test_marshal.rb
index 5ae521e..d40c9da 100644
--- a/test/ruby/test_marshal.rb
+++ b/test/ruby/test_marshal.rb
@@ -72,6 +72,34 @@ def test_too_long_string
     assert_equal("marshal data too short", e.message)
   end
 
+  class DumpTest
+    def marshal_dump
+      loop { Thread.pass }
+    end
+  end
+
+  class LoadTest
+    def marshal_dump
+      nil
+    end
+    def marshal_load(obj)
+      loop { Thread.pass }
+    end
+  end
+
+  def test_context_switch
+    o = DumpTest.new
+    Thread.new { Marshal.dump(o) }
+    GC.start
+    assert(true, '[ruby-dev:39425]')
+
+    o = LoadTest.new
+    m = Marshal.dump(o)
+    Thread.new { Marshal.load(m) }
+    GC.start
+    assert(true, '[ruby-dev:39425]')
+  end
+
   def test_taint
     x = Object.new
     x.taint
diff --git a/version.h b/version.h
index d6f16f5..1f2a143 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-02-08"
+#define RUBY_RELEASE_DATE "2012-03-02"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120208
-#define RUBY_PATCHLEVEL 358
+#define RUBY_RELEASE_CODE 20120302
+#define RUBY_PATCHLEVEL 359
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
-#define RUBY_RELEASE_MONTH 2
-#define RUBY_RELEASE_DAY 8
+#define RUBY_RELEASE_MONTH 3
+#define RUBY_RELEASE_DAY 2
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From acc55c25c587fef5c7327c5912f3aa50a969ec34 Mon Sep 17 00:00:00 2001
From: nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Tue, 6 Mar 2012 03:06:11 +0000
Subject: [PATCH 02/19] merge revision(s) 34919:

	* lib/yaml/rubytypes.rb (Exception.yaml_new): fix bug that causes
	  YAML serialization problem for Exception.
	  Exception#initialize doesn't use visible instance variable for
	  the exception message, so call the method with the message.
	  patched by Jingwen Owen Ou <jingweno AT gmail.com>.
	  http://github.com/ruby/ruby/pull/41


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@34920 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog                   |  9 ++++++++
 lib/yaml/rubytypes.rb       |  3 ++-
 test/yaml/test_exception.rb | 52 +++++++++++++++++++++++++++++++++++++++++++++
 version.h                   |  8 +++----
 4 files changed, 67 insertions(+), 5 deletions(-)
 create mode 100644 test/yaml/test_exception.rb

diff --git a/ChangeLog b/ChangeLog
index 352a30f..886be66 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+Tue Mar  6 12:05:42 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
+
+	* lib/yaml/rubytypes.rb (Exception.yaml_new): fix bug that causes
+	  YAML serialization problem for Exception.
+	  Exception#initialize doesn't use visible instance variable for
+	  the exception message, so call the method with the message.
+	  patched by Jingwen Owen Ou <jingweno AT gmail.com>.
+	  http://github.com/ruby/ruby/pull/41
+
 Fri Mar  2 11:44:33 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 
 	* marshal.c (mark_dump_arg): mark destination string.  patch by
diff --git a/lib/yaml/rubytypes.rb b/lib/yaml/rubytypes.rb
index 35b7191..55d59fa 100644
--- a/lib/yaml/rubytypes.rb
+++ b/lib/yaml/rubytypes.rb
@@ -117,7 +117,8 @@ def to_yaml( opts = {} )
 class Exception
     yaml_as "tag:ruby.yaml.org,2002:exception"
     def Exception.yaml_new( klass, tag, val )
-        o = YAML.object_maker( klass, { 'mesg' => val.delete( 'message' ) } )
+        o = klass.allocate
+        Exception.instance_method(:initialize).bind(o).call(val.delete('message'))
         val.each_pair do |k,v|
             o.instance_variable_set("@#{k}", v)
         end
diff --git a/test/yaml/test_exception.rb b/test/yaml/test_exception.rb
new file mode 100644
index 0000000..1dc3044
--- /dev/null
+++ b/test/yaml/test_exception.rb
@@ -0,0 +1,52 @@
+require 'test/unit'
+require 'yaml'
+
+module Syck
+  class TestException < Test::Unit::TestCase
+    class Wups < Exception
+      attr_reader :foo, :bar
+      def initialize *args
+        super
+        @foo = 1
+        @bar = 2
+      end
+
+      def ==(other)
+        self.class == other.class and
+          self.message == other.message and
+          self.backtrace == other.backtrace
+      end
+    end
+
+    def setup
+      @wups = Wups.new('test_message')
+    end
+
+    def test_to_yaml
+      w = YAML.load(@wups.to_yaml)
+      assert_equal @wups, w
+      assert_equal 1, w.foo
+      assert_equal 2, w.bar
+    end
+
+    def test_dump
+      w = YAML.load(@wups.to_yaml)
+      assert_equal @wups, w
+      assert_equal 1, w.foo
+      assert_equal 2, w.bar
+    end
+
+    def test_to_yaml_properties
+      class << @wups
+        def to_yaml_properties
+          [:@foo]
+        end
+      end
+
+      w = YAML.load(YAML.dump(@wups))
+      assert_equal @wups, w
+      assert_equal 1, w.foo
+      assert_nil w.bar
+    end
+  end
+end
diff --git a/version.h b/version.h
index 1f2a143..13e41e8 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-03-02"
+#define RUBY_RELEASE_DATE "2012-03-06"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120302
-#define RUBY_PATCHLEVEL 359
+#define RUBY_RELEASE_CODE 20120306
+#define RUBY_PATCHLEVEL 360
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
 #define RUBY_RELEASE_MONTH 3
-#define RUBY_RELEASE_DAY 2
+#define RUBY_RELEASE_DAY 6
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From 698d21a276f862da823c7a6536f9c15afe602e19 Mon Sep 17 00:00:00 2001
From: nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Sat, 14 Apr 2012 09:52:10 +0000
Subject: [PATCH 03/19] merge revision(s) 35325:

	* bignum.c (rb_big2str0): prevent working clone from
	  GC. [exerb-dev:0578].  patched by MURASE Masamitsu
	  <masamitsu.murase AT gmail.com> at [exerb-dev:0580]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@35327 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog |  6 ++++++
 bignum.c  |  3 ++-
 version.h | 10 +++++-----
 3 files changed, 13 insertions(+), 6 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 886be66..fae1bb1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Sat Apr 14 18:51:41 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
+
+	* bignum.c (rb_big2str0): prevent working clone from
+	  GC. [exerb-dev:0578].  patched by MURASE Masamitsu
+	  <masamitsu.murase AT gmail.com> at [exerb-dev:0580]
+
 Tue Mar  6 12:05:42 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 
 	* lib/yaml/rubytypes.rb (Exception.yaml_new): fix bug that causes
diff --git a/bignum.c b/bignum.c
index 0c5ae3e..77697ae 100644
--- a/bignum.c
+++ b/bignum.c
@@ -772,7 +772,7 @@
     int base;
     int trim;
 {
-    volatile VALUE t;
+    VALUE t;
     BDIGIT *ds;
     long i, j, hbase;
     VALUE ss;
@@ -847,6 +847,7 @@
 	    if (trim && i == 0 && num == 0) break;
 	}
     }
+    RB_GC_GUARD(t);
     if (trim) {while (s[j] == '0') j++;}
     i = RSTRING(ss)->len - j;
     if (RBIGNUM(x)->sign) {
diff --git a/version.h b/version.h
index 13e41e8..a2b4487 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-03-06"
+#define RUBY_RELEASE_DATE "2012-04-14"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120306
-#define RUBY_PATCHLEVEL 360
+#define RUBY_RELEASE_CODE 20120414
+#define RUBY_PATCHLEVEL 361
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
-#define RUBY_RELEASE_MONTH 3
-#define RUBY_RELEASE_DAY 6
+#define RUBY_RELEASE_MONTH 4
+#define RUBY_RELEASE_DAY 14
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From a4e76099bf44ae7d75bd24c3c8233d710e590fac Mon Sep 17 00:00:00 2001
From: nobu <nobu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Fri, 11 May 2012 05:09:58 +0000
Subject: [PATCH 04/19] 	* ext/bigdecimal/bigdecimal.c (PUSH): to prevent VALUE
 from GC, 	  must not cast it to unsigned long, which may be shorter than
 	  VALUE, and the result can be mere garbage.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@35619 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog                   |  6 ++++++
 ext/bigdecimal/bigdecimal.c |  2 +-
 version.h                   | 10 +++++-----
 3 files changed, 12 insertions(+), 6 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index fae1bb1..9201d3e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Fri May 11 14:09:48 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
+
+	* ext/bigdecimal/bigdecimal.c (PUSH): to prevent VALUE from GC,
+	  must not cast it to unsigned long, which may be shorter than
+	  VALUE, and the result can be mere garbage.
+
 Sat Apr 14 18:51:41 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 
 	* bignum.c (rb_big2str0): prevent working clone from
diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c
index 7846c0d..16be520 100644
--- a/ext/bigdecimal/bigdecimal.c
+++ b/ext/bigdecimal/bigdecimal.c
@@ -32,7 +32,7 @@
 
 /* MACRO's to guard objects from GC by keeping them in stack */
 #define ENTER(n) volatile VALUE vStack[n];int iStack=0
-#define PUSH(x)  vStack[iStack++] = (unsigned long)(x);
+#define PUSH(x)  vStack[iStack++] = (VALUE)(x);
 #define SAVE(p)  PUSH(p->obj);
 #define GUARD_OBJ(p,y) {p=y;SAVE(p);}
 
diff --git a/version.h b/version.h
index a2b4487..9dcae40 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-04-14"
+#define RUBY_RELEASE_DATE "2012-05-11"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120414
-#define RUBY_PATCHLEVEL 361
+#define RUBY_RELEASE_CODE 20120511
+#define RUBY_PATCHLEVEL 362
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
-#define RUBY_RELEASE_MONTH 4
-#define RUBY_RELEASE_DAY 14
+#define RUBY_RELEASE_MONTH 5
+#define RUBY_RELEASE_DAY 11
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From b0901e0f63ed056c9c95273052a029930cad87af Mon Sep 17 00:00:00 2001
From: knu <knu@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Mon, 21 May 2012 07:35:21 +0000
Subject: [PATCH 05/19] * ext/syslog/syslog.c (mSyslog_inspect): Make sure self
 is a   module before calling rb_class2name().

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@35746 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog           | 5 +++++
 ext/syslog/syslog.c | 2 ++
 2 files changed, 7 insertions(+)

diff --git a/ChangeLog b/ChangeLog
index 9201d3e..3c477b4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Mon May 21 16:29:47 2012  Akinori MUSHA  <knu@iDaemons.org>
+
+	* ext/syslog/syslog.c (mSyslog_inspect): Make sure self is a
+	  module before calling rb_class2name().
+
 Fri May 11 14:09:48 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 
 	* ext/bigdecimal/bigdecimal.c (PUSH): to prevent VALUE from GC,
diff --git a/ext/syslog/syslog.c b/ext/syslog/syslog.c
index ecc4931..1372cb7 100644
--- a/ext/syslog/syslog.c
+++ b/ext/syslog/syslog.c
@@ -168,6 +168,8 @@ static VALUE mSyslog_inspect(VALUE self)
 {
     char buf[1024];
 
+    Check_Type(self, T_MODULE);
+
     if (syslog_opened) {
 	snprintf(buf, sizeof(buf),
 	  "<#%s: opened=true, ident=\"%s\", options=%d, facility=%d, mask=%d>",
-- 
1.8.5.1


From c869f69c3543552c0ffa27628d587bae460b6213 Mon Sep 17 00:00:00 2001
From: svn <svn@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Mon, 21 May 2012 07:35:26 +0000
Subject: [PATCH 06/19] * 2012-05-21

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@35747 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 version.h | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/version.h b/version.h
index 9dcae40..927ae53 100644
--- a/version.h
+++ b/version.h
@@ -1,7 +1,7 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-05-11"
+#define RUBY_RELEASE_DATE "2012-05-21"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120511
+#define RUBY_RELEASE_CODE 20120521
 #define RUBY_PATCHLEVEL 362
 
 #define RUBY_VERSION_MAJOR 1
@@ -9,7 +9,7 @@
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
 #define RUBY_RELEASE_MONTH 5
-#define RUBY_RELEASE_DAY 11
+#define RUBY_RELEASE_DAY 21
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From 69883b3ee6502cc210e598fd440b65e20629cd9c Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Wed, 6 Jun 2012 05:20:08 +0000
Subject: [PATCH 07/19] merge revision(s) 33611: 	*
 lib/webrick/utils.rb: fix fcntl call. 	* lib/drb/unix.rb: ditto.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@35939 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog            |  6 ++++++
 lib/drb/unix.rb      |  2 +-
 lib/webrick/utils.rb |  2 +-
 version.h            | 10 +++++-----
 4 files changed, 13 insertions(+), 7 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 3c477b4..dd5808a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Wed Jun  6 14:06:02 2012  Tanaka Akira  <akr@fsij.org>
+
+	* lib/webrick/utils.rb: fix fcntl call.
+
+	* lib/drb/unix.rb: ditto.
+
 Mon May 21 16:29:47 2012  Akinori MUSHA  <knu@iDaemons.org>
 
 	* ext/syslog/syslog.c (mSyslog_inspect): Make sure self is a
diff --git a/lib/drb/unix.rb b/lib/drb/unix.rb
index 57feed8..90ca292 100644
--- a/lib/drb/unix.rb
+++ b/lib/drb/unix.rb
@@ -100,7 +100,7 @@ def accept
     end
 
     def set_sockopt(soc)
-      soc.fcntl(Fcntl::F_SETFL, Fcntl::FD_CLOEXEC) if defined? Fcntl::FD_CLOEXEC
+      soc.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC) if defined? Fcntl::FD_CLOEXEC
     end
   end
 
diff --git a/lib/webrick/utils.rb b/lib/webrick/utils.rb
index cf9da6f..1c29ef5 100644
--- a/lib/webrick/utils.rb
+++ b/lib/webrick/utils.rb
@@ -29,7 +29,7 @@ def set_non_blocking(io)
 
     def set_close_on_exec(io)
       if defined?(Fcntl::FD_CLOEXEC)
-        io.fcntl(Fcntl::FD_CLOEXEC, 1)
+        io.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)
       end
     end
     module_function :set_close_on_exec
diff --git a/version.h b/version.h
index 927ae53..d084c57 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-05-21"
+#define RUBY_RELEASE_DATE "2012-06-06"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120521
-#define RUBY_PATCHLEVEL 362
+#define RUBY_RELEASE_CODE 20120606
+#define RUBY_PATCHLEVEL 363
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
-#define RUBY_RELEASE_MONTH 5
-#define RUBY_RELEASE_DAY 21
+#define RUBY_RELEASE_MONTH 6
+#define RUBY_RELEASE_DAY 6
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From 996e9cf4e9c78c4bf8fdbf937f3984e0b2eb6e40 Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Wed, 6 Jun 2012 05:34:55 +0000
Subject: [PATCH 08/19] @nobu you must run make test-all _before_ you check in.

reverting revision r34920 because it fails.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@35940 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 lib/yaml/rubytypes.rb       |  3 +--
 test/yaml/test_exception.rb | 52 ---------------------------------------------
 version.h                   |  2 +-
 3 files changed, 2 insertions(+), 55 deletions(-)
 delete mode 100644 test/yaml/test_exception.rb

diff --git a/lib/yaml/rubytypes.rb b/lib/yaml/rubytypes.rb
index 55d59fa..35b7191 100644
--- a/lib/yaml/rubytypes.rb
+++ b/lib/yaml/rubytypes.rb
@@ -117,8 +117,7 @@ def to_yaml( opts = {} )
 class Exception
     yaml_as "tag:ruby.yaml.org,2002:exception"
     def Exception.yaml_new( klass, tag, val )
-        o = klass.allocate
-        Exception.instance_method(:initialize).bind(o).call(val.delete('message'))
+        o = YAML.object_maker( klass, { 'mesg' => val.delete( 'message' ) } )
         val.each_pair do |k,v|
             o.instance_variable_set("@#{k}", v)
         end
diff --git a/test/yaml/test_exception.rb b/test/yaml/test_exception.rb
deleted file mode 100644
index 1dc3044..0000000
--- a/test/yaml/test_exception.rb
+++ /dev/null
@@ -1,52 +0,0 @@
-require 'test/unit'
-require 'yaml'
-
-module Syck
-  class TestException < Test::Unit::TestCase
-    class Wups < Exception
-      attr_reader :foo, :bar
-      def initialize *args
-        super
-        @foo = 1
-        @bar = 2
-      end
-
-      def ==(other)
-        self.class == other.class and
-          self.message == other.message and
-          self.backtrace == other.backtrace
-      end
-    end
-
-    def setup
-      @wups = Wups.new('test_message')
-    end
-
-    def test_to_yaml
-      w = YAML.load(@wups.to_yaml)
-      assert_equal @wups, w
-      assert_equal 1, w.foo
-      assert_equal 2, w.bar
-    end
-
-    def test_dump
-      w = YAML.load(@wups.to_yaml)
-      assert_equal @wups, w
-      assert_equal 1, w.foo
-      assert_equal 2, w.bar
-    end
-
-    def test_to_yaml_properties
-      class << @wups
-        def to_yaml_properties
-          [:@foo]
-        end
-      end
-
-      w = YAML.load(YAML.dump(@wups))
-      assert_equal @wups, w
-      assert_equal 1, w.foo
-      assert_nil w.bar
-    end
-  end
-end
diff --git a/version.h b/version.h
index d084c57..3b58c4e 100644
--- a/version.h
+++ b/version.h
@@ -2,7 +2,7 @@
 #define RUBY_RELEASE_DATE "2012-06-06"
 #define RUBY_VERSION_CODE 187
 #define RUBY_RELEASE_CODE 20120606
-#define RUBY_PATCHLEVEL 363
+#define RUBY_PATCHLEVEL 364
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
-- 
1.8.5.1


From 1acfb03370704aee624b7a1e5ccf4776f40f2895 Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Wed, 6 Jun 2012 05:47:45 +0000
Subject: [PATCH 09/19] merge revision(s) 28324: 	* bignum.c
 (rb_big2dbl), test/ruby/test_bignum.rb (test_to_f): 	  A negative Bignum
 out of Float range should be converted to -Infinity. 	  [ruby-core:30492]
 [Bug #3362]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@35941 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog                | 15 ++++++---------
 bignum.c                 |  5 ++++-
 test/ruby/test_bignum.rb |  6 ++++++
 version.h                |  2 +-
 4 files changed, 17 insertions(+), 11 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index dd5808a..69c7ced 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Wed Jun  6 14:44:13 2012  Kenta Murata  <mrkn@mrkn.jp>
+
+	* bignum.c (rb_big2dbl), test/ruby/test_bignum.rb (test_to_f):
+	  A negative Bignum out of Float range should be converted to -Infinity.
+	  [ruby-core:30492] [Bug #3362]
+
 Wed Jun  6 14:06:02 2012  Tanaka Akira  <akr@fsij.org>
 
 	* lib/webrick/utils.rb: fix fcntl call.
@@ -21,15 +27,6 @@ Sat Apr 14 18:51:41 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 	  GC. [exerb-dev:0578].  patched by MURASE Masamitsu
 	  <masamitsu.murase AT gmail.com> at [exerb-dev:0580]
 
-Tue Mar  6 12:05:42 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
-
-	* lib/yaml/rubytypes.rb (Exception.yaml_new): fix bug that causes
-	  YAML serialization problem for Exception.
-	  Exception#initialize doesn't use visible instance variable for
-	  the exception message, so call the method with the message.
-	  patched by Jingwen Owen Ou <jingweno AT gmail.com>.
-	  http://github.com/ruby/ruby/pull/41
-
 Fri Mar  2 11:44:33 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 
 	* marshal.c (mark_dump_arg): mark destination string.  patch by
diff --git a/bignum.c b/bignum.c
index 77697ae..6c0bf65 100644
--- a/bignum.c
+++ b/bignum.c
@@ -1069,7 +1069,10 @@
 
     if (isinf(d)) {
 	rb_warn("Bignum out of Float range");
-	d = HUGE_VAL;
+	if (d < 0.0)
+	    d = -HUGE_VAL;
+	else
+	    d = HUGE_VAL;
     }
     return d;
 }
diff --git a/test/ruby/test_bignum.rb b/test/ruby/test_bignum.rb
index 99c5952..a0405ca 100644
--- a/test/ruby/test_bignum.rb
+++ b/test/ruby/test_bignum.rb
@@ -103,4 +103,10 @@ def test_too_big_to_s
     e = assert_raise(RangeError) {(1 << big).to_s}
     assert_match(/too big to convert/, e.message)
   end
+
+  def test_to_f
+    inf = 1 / 0.0
+    assert_equal(inf,  (1  << 65536).to_f)
+    assert_equal(-inf, (-1 << 65536).to_f) # [ruby-core:30492] [Bug #3362]
+  end
 end
diff --git a/version.h b/version.h
index 3b58c4e..3d64d07 100644
--- a/version.h
+++ b/version.h
@@ -2,7 +2,7 @@
 #define RUBY_RELEASE_DATE "2012-06-06"
 #define RUBY_VERSION_CODE 187
 #define RUBY_RELEASE_CODE 20120606
-#define RUBY_PATCHLEVEL 364
+#define RUBY_PATCHLEVEL 365
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
-- 
1.8.5.1


From d18b653719687756c82c7c800dee5e91b388fefd Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Wed, 6 Jun 2012 06:16:25 +0000
Subject: [PATCH 10/19] merge revision(s) 23432: 	* eval.c
 (rb_thread_join), ext/thread/thread.c (wake_one): adjusts 	  targets of
 rest waiting threads to join.  [ruby-core:23457]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@35942 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog                  |  5 ++++
 eval.c                     | 10 ++++++++
 ext/thread/thread.c        | 26 +++++++++++++++++--
 test/thread/test_thread.rb | 63 ++++++++++++++++++++++++++++++++++++++++++++++
 version.h                  |  2 +-
 5 files changed, 103 insertions(+), 3 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 69c7ced..8956096 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Wed Jun  6 15:09:00 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
+
+	* eval.c (rb_thread_join), ext/thread/thread.c (wake_one): adjusts
+	  targets of rest waiting threads to join.  [ruby-core:23457]
+
 Wed Jun  6 14:44:13 2012  Kenta Murata  <mrkn@mrkn.jp>
 
 	* bignum.c (rb_big2dbl), test/ruby/test_bignum.rb (test_to_f):
diff --git a/test/thread/test_thread.rb b/test/thread/test_thread.rb
index 699f4fe..e3246d1 100644
--- a/test/thread/test_thread.rb
+++ b/test/thread/test_thread.rb
@@ -86,5 +86,68 @@ def test_queue_rescue
         assert_nothing_raised("[ruby-dev:37545]") {assert_equal(1, queue.pop)}
         assert(queue.empty?)
     end
+
+  # This test checks that a thread in Mutex#lock which is raised is
+  # completely removed from the wait_list of the mutex
+  def test_mutex_exception_handling
+    m = Mutex.new
+    m.lock
+
+    sleeping = false
+    t = Thread.new do
+      begin
+        m.lock
+      rescue
+      end
+
+      sleeping = true
+      # Keep that thread alive: if the thread returns, the test method
+      # won't be able to check that +m+ has not been taken (dead mutex
+      # owners are ignored)
+      sleep
+    end
+
+    # Wait for t to wait for the mutex and raise it
+    while true
+      sleep 0.1
+      break if t.stop?
+    end
+    t.raise ArgumentError
+    assert(t.alive? || sleeping)
+
+    # Wait for +t+ to reach the sleep
+    while true
+      sleep 0.1
+      break if t.stop?
+    end
+
+    # Now unlock. The mutex should be free, so Mutex#unlock should return nil
+    assert(! m.unlock)
+  end
+
+  def test_mutex_join
+    m = Mutex.new
+    m.lock
+    wt2 = Thread.new do
+      m.lock
+      sleep 0.5
+      m.unlock
+    end
+
+    # Ensure wt2 is waiting on m
+    sleep 0.1
+
+    wt1 = Thread.new do
+      m.lock
+      m.unlock
+    end
+    # Ensure wt1 is waiting on m
+    sleep 0.1
+
+    # Give it to wt2
+    m.unlock
+
+    assert_nothing_raised {wt1.join}
+  end
 end
 
diff --git a/version.h b/version.h
index 3d64d07..293cd6e 100644
--- a/version.h
+++ b/version.h
@@ -2,7 +2,7 @@
 #define RUBY_RELEASE_DATE "2012-06-06"
 #define RUBY_VERSION_CODE 187
 #define RUBY_RELEASE_CODE 20120606
-#define RUBY_PATCHLEVEL 365
+#define RUBY_PATCHLEVEL 366
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
-- 
1.8.5.1


From 15fbb87b594a47ed622829cfdd6891eb97ea4726 Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Thu, 7 Jun 2012 10:05:59 +0000
Subject: [PATCH 11/19] merge revision(s) 30993: 	*
 ext/bigdecimal/bigdecimal.c (VpMemAlloc): Fixes a bug reported by Drew Yao
 <ayao at apple.com>

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@35953 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog                   | 5 +++++
 ext/bigdecimal/bigdecimal.c | 8 ++++----
 version.h                   | 8 ++++----
 3 files changed, 13 insertions(+), 8 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 8956096..3ac2f87 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Thu Jun  7 19:00:35 2012  Kenta Murata <mrkn@mrkn.jp>
+
+	* ext/bigdecimal/bigdecimal.c (VpMemAlloc): Fixes a bug reported
+	  by Drew Yao <ayao at apple.com>
+
 Wed Jun  6 15:09:00 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 
 	* eval.c (rb_thread_join), ext/thread/thread.c (wake_one): adjusts
diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c
index 16be520..7ebb3f7 100644
--- a/ext/bigdecimal/bigdecimal.c
+++ b/ext/bigdecimal/bigdecimal.c
@@ -2032,11 +2032,11 @@
 VP_EXPORT void *
 VpMemAlloc(U_LONG mb)
 {
-    void *p = xmalloc((unsigned int)mb);
-    if(!p) {
-        VpException(VP_EXCEPTION_MEMORY,"failed to allocate memory",1);
+    void *p = xmalloc(mb);
+    if (!p) {
+        VpException(VP_EXCEPTION_MEMORY, "failed to allocate memory", 1);
     }
-    memset(p,0,mb);
+    memset(p, 0, mb);
 #ifdef _DEBUG
     gnAlloc++; /* Count allocation call */
 #endif /* _DEBUG */
diff --git a/version.h b/version.h
index 293cd6e..7a53a5c 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-06-06"
+#define RUBY_RELEASE_DATE "2012-06-07"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120606
-#define RUBY_PATCHLEVEL 366
+#define RUBY_RELEASE_CODE 20120607
+#define RUBY_PATCHLEVEL 367
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
 #define RUBY_RELEASE_MONTH 6
-#define RUBY_RELEASE_DAY 6
+#define RUBY_RELEASE_DAY 7
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From ef73b34c87f52be6a87e0f7ab8d5a03bfcaa983f Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Sat, 9 Jun 2012 18:12:07 +0000
Subject: [PATCH 12/19] merge revision(s) 32542: 	* eval.c
 (ruby_setjmp): need to save the stack after r2 (the Table 	  of Contents
 on ppc64) is saved onto the stack by getcontext(). 	  based on
 <https://bugzilla.redhat.com/show_bug.cgi?id=628715>. 	  Bug#4411

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@35995 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog |  7 +++++++
 eval.c    | 18 ++++++++++++++----
 version.h |  8 ++++----
 3 files changed, 25 insertions(+), 8 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 3ac2f87..9637df1 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Sun Jun 10 03:00:21 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
+
+	* eval.c (ruby_setjmp): need to save the stack after r2 (the Table
+	  of Contents on ppc64) is saved onto the stack by getcontext().
+	  based on <https://bugzilla.redhat.com/show_bug.cgi?id=628715>.
+	  Bug#4411
+
 Thu Jun  7 19:00:35 2012  Kenta Murata <mrkn@mrkn.jp>
 
 	* ext/bigdecimal/bigdecimal.c (VpMemAlloc): Fixes a bug reported
diff --git a/eval.c b/eval.c
index c350159..4458dff 100644
--- a/eval.c
+++ b/eval.c
@@ -179,6 +179,9 @@
        (function_call_may_return_twice_false_2 ? \
         setjmp(function_call_may_return_twice_jmp_buf) : \
         0)
+#  elif defined(__PPC64__)
+#    define JUST_BEFORE_SETJMP(extra_save, j) ((void)0)
+#    define JUST_AFTER_SETJMP(extra_save, j) ((j)->status ? (void)0 : (extra_save))
 #  elif defined(__FreeBSD__) && __FreeBSD__ < 7
 /*
  * workaround for FreeBSD/i386 getcontext/setcontext bug.
@@ -196,16 +199,23 @@
 #  ifndef POST_GETCONTEXT
 #    define POST_GETCONTEXT 0
 #  endif
+#  ifndef JUST_BEFORE_SETJMP
+#    define JUST_BEFORE_SETJMP(extra_save, j) (extra_save)
+#  endif
+#  ifndef JUST_AFTER_SETJMP
+#    define JUST_AFTER_SETJMP(extra_save, j) ((void)0)
+#  endif
 #  define ruby_longjmp(env, val) rb_jump_context(env, val)
-#  define ruby_setjmp(just_before_setjmp, j) ((j)->status = 0, \
-     (just_before_setjmp), \
+#  define ruby_setjmp(extra_save, j) ((j)->status = 0, \
+     JUST_BEFORE_SETJMP(extra_save, j), \
      PRE_GETCONTEXT, \
      getcontext(&(j)->context), \
      POST_GETCONTEXT, \
+     JUST_AFTER_SETJMP(extra_save, j), \
      (j)->status)
 #else
-#  define ruby_setjmp(just_before_setjmp, env) \
-     ((just_before_setjmp), RUBY_SETJMP(env))
+#  define ruby_setjmp(extra_save, env) \
+     ((extra_save), RUBY_SETJMP(env))
 #  define ruby_longjmp(env,val) RUBY_LONGJMP(env,val)
 #  ifdef __CYGWIN__
 int _setjmp(), _longjmp();
diff --git a/version.h b/version.h
index 7a53a5c..6341599 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-06-07"
+#define RUBY_RELEASE_DATE "2012-06-10"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120607
-#define RUBY_PATCHLEVEL 367
+#define RUBY_RELEASE_CODE 20120610
+#define RUBY_PATCHLEVEL 368
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
 #define RUBY_RELEASE_MONTH 6
-#define RUBY_RELEASE_DAY 7
+#define RUBY_RELEASE_DAY 10
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From d761c9b178d8a2b7757ca5ea41135c7ea37c70b2 Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Mon, 18 Jun 2012 09:53:29 +0000
Subject: [PATCH 13/19] merge revision(s) 32605:32610: 	* backport r32609 from
 trunk. 	* ext/openssl/ossl_hmac.c: Revert checking return type of 
   HMAC_Init_ex as it is not compatible with OpenSSL < 1.0.0. 	* backport
 r32606 from trunk. 	* ext/openssl/ossl_digest.c: Check return value of
 EVP_DigestInit_ex. 	* ext/openssl/ossl_hmac.c: Check return value of
 HMAC_Init_ex. 	  Thanks, Jared Jennings, for the patch. 	  [ Ruby 1.9 -
 Bug #4944 ] [ruby-core:37670]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@36126 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog                 | 16 ++++++++++++++++
 ext/openssl/ossl_digest.c | 12 +++++++++---
 version.h                 |  8 ++++----
 3 files changed, 29 insertions(+), 7 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 9637df1..e7445fa 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,19 @@
+Mon Jun 18 18:32:43 2012  Martin Bosslet  <Martin.Bosslet@googlemail.com>
+
+	* backport r32609 from trunk.
+
+	* ext/openssl/ossl_hmac.c: Revert checking return type of
+	  HMAC_Init_ex as it is not compatible with OpenSSL < 1.0.0.
+
+Mon Jun 18 18:32:43 2012  Martin Bosslet  <Martin.Bosslet@googlemail.com>
+
+	* backport r32606 from trunk.
+
+	* ext/openssl/ossl_digest.c: Check return value of EVP_DigestInit_ex.
+	* ext/openssl/ossl_hmac.c: Check return value of HMAC_Init_ex.
+	  Thanks, Jared Jennings, for the patch.
+	  [ Ruby 1.9 - Bug #4944 ] [ruby-core:37670]
+
 Sun Jun 10 03:00:21 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 
 	* eval.c (ruby_setjmp): need to save the stack after r2 (the Table
diff --git a/ext/openssl/ossl_digest.c b/ext/openssl/ossl_digest.c
index 879d399..13111ce 100644
--- a/ext/openssl/ossl_digest.c
+++ b/ext/openssl/ossl_digest.c
@@ -62,7 +62,9 @@
 
     ret = ossl_digest_alloc(cDigest);
     GetDigest(ret, ctx);
-    EVP_DigestInit_ex(ctx, md, NULL);
+    if (EVP_DigestInit_ex(ctx, md, NULL) != 1) {
+	ossl_raise(eDigestError, "Digest initialization failed.");
+    }
    
     return ret;
 }
@@ -104,7 +106,9 @@
     if (!NIL_P(data)) StringValue(data);
 
     GetDigest(self, ctx);
-    EVP_DigestInit_ex(ctx, md, NULL);
+    if (EVP_DigestInit_ex(ctx, md, NULL) != 1) {
+	ossl_raise(eDigestError, "Digest initialization failed.");
+    }
     
     if (!NIL_P(data)) return ossl_digest_update(self, data);
     return self;
@@ -138,7 +142,9 @@
     EVP_MD_CTX *ctx;
 
     GetDigest(self, ctx);
-    EVP_DigestInit_ex(ctx, EVP_MD_CTX_md(ctx), NULL);
+    if (EVP_DigestInit_ex(ctx, EVP_MD_CTX_md(ctx), NULL) != 1) {
+	ossl_raise(eDigestError, "Digest initialization failed.");
+    }
 
     return self;
 }
diff --git a/version.h b/version.h
index 6341599..7b2f01a 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-06-10"
+#define RUBY_RELEASE_DATE "2012-06-18"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120610
-#define RUBY_PATCHLEVEL 368
+#define RUBY_RELEASE_CODE 20120618
+#define RUBY_PATCHLEVEL 369
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
 #define RUBY_RELEASE_MONTH 6
-#define RUBY_RELEASE_DAY 10
+#define RUBY_RELEASE_DAY 18
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From e48d99f0e574a36f0e9c7337b396a437cbff4cc5 Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Fri, 29 Jun 2012 12:31:25 +0000
Subject: [PATCH 14/19] merge revision(s) 36251: 	* eval.c
 (stack_extend): prevent ALLOCA_N, which reserves a memory 	  space with
 for restoring machine stack stored in each threads, from 	  optimization
 out.  backport r34278 from the trunk.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@36253 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog | 6 ++++++
 eval.c    | 2 ++
 version.h | 8 ++++----
 3 files changed, 12 insertions(+), 4 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index e7445fa..2d4bcb0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Fri Jun 29 21:26:05 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
+
+	* eval.c (stack_extend): prevent ALLOCA_N, which reserves a memory
+	  space with for restoring machine stack stored in each threads, from
+	  optimization out.  backport r34278 from the trunk.
+
 Mon Jun 18 18:32:43 2012  Martin Bosslet  <Martin.Bosslet@googlemail.com>
 
 	* backport r32609 from trunk.
diff --git a/version.h b/version.h
index 7b2f01a..d90d5b1 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-06-18"
+#define RUBY_RELEASE_DATE "2012-06-29"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120618
-#define RUBY_PATCHLEVEL 369
+#define RUBY_RELEASE_CODE 20120629
+#define RUBY_PATCHLEVEL 370
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
 #define RUBY_RELEASE_MONTH 6
-#define RUBY_RELEASE_DAY 18
+#define RUBY_RELEASE_DAY 29
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From 2ac236dcbd90bd33bfeac4f699763c3baef4038e Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Fri, 12 Oct 2012 04:05:35 +0000
Subject: [PATCH 15/19] * error.c (name_err_to_s): we need not infect msg.

* test/ruby/test_exception.rb (TestException#test_exception_to_s_should_not_propagate_untrustedness): test for it.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@37148 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog                   |  6 ++++++
 error.c                     |  3 ---
 test/ruby/test_exception.rb | 30 +++++++++++++++++++++++++++++-
 version.h                   | 10 +++++-----
 4 files changed, 40 insertions(+), 9 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 2d4bcb0..e2e1059 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Fri Oct 12 12:25:15 2012  URABE Shyouhei  <shyouhei@ruby-lang.org>
+
+	* error.c (name_err_to_s): we need not infect msg.
+
+	* test/ruby/test_exception.rb (TestException#test_exception_to_s_should_not_propagate_untrustedness): test for it.
+
 Fri Jun 29 21:26:05 2012  Nobuyoshi Nakada  <nobu@ruby-lang.org>
 
 	* eval.c (stack_extend): prevent ALLOCA_N, which reserves a memory
diff --git a/error.c b/error.c
index 59b445e..2b3bf3f 100644
--- a/error.c
+++ b/error.c
@@ -665,9 +665,6 @@
 
     if (NIL_P(mesg)) return rb_class_name(CLASS_OF(exc));
     StringValue(str);
-    if (str != mesg) {
-	OBJ_INFECT(str, mesg);
-    }
     return str;
 }
 
diff --git a/test/ruby/test_exception.rb b/test/ruby/test_exception.rb
index c5f4091..434838f 100644
--- a/test/ruby/test_exception.rb
+++ b/test/ruby/test_exception.rb
@@ -204,6 +204,34 @@ def o.to_str
     o.taint
     e = NameError.new(o)
     s = e.to_s
-    assert_equal(true, s.tainted?)
+    assert_equal(false, s.tainted?)
+  end
+
+  def test_exception_to_s_should_not_propagate_untrustedness
+    favorite_lang = "Ruby"
+
+    for exc in [Exception, NameError]
+      assert_raise(SecurityError) do
+        lambda {
+          $SAFE = 4
+          exc.new(favorite_lang).to_s
+          favorite_lang.replace("Python")
+        }.call
+      end
+    end
+
+    assert_raise(SecurityError) do
+      lambda {
+        $SAFE = 4
+        o = Object.new
+        (class << o; self; end).send(:define_method, :to_str) {
+          favorite_lang
+        }
+        NameError.new(o).to_s
+        favorite_lang.replace("Python")
+      }.call
+    end
+
+    assert_equal("Ruby", favorite_lang)
   end
 end
diff --git a/version.h b/version.h
index d90d5b1..e509ed2 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-06-29"
+#define RUBY_RELEASE_DATE "2012-10-12"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20120629
-#define RUBY_PATCHLEVEL 370
+#define RUBY_RELEASE_CODE 20121012
+#define RUBY_PATCHLEVEL 371
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2012
-#define RUBY_RELEASE_MONTH 6
-#define RUBY_RELEASE_DAY 29
+#define RUBY_RELEASE_MONTH 10
+#define RUBY_RELEASE_DAY 12
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From eca9bf617ab517b73598f449388b543d19c72b7d Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Sat, 18 May 2013 14:55:14 +0000
Subject: [PATCH 16/19] merge revision(s) 39384,39509,39511: [Backport #7961]

	* lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit):
	  new attribute to read/write entity expansion text limit.  the default
	  limit is 10Kb.

	* lib/rexml/text.rb (REXML::Text.unnormalize): check above attribute.

	* lib/rexml/document.rb: move entity_expansion_limit accessor to ...

	* lib/rexml/rexml.rb: ... here to make rexml/text independent from
	  REXML::Document. It causes circular require.

	* lib/rexml/document.rb (REXML::Document.entity_expansion_limit):
	  deprecated.

	* lib/rexml/document.rb (REXML::Document.entity_expansion_limit=):
	  deprecated.

	* lib/rexml/text.rb: add missing require "rexml/rexml" for
	  REXML.entity_expansion_limit.
	  Reported by Robert Ulejczyk. Thanks!!! [ruby-core:52895] [Bug #7961]

	* lib/rexml/document.rb: move entity_expansion_text_limit accessor to ...

	* lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit):

	* lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit=):
	  REXML.entity_expansion_text_limit.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@40812 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog             | 21 ++++++++++++++++++++
 lib/rexml/document.rb | 14 ++++++++++++++
 lib/rexml/rexml.rb    | 12 ++++++++++++
 lib/rexml/text.rb     | 53 +++++++++++++++++++++++++--------------------------
 version.h             | 12 ++++++------
 5 files changed, 79 insertions(+), 33 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index e2e1059..c80774f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,24 @@
+Sat May 18 23:34:50 2013  Kouhei Sutou  <kou@cozmixng.org>
+
+	* lib/rexml/document.rb: move entity_expansion_text_limit accessor to ...
+	* lib/rexml/rexml.rb: ... here to make rexml/text independent from
+	  REXML::Document. It causes circular require.
+	* lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit):
+	  deprecated.
+	* lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit=):
+	  deprecated.
+	* lib/rexml/text.rb: add missing require "rexml/rexml" for
+	  REXML.entity_expansion_text_limit.
+	  Reported by Robert Ulejczyk. Thanks!!! [ruby-core:52895] [Bug #7961]
+
+Sat May 18 23:34:50 2013  Aaron Patterson <aaron@tenderlovemaking.com>
+
+	* lib/rexml/document.rb (REXML::Document.entity_expansion_text_limit):
+	  new attribute to read/write entity expansion text limit.  the default
+	  limit is 10Kb.
+
+	* lib/rexml/text.rb (REXML::Text.unnormalize): check above attribute.
+
 Fri Oct 12 12:25:15 2012  URABE Shyouhei  <shyouhei@ruby-lang.org>
 
 	* error.c (name_err_to_s): we need not infect msg.
diff --git a/lib/rexml/document.rb b/lib/rexml/document.rb
index 3d1300a..16a2c77 100644
--- a/lib/rexml/document.rb
+++ b/lib/rexml/document.rb
@@ -213,6 +213,20 @@ def Document::entity_expansion_limit
       return @@entity_expansion_limit
     end
 
+    # Set the entity expansion limit. By default the limit is set to 10240.
+    #
+    # Deprecated. Use REXML.entity_expansion_text_limit= instead.
+    def Document::entity_expansion_text_limit=( val )
+      REXML.entity_expansion_text_limit = val
+    end
+
+    # Get the entity expansion limit. By default the limit is set to 10000.
+    #
+    # Deprecated. Use REXML.entity_expansion_text_limit instead.
+    def Document::entity_expansion_text_limit
+      return REXML.entity_expansion_text_limit
+    end
+
     attr_reader :entity_expansion_count
     
     def record_entity_expansion
diff --git a/lib/rexml/rexml.rb b/lib/rexml/rexml.rb
index 95bc2a7..8845300 100644
--- a/lib/rexml/rexml.rb
+++ b/lib/rexml/rexml.rb
@@ -29,4 +29,16 @@ module REXML
 
   Copyright = COPYRIGHT
   Version = VERSION
+
+  @@entity_expansion_text_limit = 10_240
+
+  # Set the entity expansion limit. By default the limit is set to 10240.
+  def self.entity_expansion_text_limit=( val )
+    @@entity_expansion_text_limit = val
+  end
+
+  # Get the entity expansion limit. By default the limit is set to 10240.
+  def self.entity_expansion_text_limit
+    return @@entity_expansion_text_limit
+  end
 end
diff --git a/lib/rexml/text.rb b/lib/rexml/text.rb
index a4a30b6..b6dbf45 100644
--- a/lib/rexml/text.rb
+++ b/lib/rexml/text.rb
@@ -1,3 +1,4 @@
+require 'rexml/rexml'
 require 'rexml/entity'
 require 'rexml/doctype'
 require 'rexml/child'
@@ -308,37 +309,35 @@ def Text::normalize( input, doctype=nil, entity_filter=nil )
 
     # Unescapes all possible entities
     def Text::unnormalize( string, doctype=nil, filter=nil, illegal=nil )
-      rv = string.clone
-      rv.gsub!( /\r\n?/, "\n" )
-      matches = rv.scan( REFERENCE )
-      return rv if matches.size == 0
-      rv.gsub!( NUMERICENTITY ) {|m|
-        m=$1
-        m = "0#{m}" if m[0] == ?x
-        [Integer(m)].pack('U*')
+      sum = 0
+      string.gsub( /\r\n?/, "\n" ).gsub( REFERENCE ) {
+        s = Text.expand($&, doctype, filter)
+        if sum + s.bytesize > REXML.entity_expansion_text_limit
+          raise "entity expansion has grown too large"
+        else
+          sum += s.bytesize
+        end
+        s
       }
-      matches.collect!{|x|x[0]}.compact!
-      if matches.size > 0
-        if doctype
-          matches.each do |entity_reference|
-            unless filter and filter.include?(entity_reference)
-              entity_value = doctype.entity( entity_reference )
-              re = /&#{entity_reference};/
-              rv.gsub!( re, entity_value ) if entity_value
-            end
-          end
+    end
+
+    def Text.expand(ref, doctype, filter)
+      if ref[1] == ?#
+        if ref[2] == ?x
+          [ref[3...-1].to_i(16)].pack('U*')
         else
-          matches.each do |entity_reference|
-            unless filter and filter.include?(entity_reference)
-              entity_value = DocType::DEFAULT_ENTITIES[ entity_reference ]
-              re = /&#{entity_reference};/
-              rv.gsub!( re, entity_value.value ) if entity_value
-            end
-          end
+          [ref[2...-1].to_i].pack('U*')
         end
-        rv.gsub!( /&amp;/, '&' )
+      elsif ref == '&amp;'
+        '&'
+      elsif filter and filter.include?( ref[1...-1] )
+        ref
+      elsif doctype
+        doctype.entity( ref[1...-1] ) or ref
+      else
+        entity_value = DocType::DEFAULT_ENTITIES[ ref[1...-1] ]
+        entity_value ? entity_value.value : ref
       end
-      rv
     end
   end
 end
diff --git a/version.h b/version.h
index e509ed2..2158647 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2012-10-12"
+#define RUBY_RELEASE_DATE "2013-05-18"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20121012
-#define RUBY_PATCHLEVEL 371
+#define RUBY_RELEASE_CODE 20130518
+#define RUBY_PATCHLEVEL 372
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
-#define RUBY_RELEASE_YEAR 2012
-#define RUBY_RELEASE_MONTH 10
-#define RUBY_RELEASE_DAY 12
+#define RUBY_RELEASE_YEAR 2013
+#define RUBY_RELEASE_MONTH 5
+#define RUBY_RELEASE_DAY 18
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From 961bf7496ded3acfe847cf56fa90bbdcfd6e614f Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Thu, 27 Jun 2013 11:22:26 +0000
Subject: [PATCH 17/19] 	* ext/openssl/lib/openssl/ssl-internal.rb
 (OpenSSL::SSL#verify_certificate_identity): 	  fix hostname verification.
 Patch by nahi.

	* test/openssl/test_ssl.rb (OpenSSL#test_verify_certificate_identity):
	  test for above.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@41676 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog                               |  8 ++++++++
 ext/openssl/lib/openssl/ssl-internal.rb | 18 +++++++++++++-----
 test/openssl/test_ssl.rb                | 23 +++++++++++++++++++++++
 version.h                               | 10 +++++-----
 4 files changed, 49 insertions(+), 10 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index c80774f..cbba5f0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Thu Jun 27 20:21:18 2013  URABE Shyouhei  <shyouhei@ruby-lang.org>
+
+	* ext/openssl/lib/openssl/ssl-internal.rb (OpenSSL::SSL#verify_certificate_identity):
+	  fix hostname verification. Patch by nahi.
+
+	* test/openssl/test_ssl.rb (OpenSSL#test_verify_certificate_identity):
+	  test for above.
+
 Sat May 18 23:34:50 2013  Kouhei Sutou  <kou@cozmixng.org>
 
 	* lib/rexml/document.rb: move entity_expansion_text_limit accessor to ...
diff --git a/ext/openssl/lib/openssl/ssl-internal.rb b/ext/openssl/lib/openssl/ssl-internal.rb
index abf0e8d..9ef6f92 100644
--- a/ext/openssl/lib/openssl/ssl-internal.rb
+++ b/ext/openssl/lib/openssl/ssl-internal.rb
@@ -90,14 +90,22 @@ def verify_certificate_identity(cert, hostname)
       should_verify_common_name = true
       cert.extensions.each{|ext|
         next if ext.oid != "subjectAltName"
-        ext.value.split(/,\s+/).each{|general_name|
-          if /\ADNS:(.*)/ =~ general_name
+        id, ostr = OpenSSL::ASN1.decode(ext.to_der).value
+        sequence = OpenSSL::ASN1.decode(ostr.value)
+        sequence.value.each{|san|
+          case san.tag
+          when 2 # dNSName in GeneralName (RFC5280)
             should_verify_common_name = false
-            reg = Regexp.escape($1).gsub(/\\\*/, "[^.]+")
+            reg = Regexp.escape(san.value).gsub(/\\\*/, "[^.]+")
             return true if /\A#{reg}\z/i =~ hostname
-          elsif /\AIP Address:(.*)/ =~ general_name
+          when 7 # iPAddress in GeneralName (RFC5280)
             should_verify_common_name = false
-            return true if $1 == hostname
+            # follows GENERAL_NAME_print() in x509v3/v3_alt.c
+            if san.value.size == 4
+              return true if san.value.unpack('C*').join('.') == hostname
+            elsif san.value.size == 16
+              return true if san.value.unpack('n*').map { |e| sprintf("%X", e) }.join(':') == hostname
+            end
           end
         }
       }
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 177b684..098ccdd 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -547,6 +547,29 @@ def test_unset_OP_ALL
       ssl.close
     }
   end
+ 
+  def test_verify_certificate_identity
+    # creating NULL byte SAN certificate
+    ef = OpenSSL::X509::ExtensionFactory.new
+    cert = OpenSSL::X509::Certificate.new
+    cert.subject = OpenSSL::X509::Name.parse "/DC=some/DC=site/CN=Some Site"
+    ext = ef.create_ext('subjectAltName', 'DNS:placeholder,IP:192.168.7.1,IP:13::17')
+    ext_asn1 = OpenSSL::ASN1.decode(ext.to_der)
+    san_list_der = ext_asn1.value.reduce(nil) { |memo,val| val.tag == 4 ? val.value : memo }
+    san_list_asn1 = OpenSSL::ASN1.decode(san_list_der)
+    san_list_asn1.value[0].value = 'www.example.com\0.evil.com'
+    ext_asn1.value[1].value = san_list_asn1.to_der
+    real_ext = OpenSSL::X509::Extension.new ext_asn1
+    cert.add_extension(real_ext)
+
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(cert, 'www.example.com'))
+    assert_equal(true,  OpenSSL::SSL.verify_certificate_identity(cert, 'www.example.com\0.evil.com'))
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(cert, '192.168.7.255'))
+    assert_equal(true,  OpenSSL::SSL.verify_certificate_identity(cert, '192.168.7.1'))
+    assert_equal(false, OpenSSL::SSL.verify_certificate_identity(cert, '13::17'))
+    assert_equal(true,  OpenSSL::SSL.verify_certificate_identity(cert, '13:0:0:0:0:0:0:17'))
+  end
+L
 end
 
 end
diff --git a/version.h b/version.h
index 2158647..97111c5 100644
--- a/version.h
+++ b/version.h
@@ -1,15 +1,15 @@
 #define RUBY_VERSION "1.8.7"
-#define RUBY_RELEASE_DATE "2013-05-18"
+#define RUBY_RELEASE_DATE "2013-06-27"
 #define RUBY_VERSION_CODE 187
-#define RUBY_RELEASE_CODE 20130518
-#define RUBY_PATCHLEVEL 372
+#define RUBY_RELEASE_CODE 20130627
+#define RUBY_PATCHLEVEL 373
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
 #define RUBY_VERSION_TEENY 7
 #define RUBY_RELEASE_YEAR 2013
-#define RUBY_RELEASE_MONTH 5
-#define RUBY_RELEASE_DAY 18
+#define RUBY_RELEASE_MONTH 6
+#define RUBY_RELEASE_DAY 27
 
 #ifdef RUBY_EXTERN
 RUBY_EXTERN const char ruby_version[];
-- 
1.8.5.1


From 469d4b9389cc2f877f2f17ba248146831d69c66b Mon Sep 17 00:00:00 2001
From: shyouhei <shyouhei@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>
Date: Thu, 27 Jun 2013 11:56:26 +0000
Subject: [PATCH 18/19] Oops, sorry!

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@41678 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
---
 ChangeLog                | 4 ++++
 test/openssl/test_ssl.rb | 1 -
 version.h                | 2 +-
 3 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index cbba5f0..dbba29d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Thu Jun 27 20:55:23 2013  URABE Shyouhei  <shyouhei@ruby-lang.org>
+
+	* test/openssl/test_ssl.rb: Oops, sorry!
+
 Thu Jun 27 20:21:18 2013  URABE Shyouhei  <shyouhei@ruby-lang.org>
 
 	* ext/openssl/lib/openssl/ssl-internal.rb (OpenSSL::SSL#verify_certificate_identity):
diff --git a/test/openssl/test_ssl.rb b/test/openssl/test_ssl.rb
index 098ccdd..2e014f1 100644
--- a/test/openssl/test_ssl.rb
+++ b/test/openssl/test_ssl.rb
@@ -569,7 +569,6 @@ def test_verify_certificate_identity
     assert_equal(false, OpenSSL::SSL.verify_certificate_identity(cert, '13::17'))
     assert_equal(true,  OpenSSL::SSL.verify_certificate_identity(cert, '13:0:0:0:0:0:0:17'))
   end
-L
 end
 
 end
diff --git a/version.h b/version.h
index 97111c5..6b6d57e 100644
--- a/version.h
+++ b/version.h
@@ -2,7 +2,7 @@
 #define RUBY_RELEASE_DATE "2013-06-27"
 #define RUBY_VERSION_CODE 187
 #define RUBY_RELEASE_CODE 20130627
-#define RUBY_PATCHLEVEL 373
+#define RUBY_PATCHLEVEL 374
 
 #define RUBY_VERSION_MAJOR 1
 #define RUBY_VERSION_MINOR 8
-- 
1.8.5.1

© 2025 GrazzMean