($autolink > 0) ページ名が「整数」のページを作成したときに、 recent プラグインなどにページ名が正しく反映されない

修正

(1.4.7)

この件は BugTrack2/151 の対策中に発生した不具合の修正です。

  1. PHPの配列のキーに「整数として解釈できる文字列」を与えた場合、それは整数になります。これはPHP言語における配列の仕様のようです。
  2. PHP の標準関数 array_splice() に以下の様に配列を与える場合、そのキーに整数が含まれているとキーが保存されません。結果的に、連想配列の key=>value の関係を維持できない可能性が生じます。これはarray_splice() 関数の仕様のようです。
test.php
<?php
$a = array();
$a['dfsfsd'] = 1148083281;
$a['5344']   = 1148083151;
$a['88']     = 1148000281;
var_dump($a);

$a = array_splice($a, 0, 3);
var_dump($a);
?>
出力結果
array(3) {
  ["dfsfsd"]=>
  int(1148083281)
  [5344]=>           <= この時点で文字列ではない
  int(1148083151)
  [88]=>
  int(1148000281)
}
array(3) {
  ["dfsfsd"]=>
  int(1148083281)
  [0]=>              <= 整数の添え字がクリアされている
  int(1148083151)
  [1]=>              <=
  int(1148000281)
}
実際の修正内容
 	// Cut unused lines
-	$recent_pages = array_splice($recent_pages, 0, $maxshow + PKWK_MAXSHOW_ALLOWANCE);
+	// BugTrack2/179: array_splice() will break integer keys in hashtable
+	$count   = $maxshow + PKWK_MAXSHOW_ALLOWANCE;
+	$_recent = array();
+	foreach($recent_pages as $key=>$value) {
+		unset($recent_pages[$key]);
+		$_recent[$key] = $value;
+		if (--$count < 1) break;
+	}
+	$recent_pages = & $_recent;

メッセージ

bugtrack プラグインで、ページ名に数値 (9 とか 99 とか) を指定すると、 ページは正しく作成されるのですが、最新の ?? 件に 0 とか 1 とかの 存在しないページ名が表示されてしまいます。



トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-07-13 (土) 09:35:03
Site admin: PukiWiki Development Team

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

SourceForge