Мы находимся в процессе преобразования проекта на основе C ++ openssl в python с M2Crypto, и мы столкнулись с несколько необычной проблемой с подпрограммами BIO из M2Crypto. В частности, любой вызов BIO.readlines () навсегда зависает от файлового объекта.
Вот краткий пример того, что мы попробовали:
f = open('test.txt','w')
f.write('hello world\n')
f.close()
import M2Crypto.BIO
bio = M2Crypto.BIO.openfile('test.txt','r')
lines = bio.readlines()
# the above call hangs forever
Чтобы убедиться, что у нас не было ничего плохого в нашей установке OpenSSL, мы создали небольшую тестовую программу для чтения файла test.txt, который мы только что создали
#include <openssl/bio.h>
#include <openssl/err.h>
int main() {
const int maxrd = 4096;
char line[maxrd];
int rd;
BIO* bio = BIO_new_file("test.txt","r");
while((rd = BIO_gets(bio, line, maxrd)) > 0) {
printf("%s",line);
}
if (rd == -1) {
printf("BIO error %ld\n", ERR_get_error());
}
}
Нет проблем.
Мы изучали файл-обертку M2Crypto-0.21.1 / SWIG / _bio.i и думаем, что у нас есть представление об источнике проблемы. Строка 109 проверяет возвращаемое значение из BIO_gets ()
if (r < 0) {
// return Py_None
}
НО, справочная страница для BIO_gets () предполагает, что она может вернуть либо 0, либо -1, чтобы указать конец потока.
Я считаю, что это должно быть
if (r < 1) {
// return Py_None
}
Но хотел посмотреть, встречались ли другие - или мы ошибаемся в нашем понимании системы BIO_gets ().
--- Подробности ---
Pythong 2.7
M2Crypto 0.21.1
OpenSSL 0.9.8q-fips 2 декабря 2010
FreeBSD 8.2-RELEASE-p4