Bug #4456

Time#strftime で %F 指定子に大きな幅を指定した際の不具合

Added by tadayoshi funaba about 3 years ago. Updated over 2 years ago.

[ruby-dev:43284]
Status:Closed
Priority:Normal
Assignee:Naohisa Goto
Category:core
Target version:1.9.3
ruby -v:- Backport:

Description

=begin
$ ruby -e "Time.now.strftime('%100000F')"
-e:1: [BUG] Segmentation fault
ruby 1.9.3dev (2011-03-02) [i686-linux]

-- Control frame information -----------------------------------------------
c:0004 p:---- s:0010 b:0010 l:000009 d:000009 CFUNC :(null)
c:0003 p:0023 s:0006 b:0006 l:000d2c d:00034c EVAL -e:1
c:0002 p:---- s:0004 b:0004 l:000003 d:000003 FINISH
c:0001 p:0000 s:0002 b:0002 l:000d2c d:000d2c TOP

-- Ruby level backtrace information ----------------------------------------
-e:1:in `'
Segmentation fault
=end

strftime.patch Magnifier (530 Bytes) Naohisa Goto, 07/15/2011 06:41 PM


Related issues

Related to ruby-trunk - Bug #4457: Time#strftime で %z 指定子などに大きな幅を指定した際の不具合 Closed 03/02/2011

Associated revisions

Revision 31011
Added by Yui NARUSE about 3 years ago

  • strftime.c (STRFTIME): return 0 and ERANGE when precision is too large. fixes #4456

Revision 31858
Added by Yuki Sonoda almost 3 years ago

  • strftime.c (rbstrftimewith_timespec): improved style consistency.
    constified some variables.

  • test/testtime.rb (TestTime#testhuge_precision): test for #4456.

Revision 32757
Added by Naohisa Goto over 2 years ago

  • strftime.c (NEEDS): avoid SEGV due to integer overflow in sparc-solaris2.10 and i686-linux. fix [Bug #4456]

History

#1 Updated by Shota Fukumori about 3 years ago

  • Status changed from Open to Feedback

=begin
ruby -vからリビジョン番号が消えているような気がします。

See Also http://redmine.ruby-lang.org/projects/ruby/wiki/HowToReportJa
=end

#2 Updated by Yui NARUSE about 3 years ago

  • Status changed from Feedback to Open

=begin
trunkからビルドする場合、make upしないとrevision.hが更新されないのでリビジョンが入りませんね。

さておき、feedbackにする前に手元で再現するかは見てもいんじゃないですか。
多分ポータブルに発生すると思うのでOpenに戻します。
=end

#3 Updated by Yui NARUSE about 3 years ago

  • Status changed from Open to Closed
  • % Done changed from 0 to 100

=begin
已应用到变更列表 r31011.
=end

#4 Updated by Naohisa Goto almost 3 years ago

ruby19_3のリビジョン32548にて、sparc Solaris10 (32ビット, Solaris Studio 12)ではSEGVが未だに発生します。パッチを添付するので適用希望です。

デバッガ上で実行すると以下のような感じです。
$ dbx ../../sparc32-cc12-debug-svn193/bin/ruby
(===snip===)
(dbx) run -e 'Time.now.strftime("%1000000000F")'
Running: ruby -e Time.now.strftime("%1000000000F")
(process id 6581)
Reading libcpsr.so.1
Reading encdb.so
Reading transdb.so
t@1 (l@1) signal SEGV (no mapping at the fault address) in _memcpy at 0x7fb907f4
0x7fb907f4: _memcpy+0x0034: stb %o3, [%o0]
Current function is rb
strftimewithtimespec
704 STRFTIME("%Y-%m-%d");
(dbx) where
current thread: t@1
[1] memcpy(0x13b5abdda, 0xffbff3e4, 0x3, 0x32, 0x3b9ac9f6, 0xffbff344), at 0x7fb907f4
=>[2] rb
strftimewithtimespec(s = 0xffbff3e4 "2011-07-15", maxsize = 100U, format = 0x467fab "F", vtm = 0x486998, timev = 4U, ts = 0xffbff344, gmt = 0), line 704 in "strftime.c"
[3] rbstrftimetimespec(s = 0xffbff3e4 "2011-07-15", maxsize = 100U, format = 0x467fa0 "%1000000000F", vtm = 0x486998, ts = 0xffbff344, gmt = 0), line 793 in "strftime.c"
[4] rbstrftimealloc(buf = 0xffbff3e0, format = 0x467fa0 "%1000000000F", vtm = 0x486998, timew = 2621443089986389401ULL, gmt = 0), line 4311 in "time.c"
[5] timestrftime(time = 4707408U, format = 4707720U), line 4564 in "time.c"
[6] call
cfunc(func = 0x1790c0 = &rubytime.c`timestrftime(VALUE time, VALUE format), recv = 4707408U, len = 1, argc = 1, argv = 0x2bd9f4), line 323 in "vminsnhelper.c"
(===snip===)
[15] main(argc = 3, argv = 0xffbffa5c), line 38 in "main.c"
(dbx) print s, endp, precision, s + precision
s = 0xffbff3e4 "2011-07-15"
endp = 0xffbff448 ""
precision = 1000000000
s+precision = 0x3b5abde4 ""

