トップ 差分 一覧 Farm ソース 検索 ヘルプ RSS ログイン

BugTrack-wiki/244

ページの作成や編集にはユーザ登録が必要です。

CGI::Sessionのバグにより、ログアウト時にエラーが発生する事があるらしい。Windows環境で報告ありBBS-サポート掲示板/409

  • 投稿者: typer
  • カテゴリ: 本体
  • 優先度: 普通
  • 状態: リリース済
  • 日時: 2005年06月04日 00時25分41秒

 内容

事象

ログアウト時に、

Software error:could not flush: Couldn't unlink log\cgisess_a2741ab524622e4a4052bc092c6f4546: The system cannot find the file specified. at lib/Wiki.pm line 1674

というようなエラーが発生するようです。ただし、ログアウトは正常に行なわれているようです。

対処方法

fswikiに附属のCGI::Sessionを3.94からバグフィックスされた最新の3.95にすることで解決できると思います。

原因

ログアウトの処理を行なうplugin/admin/Login.pmで、

$session->delete();
$session->flush();

と、セッションファイルを破棄する処理が行なわれていますが、この時点でエラーは発生しません。しかし、その後のcgi終了時に、CGI::Sessionオブジェクト$sessionが破棄されるとCGI::Sessionのバグによりエラーが発生します。

CGI::Sessionオブジェクトは破棄される際にデストラクタであるDESTROYメソッド内でflushメソッドを呼びますが、前回のflushメソッドで内部ステータスが変更されておらず、すでに消したセッションファイルを消そうとして失敗するため、上記メッセージでcroak(Carpモジュールによりインポートされるdie相当の関数)が呼ばれてエラーが発生します。

ただし、手元の環境(FreeBSD 5-stable, Perl 5.8.6)ではcroakによりエラーは発生せず、ログにメッセージも残されません。しかし、croakをwarnまたはdieに変える事でエラーが発生する事を確認しました。

回避策

lib/CGI/Session.pmに以下のパッチを当てることで回避できます。これは3.94→3.95のバグフィックスと同じ方法で、おそらく副作用はないと思われます。

--- lib/CGI/Session.pm.orig	Fri Jun  3 22:23:37 2005
+++ lib/CGI/Session.pm	Sat Jun  4 00:23:15 2005
@@ -429,10 +429,10 @@
 
   if ( $status == MODIFIED ) {
       $self->store($self->id, $self->{_OPTIONS}, $self->{_DATA}) or return;
-      $self->{_STATUS} = SYNCED;      
   } elsif ( $status == DELETED ) {
       $self->remove($self->id, $self->{_OPTIONS}) or return;
   }
+  $self->{_STATUS} = SYNCED;      
   return 1;
 }
 

 コメント

  • 3.5.10で修正しました。 - たけぞう (2005年12月04日 16時19分22秒)
お名前: コメント:

最終更新時間:2005年12月04日 16時19分47秒