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

iOS7.0.6で修正された「最悪のセキュリティバグ」はありがちなコーディングミスで発生していた」記事へのコメント

  • 警告を無視しちゃいかんという教訓を得たと。

    こんな感じに、if分を一行にまとめてしまえば、こんな不具合出なかった気がします。

    if ((err = SSLHashSHA1.update(&hashCtx, &serverRandom)) != 0) goto fail;
    if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0) goto fail;
    if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0) goto fail;

    一行が長くなるのを嫌ったのかな?

    • by Anonymous Coward

      #define ErrorCheck(f) do { if ((err = f) != 0) goto fail; } while (0)

      ErrorCheck(SSLHashSHA1.update(&hashCtx, &serverRandom));
      ErrorCheck(SSLHashSHA1.update(&hashCtx, &signedParams));
      ErrorCheck(SSLHashSHA1.final(&hashCtx, &hashOut));

      ってやりたくなるんだけど、ダメ?

      • by Anonymous Coward on 2014年02月25日 0時46分 (#2551179)

        このコードはCではなくてC++なのでは。SSLHashSHA1.updateはメンバ関数を呼び出している様に見えるけど
        同じディレクトリにcppファイルもあるみたいだし。
        C++11以降が使える処理系なら、こんなふうにgotoを使わずにラムダ式でreturnしたほうがいいのでは。
        int err
        const bool flag=[&](){
                        if((err=SSLHashSHA1.update(&hashCtx, &serverRandom))!=0){return false;}
                        if((err=SSLHashSHA1.update(&hashCtx, &signedParams))!=0){return false;}
                        if((err=SSLHashSHA1.final(&hashCtx, &hashOut))!=0){return false;}
                        return true;
        }();

        親コメント
        • "."が使われている場合でも、C++のメンバ関数ではなく
          構造体のメンバに関数ポインタがあり、それを呼び出しているだけの可能性もあるので
          呼び出し側だけではC++noコードだとは判断が付きません。

          その構造体の定義は見つける前にGive upしましたが、関数ポインタをメンバに持つ似たような構造体定義は同じディレクトリの
          sslTypes.h [apple.com]の下の方にもあります。

          親コメント
        • by Anonymous Coward

          せっかく劣ったコンパイラを考慮する必要のない環境なのにねえ。

Stay hungry, Stay foolish. -- Steven Paul Jobs

処理中...