質問

さて、初めての機能的な PHP 拡張機能を作成しました。それは機能しましたが、それは概念実証にすぎませんでした。今、私は上司が望んでいることを実際に実行する別のものを書いています。

PHP に詳しい皆さんに私が知りたいのは、このコードが意味があるかどうかということです。といったことをしっかり把握できていますか? emalloc それとも、後で振り返って私の手を噛みちぎろうとする何かがそこにあるのでしょうか?

以下は関数の 1 つのコードです。これは、Blowfish で暗号化された文字列の Base64 を返します。関数が呼び出されるとき、暗号化およびエンコードするテキストと暗号化フェーズのキーという 2 つの文字列が渡されます。現時点では、それらへのリンク方法がわからないため、PHP 独自の Base64 関数は使用されていません。また、同じ理由で、PHP 独自の mcrypt 関数は使用されていません。代わりに、SSLeay にリンクします。 BF_ecb_encrypt 機能。

PHP_FUNCTION(Blowfish_Base64_encode)
{
    char *psData = NULL;
    char *psKey = NULL;
    int argc = ZEND_NUM_ARGS();
    int psData_len;
    int psKey_len;

    char *Buffer = NULL;
    char *pBuffer = NULL;

    char *Encoded = NULL;

    BF_KEY Context;

    int i = 0;

    unsigned char Block[ 8 ];
    unsigned char * pBlock = Block;

    char *plaintext;
    int plaintext_len;
    int cipher_len = 0;

    if (zend_parse_parameters(argc TSRMLS_CC, "ss", &psData, &psData_len, &psKey, &psKey_len) == FAILURE) 
        return;

    Buffer = (char *) emalloc( psData_len * 2 );
    pBuffer = Buffer;

    Encoded = (char *) emalloc( psData_len * 4 );

    BF_set_key( &Context, psKey_len, psKey );

    plaintext = psData;
    plaintext_len = psData_len;

    for (;;)
    {
        if (plaintext_len--)
        {
            Block[ i++ ] = *plaintext++;
            if (i == 8 )
            {
                BF_ecb_encrypt( Block, pBuffer, &Context, BF_ENCRYPT );
                pBuffer += 8;
                cipher_len += 8;
                memset( Block, 0, 8 );
                i = 0;
            }
        } else {
            BF_ecb_encrypt( Block, pBuffer, &Context, BF_ENCRYPT );
            cipher_len += 8;
            break;
        }
    }
    b64_encode( Encoded, Buffer, cipher_len );
    RETURN_STRINGL( Encoded, strlen( Encoded ), 0 );
}

2つ持っていることに気づくでしょう emalloc 呼びかける、のために Encoded そしてのために Buffer. 。のみ Encoded は呼び出し元に返されるため、Buffer が解放されないのではないかと心配しています。そうですか?malloc/freeを使用する必要がありますか Buffer?

他に明らかな間違いがある場合は、お知らせいただければ幸いです。

役に立ちましたか?

解決

  

私はEncodedためとBufferのための2つのemallocコールを、持っていることに気づくでしょう。私はEncodedが解放されないことを懸念していますので、のみBufferは、呼び出し側に渡されます。それはケースですか?私はmallocためfree / Bufferを使用する必要がありますか。

はい、あなたが返す前にefreeでそれを解放する必要があります。

PHPはemallocに割り当てられたセーフティネットとメモリはリクエストの終了時に解放されますがありますが、それはメモリリークが発生するのはバグだと、あなたはreport_memleaks = Onでデバッグビルドを実行している場合は警告します依存します。

他のヒント

におけるemalloc()割り当て要求ごとのメモリ、そして、それは無料です()は、自動的に「Dランタイム両端ます。

ただし、

とPHPをコンパイルする必要があります
  

- 有効デバッグ--enable-メンテナ-ZTS

これは、(あなたのphp.iniで設定されているあなたはE *()関数とreport_memleaksを使用した場合、それはメモリリークを検出することができます)何かがうまくいかない場合は、あなたを教えてくれます。

そして、はい、あなたは)(バッファーをefreeする必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top