1

Perl-XS-Module 内で OpenSSL を使用しています。OpenSSL-API 関数を呼び出す C 関数があります。テスト目的では非常に簡単です (openssl の初期化、キーの読み取り、RSA オブジェクトの作成と使用、引数なし)。大きなチェックは不要で、アドレスとメモリは問題ありません。

XS は標準の h2xs で-lssl、 と-lcryptoがありMakefileます。

void _foo (void)
{
    unsigned char key [3000];
    memset (key, 0, 3000);
    printf ("\ninit=%d", SSL_library_init ());   // init
    FILE *f = fopen ("key.key","r");
    printf ("\nf=%d", f);
    int keysize = fread (key, 1, 3000, f);   // readin
    printf ("\nn=%d",keysize);
    fclose (f);
    printf ("\nkey=%s", key);

    BIO *bio = BIO_new_mem_buf (key, keysize);
    printf ("\nbio=%ld", bio);
    RSA *pk = (RSA *) PEM_read_bio_RSAPrivateKey (bio, NULL, NULL, NULL);
    printf ("\npk=%ld", pk);

    printf ("\nsz=%d" ,RSA_size(pk));  // ***** crash here if in a perl-thread
    printf ("\n\n");
}

純粋な C/C++ を実行すれば、それは機能します。XS-Module に入れておき、スレッド外の Perl で使用しても問題ありません。しかし、Perl とスレッド内にあるとクラッシュします。

これは、 thread-handlingがないためだと思います。しかし、他の Perl モジュール (Crypt::OpenSSL::RSA など) を調べてみると、特別なスレッド処理も見つかりません。

私は XS にかなり慣れていないので、何か見落としているかもしれません。多分誰かが私にヒントを与えることができます、ありがとう!

4

2 に答える 2