strftime.c の213行目のマクロ
#define NEEDS(n) do if (s + (n) >= endp - 1) goto err; while (0)
の s + (n) の計算が integer overflow して goto err に行かないのが原因のようです。

添付のパッチのようにオーバーフローしないように演算順序を変えるとSEGVは出なくなるのを確認しました。

#5 Updated by Motohiro KOSAKI almost 3 years ago

  • Status changed from Closed to Open

#6 Updated by Motohiro KOSAKI almost 3 years ago

  • Category set to core
  • Status changed from Open to Assigned
  • Assignee set to Yui NARUSE
  • Target version set to 1.9.3

#7 Updated by Masaya Tarui over 2 years ago

Naohisa Gotoさんは いつも手薄なSolarisでチェックしてパッチを書いていただいているので、
コミット権を取ってもらうのはどうでしょうか?
今日勝手に聞いてみたところ、メンテナをしてもよいと言ってもらいました。

#8 Updated by Masaya Tarui over 2 years ago

  • ruby -v changed from ruby 1.9.3dev (2011-03-02) [i686-linux] to -

非常に重要な所が抜けてました。

『後藤 直久さん』は

いつも手薄なSolarisでチェックしてパッチを書いていただいているので、

です。
--
樽家昌也(Masaya TARUI)
No Tool,No Life.

#9 Updated by Motohiro KOSAKI over 2 years ago

2011年7月18日0:24 Masaya TARUI tarui@prx.jp:

非常に重要な所が抜けてました。

『後藤 直久さん』は

いつも手薄なSolarisでチェックしてパッチを書いていただいているので、

+1.

#10 Updated by Yukihiro Matsumoto over 2 years ago

まつもと ゆきひろです

In message "Re: Re: [Ruby 1.9 - Bug #4456] Time#strftime で %F 指定子に大きな幅を指定した際の不具合"
on Mon, 18 Jul 2011 00:30:09 +0900, KOSAKI Motohiro kosaki.motohiro@gmail.com writes:

|2011年7月18日0:24 Masaya TARUI tarui@prx.jp:
|> 非常に重要な所が抜けてました。
|>
|> 『後藤 直久さん』は
|>> いつも手薄なSolarisでチェックしてパッチを書いていただいているので、
|
|+1.

本人の承諾がえられたということであれば、いつも通りの手順でコ
ミット権を差し上げてください。

#11 Updated by Yui NARUSE over 2 years ago

  • Assignee changed from Yui NARUSE to Naohisa Goto

=begin
後藤さんにアサインしておきます。

コミットログに「 [Bug #4456]」という文字列を含めつつ、CommitterHowtoJa を参考にコミットしてくださいませ
=end

#12 Updated by Naohisa Goto over 2 years ago

%Fの指定をもっと大きく(2**31-1=2147483647)すると i686-linux でも再現しました。
既出のパッチで治ります。
こういう場合はテストを追加または変更すべきでしょうか?

% ruby -e 'Time.now.strftime("%2147483647F")'
-e:1: [BUG] Segmentation fault
ruby 1.9.4dev (2011-07-21 trunk 32598) [i686-linux]

-- Control frame information -----------------------------------------------
c:0004 p:---- s:0010 b:0010 l:000009 d:000009 CFUNC :strftime
c:0003 p:0023 s:0006 b:0006 l:00212c d:0008cc EVAL -e:1
c:0002 p:---- s:0004 b:0004 l:000003 d:000003 FINISH
c:0001 p:0000 s:0002 b:0002 l:00212c d:00212c TOP

PS. 火曜夜遅くにcvs-admin@ruby-langに必要事項をメールしました。

#13 Updated by Motohiro KOSAKI over 2 years ago

一週間たちましたが、こちら進捗はいかがでしょうか

#14 Updated by Naohisa Goto over 2 years ago

Motohiro KOSAKI wrote:

一週間たちましたが、こちら進捗はいかがでしょうか

無事にコミット権をもらえましたので、今日中にはtrunkとruby19_3両方にコミットします。

#15 Updated by Naohisa Goto over 2 years ago

  • Status changed from Assigned to Closed

This issue was solved with changeset r32757.
tadayoshi, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • strftime.c (NEEDS): avoid SEGV due to integer overflow in sparc-solaris2.10 and i686-linux. fix [Bug #4456]

Also available in: Atom PDF