[Ruby 1.9 - Bug #4457] [Open] Time#strftime で %z 指定子などに大きな幅を指定した際の不具合

Issue #4457 has been reported by tadayoshi funaba.


Bug #4457: Time#strftime で %z 指定子などに大きな幅を指定した際の不具合

Author: tadayoshi funaba
Status: Open
Priority: Normal
Assignee:
Category:
Target version:
ruby -v: ruby 1.9.3dev (2011-03-02) [i686-linux]

大きな幅を指定すると結果が空になる事があります。

$ ruby -e “p Time.now.strftime(‘%100000z’)”
“”
$ ruby -e “p Time.now.strftime(‘%10z’)”
“+000000900”

Issue #4457 has been updated by Yui NARUSE.

Status changed from Open to Assigned
Assignee set to Akira T.
Target version set to 1.9.3


Bug #4457: Time#strftime で %z 指定子などに大きな幅を指定した際の不具合

Author: tadayoshi funaba
Status: Assigned
Priority: Normal
Assignee: Akira T.
Category:
Target version: 1.9.3
ruby -v: ruby 1.9.3dev (2011-03-02) [i686-linux]

=begin
大きな幅を指定すると結果が空になる事があります。

$ ruby -e “p Time.now.strftime(‘%100000z’)”
“”
$ ruby -e “p Time.now.strftime(‘%10z’)”
“+000000900”

=end

Issue #4457 has been updated by Motohiro KOSAKI.

Category set to core

こちら、状況いかがでしょうか?

Bug #4457: Time#strftime で %z 指定子などに大きな幅を指定した際の不具合

Author: tadayoshi funaba
Status: Assigned
Priority: Normal
Assignee: Akira T.
Category: core
Target version: 1.9.3
ruby -v: ruby 1.9.3dev (2011-03-02) [i686-linux]

=begin
大きな幅を指定すると結果が空になる事があります。

$ ruby -e “p Time.now.strftime(‘%100000z’)”
“”
$ ruby -e “p Time.now.strftime(‘%10z’)”
“+000000900”

=end

$B$J$+$@$G$9!#(B

At Thu, 21 Jul 2011 13:57:30 +0900,
Motohiro KOSAKI wrote in [ruby-dev:44176]:

$B$3$A$i!">u67$$$+$,$G$7$g$&$+!)(B

$B$G$-$J$1$l$PNc30!"$G$9$+$M$’!#(B

diff --git a/test/ruby/test_time.rb b/test/ruby/test_time.rb
index 38e567a…1f07a82 100644
— a/test/ruby/test_time.rb
+++ b/test/ruby/test_time.rb
@@ -650,6 +650,9 @@ class TestTime < Test::Unit::TestCase

 # [ruby-core:33985]
 assert_equal("3000000000", Time.at(3000000000).strftime('%s'))
  • bug4457 = ‘[ruby-dev:43285]’
  • assert_raise(Errno::ERANGE, bug4457) {Time.now.strftime(’%8192z’)}
    end

def test_delegate
Modified time.c
diff --git a/time.c b/time.c
index dd846a6…6817c75 100644
— a/time.c
+++ b/time.c
@@ -4325,8 +4325,12 @@ rb_strftime_alloc(char **buf, const char *format,
* if the buffer is 1024 times bigger than the length of the
* format string, it’s not failing for lack of room.
*/

  • if (len > 0 || size >= 1024 * flen) break;
  • if (len > 0) break;
    xfree(*buf);
  • if (size >= 1024 * flen) {
  •  rb_sys_fail(format);
    
  •  break;
    
  • }
    }
    return len;
    }

Issue #4457 has been updated by Motohiro KOSAKI.

akrさん、nakadaさんのパッチはコミットしてしまっていいのでしょうか?

Bug #4457: Time#strftime で %z 指定子などに大きな幅を指定した際の不具合

Author: tadayoshi funaba
Status: Assigned
Priority: Normal
Assignee: Akira T.
Category: core
Target version: 1.9.3
ruby -v: -

=begin
大きな幅を指定すると結果が空になる事があります。

$ ruby -e “p Time.now.strftime(‘%100000z’)”
“”
$ ruby -e “p Time.now.strftime(‘%10z’)”
“+000000900”

=end

Issue #4457 has been updated by Akira T…

とりあえずいいような気がします。

しかし、考えてみると strftime の API が腐っているという問題があるわけで、
そして、Ruby 1.9 では OS の strftime を使っていないのだから、
その API につきあう必要はないわけです。

というわけで、バッファが足りなかったときには必要な長さを返すようにするとか
まともな API を用意して使うのがいい気がしますね。


Bug #4457: Time#strftime で %z 指定子などに大きな幅を指定した際の不具合

Author: tadayoshi funaba
Status: Assigned
Priority: Normal
Assignee: Akira T.
Category: core
Target version: 1.9.3
ruby -v: -

=begin
大きな幅を指定すると結果が空になる事があります。

$ ruby -e “p Time.now.strftime(‘%100000z’)”
“”
$ ruby -e “p Time.now.strftime(‘%10z’)”
“+000000900”

=end