summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-09-11 16:16:19 +0000
committernagachika <nagachika@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2013-09-11 16:16:19 +0000
commite4d528752a1235f17f1622827f7cec693e34157a (patch)
treeb5ccf2d17f07be67b9b001c8278eb268dbbdf743
parent089106508261787f7b43840b0249a1f9e1fea9a0 (diff)
merge revision(s) 42596,42597,42598,42599: [Backport #8795]
* time.c (time_mload): ignore invalid offset and zone. [ruby-core:56648] [Bug #8795] * time.c (time_mload): ignore auxiliary data, offset and zone, if invalid. [ruby-core:56648] [Bug #8795] * test/ruby/test_time.rb: use the in_timezone() helper and define it at the top with other helpers. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_2_0_0@42912 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog10
-rw-r--r--test/ruby/test_time.rb50
-rw-r--r--time.c20
-rw-r--r--version.h2
4 files changed, 68 insertions, 14 deletions
diff --git a/ChangeLog b/ChangeLog
index 3894e03503..d906909b7e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+Thu Sep 12 01:02:56 2013 Benoit Daloze <eregontp@gmail.com>
+
+ * test/ruby/test_time.rb: use the in_timezone() helper
+ and define it at the top with other helpers.
+
+Thu Sep 12 01:02:56 2013 Nobuyoshi Nakada <nobu@ruby-lang.org>
+
+ * time.c (time_mload): ignore auxiliary data, offset and zone, if
+ invalid. [ruby-core:56648] [Bug #8795]
+
Thu Sep 12 00:22:22 2013 Kazuki Tsujimoto <kazuki@callcc.net>
* variable.c (classname): the name of class that has
diff --git a/test/ruby/test_time.rb b/test/ruby/test_time.rb
index 22df27067f..02ebc6ac38 100644
--- a/test/ruby/test_time.rb
+++ b/test/ruby/test_time.rb
@@ -15,6 +15,15 @@ class TestTime < Test::Unit::TestCase
$VERBOSE = @verbose
end
+ def in_timezone(zone)
+ orig_zone = ENV['TZ']
+
+ ENV['TZ'] = zone
+ yield
+ ensure
+ ENV['TZ'] = orig_zone
+ end
+
def no_leap_seconds?
# 1972-06-30T23:59:60Z is the first leap second.
Time.utc(1972, 7, 1, 0, 0, 0) - Time.utc(1972, 6, 30, 23, 59, 59) == 1
@@ -291,18 +300,15 @@ class TestTime < Test::Unit::TestCase
end
def test_marshal_zone
- orig_zone = ENV['TZ']
-
t = Time.utc(2013, 2, 24)
assert_equal('UTC', t.zone)
assert_equal('UTC', Marshal.load(Marshal.dump(t)).zone)
- ENV['TZ'] = 'JST-9'
- t = Time.local(2013, 2, 24)
- assert_equal('JST', Time.local(2013, 2, 24).zone)
- assert_equal('JST', Marshal.load(Marshal.dump(t)).zone)
- ensure
- ENV['TZ'] = orig_zone
+ in_timezone('JST-9') do
+ t = Time.local(2013, 2, 24)
+ assert_equal('JST', Time.local(2013, 2, 24).zone)
+ assert_equal('JST', Marshal.load(Marshal.dump(t)).zone)
+ end
end
def test_marshal_to_s
@@ -322,6 +328,34 @@ class TestTime < Test::Unit::TestCase
end
end
+ Bug8795 = '[ruby-core:56648] [Bug #8795]'
+
+ def test_marshal_broken_offset
+ data = "\x04\bIu:\tTime\r\xEFF\x1C\x80\x00\x00\x00\x00\x06:\voffset"
+ t1 = t2 = nil
+ in_timezone('UTC') do
+ assert_nothing_raised(TypeError, ArgumentError, Bug8795) do
+ t1 = Marshal.load(data + "T")
+ t2 = Marshal.load(data + "\"\x0ebadoffset")
+ end
+ assert_equal(0, t1.utc_offset)
+ assert_equal(0, t2.utc_offset)
+ end
+ end
+
+ def test_marshal_broken_zone
+ data = "\x04\bIu:\tTime\r\xEFF\x1C\x80\x00\x00\x00\x00\x06:\tzone"
+ t1 = t2 = nil
+ in_timezone('UTC') do
+ assert_nothing_raised(TypeError, ArgumentError, Bug8795) do
+ t1 = Marshal.load(data + "T")
+ t2 = Marshal.load(data + "\"\b\0\0\0")
+ end
+ assert_equal('UTC', t1.zone)
+ assert_equal('UTC', t2.zone)
+ end
+ end
+
def test_at3
t2000 = get_t2000
assert_equal(t2000, Time.at(t2000))
diff --git a/time.c b/time.c
index 2173fcda8e..ac76686f46 100644
--- a/time.c
+++ b/time.c
@@ -849,7 +849,8 @@ static VALUE time_utc_offset _((VALUE));
static int obj2int(VALUE obj);
static VALUE obj2vint(VALUE obj);
static int month_arg(VALUE arg);
-static void validate_utc_offset(VALUE utc_offset);
+static VALUE validate_utc_offset(VALUE utc_offset);
+static VALUE validate_zone_name(VALUE zone_name);
static void validate_vtm(struct vtm *vtm);
static int obj2subsecx(VALUE obj, VALUE *subsecx);
@@ -2672,11 +2673,19 @@ month_arg(VALUE arg)
return mon;
}
-static void
+static VALUE
validate_utc_offset(VALUE utc_offset)
{
if (le(utc_offset, INT2FIX(-86400)) || ge(utc_offset, INT2FIX(86400)))
rb_raise(rb_eArgError, "utc_offset out of range");
+ return utc_offset;
+}
+
+static VALUE
+validate_zone_name(VALUE zone_name)
+{
+ StringValueCStr(zone_name);
+ return zone_name;
}
static void
@@ -4790,8 +4799,9 @@ time_mload(VALUE time, VALUE str)
get_attr(nano_num, {});
get_attr(nano_den, {});
get_attr(submicro, {});
- get_attr(offset, validate_utc_offset(offset));
- get_attr(zone, {});
+ get_attr(offset, (offset = rb_rescue(validate_utc_offset, offset, NULL, Qnil)));
+ get_attr(zone, (zone = rb_rescue(validate_zone_name, zone, NULL, Qnil)));
+
#undef get_attr
rb_copy_generic_ivar(time, str);
@@ -4877,7 +4887,7 @@ end_submicro: ;
time_fixoff(time);
}
if (!NIL_P(zone)) {
- tobj->vtm.zone = StringValueCStr(zone);
+ tobj->vtm.zone = RSTRING_PTR(zone);
}
return time;
diff --git a/version.h b/version.h
index e092520d5c..6ceede6fbd 100644
--- a/version.h
+++ b/version.h
@@ -1,6 +1,6 @@
#define RUBY_VERSION "2.0.0"
#define RUBY_RELEASE_DATE "2013-09-12"
-#define RUBY_PATCHLEVEL 300
+#define RUBY_PATCHLEVEL 301
#define RUBY_RELEASE_YEAR 2013
#define RUBY_RELEASE_MONTH 9