Мы находимся в процессе преобразования проекта на основе 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