パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

PHP 5.3.7に重大なバグ、strncatの罠にはまる」記事へのコメント

  • by Anonymous Coward

    リンクの解説読みましたけど、問題は

    strncat(passwd, "$", 1);

    strlcat(passwd, "$", 1);
    に、変更したことのようですから、正確には「strlcatの罠」じゃないですかね?

    strcat→strncatの時点ではバグってないわけで。

    • Re: (スコア:5, 興味深い)

      まあ仰ることも間違いではないのですが、C言語界の背景というか
      strncatのsize指定が「意外性最小原則にそぐわない」仕様だということで
      数々のバグの発生源となっており、散々非難されてきた、という今までの経緯があるのです。

      で、srtncat使用者はそこを注意して使用してたけど、後からそれをstrlcatに置き換えた人は
      そんな罠があったと知らず、何も考えずそのまま関数だけ置き換えてしまったと。

      ある意味、strncatというのは関数自体がバッドノウハウ的な存在なのですね。
      まさにバッドノウハウ的対応が、たとえその場は良くても将来に問題を引き起こすという好例となってしまったということでしょう。

      • 文字列を安全にくっつける用途では罠が多いけど、バイナリとかでちょうどnバイト埋めたいって用途の場合はむしろ自然な仕様なんじゃないかと思う。

        # けれど、文字列に使われることの方が圧倒的に多いのでやっぱ悪か?

        --
        1を聞いて0を知れ!
        • by Anonymous Coward

          strncpyと勘違いしてない?
          # strncpyの仕様は当時まだ生き残っていた固定長レコード向けのもので、断じてセキュリティのためではない。

          • strncpyと似たものだから、似たような用途かと思ったのだけど。

            --
            1を聞いて0を知れ!
            • Re: (スコア:1, すばらしい洞察)

              by Anonymous Coward
              そうやってちゃんとマニュアル読まなかったのがまさにバグの原因
              • Ubuntuのuniverse/docにあるmanpages-ja-dev 0.5.0.0.20080615-1を確認した上で書いたけど。
                挙動は当然書いてあったけど、それを何に使うためのものかまでは書いてなかった。

                読んでおくことが推奨されるマニュアルで、strncatの挙動ではなく用途まで記述されているものがあるというのなら、教えてくださいな。
                ないと思うけど。

                --
                1を聞いて0を知れ!
              • by Anonymous Coward
                ウィキにも書いてある。

                strncpy
                strncpy writes exactly the given number of bytes, either only copying the start of the string if it is too long, or adding zeros to the end of the copy to fill the buffer. It was introduced into the C library to deal with fixed-length name fields in structures such as directory entries. Despite its name it is not a bounded version of strcpy, it does not guarantee that the result is a null-terminated string. The name of the function is misleading because strncat and snprintf are
              • まさか、人に不勉強を指摘するコメントで、Wikipediaのことをウィキと略してるってことはないよね?

                > The name of the function is misleading because strncat and snprintf are respectively bounded versions of strcat and sprintf.
                っつーのは、そのWiki書いてる人の解釈でしかないようにしか読めない。

                俺には、strncpyに対するものとしてNUL終端するとは限らないstrncatとNUL終端するsnprintfを同列に書いているのはミスリーディングに見えるし、
                strncatの挙動がstrncpy(NUL終端するとは限らない。指定したサイズに達するまでNULで埋める)かsnprintfかどっちに近いと聞かれると、俺ならstrncpyに近いと答える。
                別に、俺の見方が正しいというつもりはないが、どこかのWikiに書いてあることも、書いた人の印象でしかない。

                --
                1を聞いて0を知れ!
              • by Anonymous Coward
                ウィキと書いたのはもちろん君をバカにするためだが、まさかマニュアルを読んでこの理解とは恐れ入った。全面降伏するよ。

                > NUL終端するとは限らないstrncat
              • > ウィキと書いたのはもちろん君をバカにするためだが

                それで人をバカにできたと思えるのはすごい。

                --
                1を聞いて0を知れ!
              • by Anonymous Coward on 2011年08月25日 1時19分 (#2008891)
                皮肉も通じない並外れたバカのために、ウィキ(笑)とでも書いときゃよかったか。
                それはいいからつまらないバグで他人に迷惑をかける前にちゃんとマニュアル読んどけよ。って偉そうに読んだと宣言した上での恥だったな(笑)
                親コメント
              • by Anonymous Coward

                通りすがりだけど・・・
                いや、ちょっと・・・面白いな君・・・

にわかな奴ほど語りたがる -- あるハッカー

処理中...