Project

General

Profile

Actions

Bug #4456

closed

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

Added by tadf (tadayoshi funaba) about 13 years ago. Updated over 12 years ago.

Status:
Closed
Target version:
ruby -v:
-
Backport:
[ruby-dev:43284]

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


Files

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

Related issues 1 (0 open1 closed)

Related to Ruby master - Bug #4457: Time#strftime で %z 指定子などに大きな幅を指定した際の不具合Closedakr (Akira Tanaka)03/02/2011Actions

Updated by sorah (Sorah Fukumori) about 13 years ago

  • Status changed from Open to Feedback

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

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

Updated by naruse (Yui NARUSE) about 13 years ago

  • Status changed from Feedback to Open

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

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

Actions #3

Updated by naruse (Yui NARUSE) about 13 years ago

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

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

Updated by ngoto (Naohisa Goto) over 12 years ago

ruby_1_9_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 libc_psr.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_strftime_with_timespec
704 STRFTIME("%Y-%m-%d");
(dbx) where
current thread: t@1
[1] _memcpy(0x13b5abdda, 0xffbff3e4, 0x3, 0x32, 0x3b9ac9f6, 0xffbff344), at 0x7fb907f4
=>[2] rb_strftime_with_timespec(s = 0xffbff3e4 "2011-07-15", maxsize = 100U, format = 0x467fab "F", vtm = 0x486998, timev = 4U, ts = 0xffbff344, gmt = 0), line 704 in "strftime.c"
[3] rb_strftime_timespec(s = 0xffbff3e4 "2011-07-15", maxsize = 100U, format = 0x467fa0 "%1000000000F", vtm = 0x486998, ts = 0xffbff344, gmt = 0), line 793 in "strftime.c"
[4] rb_strftime_alloc(buf = 0xffbff3e0, format = 0x467fa0 "%1000000000F", vtm = 0x486998, timew = 2621443089986389401ULL, gmt = 0), line 4311 in "time.c"
[5] time_strftime(time = 4707408U, format = 4707720U), line 4564 in "time.c"
[6] call_cfunc(func = 0x1790c0 = &rubytime.c`time_strftime(VALUE time, VALUE format), recv = 4707408U, len = 1, argc = 1, argv = 0x2bd9f4), line 323 in "vm_insnhelper.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 "<bad address 0x3b5abde4>"

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

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

Updated by kosaki (Motohiro KOSAKI) over 12 years ago

  • Status changed from Closed to Open

Updated by kosaki (Motohiro KOSAKI) over 12 years ago

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

Updated by tarui (Masaya Tarui) over 12 years ago

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

Updated by tarui (Masaya Tarui) over 12 years ago

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

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

『後藤 直久さん』は

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

です。

樽家昌也(Masaya TARUI)
No Tool,No Life.

Updated by kosaki (Motohiro KOSAKI) over 12 years ago

2011年7月18日0:24 Masaya TARUI :

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

『後藤 直久さん』は

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

+1.

Updated by matz (Yukihiro Matsumoto) over 12 years ago

まつもと ゆきひろです

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

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

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

Updated by naruse (Yui NARUSE) over 12 years ago

  • Assignee changed from naruse (Yui NARUSE) to ngoto (Naohisa Goto)

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

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

Updated by ngoto (Naohisa Goto) over 12 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に必要事項をメールしました。

Updated by kosaki (Motohiro KOSAKI) over 12 years ago

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

Updated by ngoto (Naohisa Goto) over 12 years ago

Motohiro KOSAKI wrote:

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

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

Actions #15

Updated by ngoto (Naohisa Goto) over 12 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] [ruby-dev:43284]
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0