diff options
author | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-06-10 14:10:25 +0000 |
---|---|---|
committer | akr <akr@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-06-10 14:10:25 +0000 |
commit | 094ca0281e1ddbfcd9d7c36363cea2222885527b (patch) | |
tree | 206cbfd6333775ad68344780be7777bc07177f71 | |
parent | ebda24ccd876257655305d73a9b2b496b381884a (diff) |
* time.c (rb_localtime_r2): refine localtime overflow check for
FreeBSD 6.4.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@28256 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | test/ruby/test_time_tz.rb | 6 | ||||
-rw-r--r-- | time.c | 14 |
3 files changed, 20 insertions, 5 deletions
@@ -1,3 +1,8 @@ +Thu Jun 10 23:05:44 2010 Tanaka Akira <akr@fsij.org> + + * time.c (rb_localtime_r2): refine localtime overflow check for + FreeBSD 6.4. + Thu Jun 10 09:10:08 2010 Yukihiro Matsumoto <matz@ruby-lang.org> * io.c (rb_io_putc): documentation updated to mention putc would diff --git a/test/ruby/test_time_tz.rb b/test/ruby/test_time_tz.rb index ea7b51d5d2..4e781cd820 100644 --- a/test/ruby/test_time_tz.rb +++ b/test/ruby/test_time_tz.rb @@ -153,8 +153,10 @@ class TestTimeTZ < Test::Unit::TestCase sample.each {|tz, u, l, gmtoff| with_tz(tz) { expected = "%04d-%02d-%02d %02d:%02d:%02d %s" % (l+[format_gmtoff(gmtoff)]) - t = Time.utc(*u).localtime - assert_equal(expected, time_to_s(t), "TZ=#{tz} Time.utc(#{u.map(&:inspect).join(', ')}).localtime") + mesg = "TZ=#{tz} Time.utc(#{u.map(&:inspect).join(', ')}).localtime" + t = nil + assert_nothing_raised(mesg) { t = Time.utc(*u).localtime } + assert_equal(expected, time_to_s(t), mesg) assert_equal(gmtoff, t.gmtoff) } } @@ -870,9 +870,17 @@ rb_localtime_r2(const time_t *t, struct tm *result) result = rb_localtime_r(t, result); #if defined(HAVE_MKTIME) && defined(LOCALTIME_OVERFLOW_PROBLEM) if (result) { - time_t t2 = mktime(result); - if (*t != t2) - result = NULL; + int gmtoff1 = 0; + int gmtoff2 = 0; +# if defined(HAVE_STRUCT_TM_TM_GMTOFF) + gmtoff1 = result->tm_gmtoff; +# endif + time_t t2 = mktime(result); +# if defined(HAVE_STRUCT_TM_TM_GMTOFF) + gmtoff2 = result->tm_gmtoff; +# endif + if (*t + gmtoff1 != t2 + gmtoff2) + result = NULL; } #endif return result; |