decodeの挙動が怪しい?

  • ページ: BugTrack2
  • 投稿者: ARAI?
  • 優先順位: 重要
  • 状態: 完了
  • カテゴリー: 本体バグ
  • 投稿日: 2005-03-06 (日) 16:03:44
  • バージョン: 1.4.5rc1 ~ 1.4.5_1

修正

メッセージ

http://cvs.sourceforge.jp/cgi-bin/viewcvs.cgi/pukiwiki/pukiwiki/lib/func.php.diff?r1=1.26&r2=1.27 以降、decodeが期待の動作をしない場合がある?ようです。

簡単な再現例として、1.4.5_1におけるPHPの「ページ名の変更」を 挙げておきます。

「以下のファイルをリネームします。」の所で、

  • PHP→新ページ名

のように表示されるべきところが、

  • →新ページ名

となります。

取り敢えず、decodeをlib/func.php 1.26版に戻すか、

return preg_match('/^[0-9a-f]+$/i', $key) ? pack('H*', "$key") : $key;

とすることで回避出来ます。


  • お知らせありがとうございます。$keyの値が数字のみの文字列である時の挙動が怪しそうです。どうしてpack() の第二引数をダブルクォーテーションでくくるだけで回避できるのでしょうね (^^; 型の問題(文字列であるかどうか)とは思いますが、マニュアルなど、各種確認します。 -- henoheno 2005-03-27 (日) 16:48:52
  • この挙動は、過去のソースで行われていた処理と同じ事をしても回避できるようです。 -- henoheno 2005-03-27 (日) 17:03:27
       return preg_match('/^[0-9a-f]+$/i', $key) ?
               substr(pack('H*', '20202020' . $key), 4) : $key;
  • この処理は cvs:func.php (r1.30) で追加されていて、そのコミットログに「avoid PHP pack() bug.」とあります。そういう事だったようです (^^; -- henoheno 2005-03-27 (日) 17:08:31
  • で、ぱんださんはこれ(対応)をどこで見つけたのだらう・・・ BugTrack/257 がきっかけの様ですが、それ以上の情報はありませんね。 -- henoheno 2005-03-27 (日) 17:09:26
  • PHPfunc:pack のコメントをあたっても、特にこの回避策は載っていないようでした。 -- henoheno 2005-03-27 (日) 17:24:36
  • えーと。
    • 原因1: pack('H*', $key)の$keyが数値のとき、期待した結果が得られません。
      • これについては、そういう仕様なのかどうかはわかりません。
    • 原因2: rename.inc.phpの290行目あたりで、配列の添え字をそのままpack()に渡しています。
      	foreach ($pages as $old=>$new)
      		$ret['body'] .= '<li>' .  make_pagelink(decode($old)) .
      配列の仕様によると

      あるキーが、整数の標準的な表現形式である場合、 そのように解釈されます。(つまり、"8"は 8として解釈されます。一方、 "08"は"08"として解釈されます。)

    • 回避方法:decode()関数側で、型キャストを使って文字列型にキャストしてしまうと間違いないかなと。
      return preg_match('/^(?:[0-9a-f]{2})+$/i', $key)
         ? pack('H*', (string)$key)
         : $key;
    • 実証コード:
      <?php
      $key = strtoupper(bin2hex('PHP'));
      var_dump($key);                     // string(6) "504850"
      
      $pack = pack('H*', $key);
      var_dump($pack);                    // string(3) "PHP"
      
      $arr = array($key => 'piyo');
      var_dump($arr);                     // array(1) {
                                          //   [504850]=>      <- !
                                          //   string(4) "piyo"
                                          // }
      
      foreach ($arr as $_key => $_value) {
        var_dump($_key);                  // int(504850)       <- !!
      }
      
      $pack = pack('H*', $_key);
      var_dump($pack);                    // string(0)         <- !!!
      
      $__key = (string)$_key;
      var_dump($__key);                   // string(6) "504850"
      
      $pack = pack('H*', (string)$_key);
      var_dump($pack);                    // string(3) "PHP"
      ?>
  • そうか、PHPも型キャストが使えたんだっけか (^^; intで値が来るのには気付いていましたが、配列の仕様通りの動作がきっかけだったのですね。丁寧なコメントありがとうございました。 -- henoheno 2005-03-29 (火) 00:16:03
  • PHP-4.3.11でpack()のバグが直ったらしいです。 -- okkez 2005-04-01 (金) 20:44:28
  • SxwmJLEkeKejGl -- DnLUXdqNliJijZqLG? 2014-01-31 (金) 21:55:31
  • qLKJzcwNlqTJkSsGX -- ygutzwevtbr? 2014-02-15 (土) 04:18:04
  • HfAdfvLut -- Xplbzfnh? 2014-02-15 (土) 18:37:19
  • bcElWYZNtXexq -- Qhhpbasf? 2014-03-18 (火) 15:14:12
  • rNYbCVUQjqheJZrTIdN -- Qaybqcnw? 2014-05-14 (水) 04:27:21
  • pTgXHCouUvulzmHS -- Bewbwbql? 2014-05-16 (金) 20:14:46
  • YkyFqFLJKa -- axrsvh? 2014-06-17 (火) 05:43:38
  • test -- 2014-06-17 (火) 08:50:26


トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2014-06-17 (火) 08:50:26
Site admin: PukiWiki Development Team

PukiWiki 1.5.2+ © 2001-2019 PukiWiki Development Team. Powered by PHP 5.6.40-0+deb8u7. HTML convert time: 0.225 sec.

OSDN