Я работаю с OpenSSL внутри модуля Perl-XS. У меня есть C-функция, которая вызывает функции OpenSSL-API. Это очень просто для целей тестирования (инициализация 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 и, возможно, что-то упускаю. Может кто подскажет, спасибо!
bio
илиpk
NULL
, но я предполагаю, что вы убедились, что ниbio
, ниpk
не являютсяNULL
. - person ikegami   schedule 25.08.2016