summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--test/ruby/test_time_tz.rb6
-rw-r--r--time.c14
3 files changed, 20 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index 20172e0c11..ed651ab396 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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)
}
}
diff --git a/time.c b/time.c
index 58d8475855..5acc64345c 100644
--- a/time.c
+++ b/time.c
@@ -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;