[#32185] Date#+に大きな数字を与えるとおかしな日付に — "madoka yamamoto" <yamamotomadoka@...>

こんにちは、山本と申します。

26 messages 2007/11/08
[#32186] Re: Date#+に大きな数字を与えるとおかしな日付に — Tadayoshi Funaba <tadf@...> 2007/11/08

> Dateオブジェクトに+で大きな数字を与えるとおかしくなるようです。

[#32188] Re: Date#+に大きな数字を与えるとおかしな日付に — "madoka yamamoto" <yamamotomadoka@...> 2007/11/09

山本です。

[#32191] Re: Date#+に大きな数字を与えるとおかしな日付に — tadf@... 2007/11/09

> アルゴリズムの意味がわからないで書いた、表層的なパッチなので

[#32194] Re: Date#+に大きな数字を与えるとおかしな日付に — Yukihiro Matsumoto <matz@...> 2007/11/09

Hi,

[#32200] Re: rational (Re: Date#+に大きな数字を与えるとおかしな日付に) — Tadayoshi Funaba <tadf@...> 2007/11/10

> 1.9ではRationalとComplexを組み込みに、という話はありましたが、

[#32225] Re: rational (Re: Date#+に大きな数字を与えるとおかしな日付に) — Shin-ichiro HARA <sinara@...> 2007/11/12

原です。

[#32198] [提案] Array#tail — "Yusuke ENDOH" <mame@...>

遠藤と申します。

21 messages 2007/11/09
[#32199] Re: [提案] Array#tail — Yukihiro Matsumoto <matz@...> 2007/11/10

まつもと ゆきひろです

[#32352] 1.9.1のリリース時期について — KIMURA Koichi <hogemuta@...>

木村です。

16 messages 2007/11/24
[#32353] Re: 1.9.1のリリース時期について — Yukihiro Matsumoto <matz@...> 2007/11/24

まつもと ゆきひろです

[#32403] Next 1.8.6 patch release? (was Re: 1.9.1のリリース時期について) — Takahiro Kambe <taca@...>

こんばんは。

32 messages 2007/11/29
[#32414] Re: Next 1.8.6 patch release? (was Re: 1.9.1のリリース時期について) — Urabe Shyouhei <shyouhei@...> 2007/11/30

卜部です。

[#32444] Re: Next 1.8.6 patch release? (was Re: 1.9.1のリリース時期について) — Yukihiro Matsumoto <matz@...> 2007/12/03

まつもと ゆきひろです

[#32488] Re: Next 1.8.6 patch release? (was Re: 1.9.1のリリース時期について) — Urabe Shyouhei <shyouhei@...> 2007/12/08

卜部です。

[#32525] Re: Next 1.8.6 patch release? (was Re: 1.9.1のリリース時期について) — "Yusuke ENDOH" <mame@...> 2007/12/10

遠藤と申します。

[#32643] Re: Next 1.8.6 patch release? (was Re: 1.9.1のリリース時期について) — "Yusuke ENDOH" <mame@...> 2007/12/19

遠藤です。

[#32409] Re: [ruby-cvs:21293] Ruby:r14056 (trunk): * signal.c (trap_signm): SIGVTALRM no longer used for green — SASADA Koichi <ko1@...>

 ささだです.

10 messages 2007/11/30

[ruby-dev:32296] CGI::Session::FileStore のデータが壊れる

From: とみたまさひろ <tommy@...>
Date: 2007-11-14 23:19:13 UTC
List: ruby-dev #32296
とみたです。

1.8.6 で CGI::Session::FileStore のデータが壊れることがあります。

 * LOCK_EX を獲得できてないのにファイルの内容を消している。

412:	  f = File.open(@path, File::CREAT|File::TRUNC|File::RDWR, 0600)
413:	  f.flock File::LOCK_EX

 * finalizer から呼ばれる時、ファイルの内容が中途半端になることがある。

こっちの原因は良く分かりませんが、@hash の内容をファイルに出力している
時に何かが起きて途中までになってしまうようです。CGI が終了しないうちに
ブラウザが別のリンクを押した等で、CGI が SIGPIPE になった場合に発生する
みたいです。

ということで、次のようにしてみたらうまく動いているようです。

--- session.rb.orig	2007-02-13 08:01:19.000000000 +0900
+++ session.rb	2007-11-15 07:49:17.000000000 +0900
@@ -391,8 +391,9 @@
 	unless @hash
 	  @hash = {}
           begin
+            lockf = File.open(@path+".lock", "r")
+            lockf.flock File::LOCK_SH
 	    f = File.open(@path, 'r')
-	    f.flock File::LOCK_SH
 	    for line in f
 	      line.chomp!
 	      k, v = line.split('=',2)
@@ -400,6 +401,7 @@
 	    end
           ensure
 	    f.close unless f.nil?
+            lockf.close if lockf
           end
 	end
 	@hash
@@ -409,13 +411,17 @@
       def update
 	return unless @hash
         begin
-	  f = File.open(@path, File::CREAT|File::TRUNC|File::RDWR, 0600)
-	  f.flock File::LOCK_EX
+          lockf = File.open(@path+".lock", File::CREAT|File::RDWR, 0600)
+	  lockf.flock File::LOCK_EX
+          f = File.open(@path+".new", File::CREAT|File::TRUNC|File::WRONLY, 0600)
    	  for k,v in @hash
 	    f.printf "%s=%s\n", CGI::escape(k), CGI::escape(String(v))
 	  end
+          f.close
+          File.rename @path+".new", @path
         ensure
-          f.close unless f.nil?
+          f.close if f and !f.closed?
+          lockf.close if lockf
         end
       end
 
@@ -426,6 +432,8 @@
 
       # Close and delete the session's FileStore file.
       def delete
+        File::unlink @path+".lock" rescue nil
+        File::unlink @path+".new" rescue nil
         File::unlink @path
       rescue Errno::ENOENT
       end


-- 
とみたまさひろ <tommy@tmtm.org>
3469 42CC 4D32 F53C AD98  65A5 8C37 FF09 69C1 6040

In This Thread

Prev Next