更新衝突が検出されず上書きされてしまうことがある

修正

PHPでは文字列と数値を(強引に)比較させる事は可能であるが、(文字列の型が自動的に変換された結果)数値0に評価される事があるため、意図しない結果をもたらす事がある。 http://jp2.php.net/manual/ja/language.types.string.php#language.types.string.conversion

メッセージ

同時更新の衝突(コリジョン)が検出されず、 先に書かれた内容が後から書かれたもので 上書きされてしまうことがありました。

調べてみたところ、 lib/html.php の edit_form で生成されている $digest ですが、 数値比較で 0 だと判断される md5 文字列の場合 *1に 再初期化となっているのが原因ではないかと考えました。

対策コードの差分は以下の通りです。

lib/html.php

 // Show 'edit' form
-function edit_form($page, $postdata, $digest = 0, $b_template = TRUE)
+function edit_form($page, $postdata, $digest = "", $b_template = TRUE)
 {
 	global $script, $vars, $rows, $cols, $hr, $function_freeze;
 	global $_btn_addtop, $_btn_preview, $_btn_repreview, $_btn_update, $_btn_cancel,
 		$_msg_help, $_btn_notchangetimestamp;
 	global $whatsnew, $_btn_template, $_btn_load, $non_list, $load_template_func;
 	global $notimeupdate;
 
 	$refer = $template = $addtag = $add_top = '';
 
-	if ($digest == 0) $digest = md5(join('', get_source($page)));
+	if ($digest == "") $digest = md5(join('', get_source($page)));
 
 	$checked_top  = isset($vars['add_top'])     ? ' checked="checked"' : '';
 	$checked_time = isset($vars['notimestamp']) ? ' checked="checked"' : '';



*1 例えば"abcdefabcdefabcdefabcdefabcdefab"等

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2005-04-23 (土) 20:51:33
Site admin: PukiWiki Development Team

PukiWiki 1.5.4+ © 2001-2022 PukiWiki Development Team. Powered by PHP 8.2.12. HTML convert time: 0.233 sec.

SourceForge