現在、C ++のopensslベースのプロジェクトをM2Cryptoを使用してpythonに変換しているところですが、M2CryptoのBIOルーチンを使用するとやや珍しい問題が発生しました。具体的には、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()システムの理解に誤りがないかどうかを確認したかったのです。
---詳細---Pythong2.7 M2Crypto 0.21.1 OpenSSL0.9.8q-fips2010年12月2日FreeBSD8.2-RELEASE-p4