Linux 用の PHP 拡張機能:現実確認が必要です!
-
25-09-2019 - |
質問
さて、初めての機能的な 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する必要があります。