我在 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 模块中并在线程外的 Perl 中使用它也可以。但是如果我在 Perl 和线程中使用它,它会崩溃。
现在我会说那是因为我没有任何线程处理。但是,如果我查看其他 Perl 模块(例如 Crypt::OpenSSL::RSA),我也找不到那里的特殊线程处理。
我对 XS 很陌生,也许我错过了一些东西。也许有人可以给我一个提示,谢谢!