Мы находимся в процессе преобразования проекта на основе openSl на C++ в python с M2Crypto, и мы столкнулись с несколько необычной проблемой с подпрограммами BIO из M2Crypto. В частности, любой вызов BIO.readlines() вечно ведется в файловом объекте.M2Crypto BIO.readlines висит, python 2.7
Вот краткий пример того, что мы пытались:
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-ФИПС 2 дек 2010 FreeBSD 8.2-RELEASE-p4
BTW - я не знаю, разработчик Хейкки лично ... но его проект M2Crypto абсолютно фантастическим. Это не только исключительная реализация оболочки Python/OpenSSL, но и пример ПРАВОГО способа создания SWIG-кода - чистый, простой, доступный и т. Д. Хорошо, сэр. – user590028