hixの日記: エイリアスを大いに語る 11
# EPI.Vの最後のほう
friio買った。白凡と黒凡。てきとーな計算機でWindowsでの正常動作を確認した。
LinkStation HS-DHGL( kuro-box 玄箱PRO と中身一緒)に繋げた。
でも動かねぇ...orz。
lennyにする必要はあるけど、OABIにする必要がある なんて情報を拾ったりして。
# EABIのままイケます(今のところ)
ここで報告されている事例がウチにも出ちゃった。
recfriio して B25デコードしようとすると、
winscard_svc.c:565:MSGCheckHandleAssociation() Client failed to authenticate
のエラーが出る。
PCSC-Liteのライブラリの動きが怪しい。
全く別の視点からプログラムを追ってmutexの使い方がよろしくない問題点を指摘してくれている人が居るが、結果的には違う現象だった(これもいずれは対策しないと具合が悪いかも知れない)。
さて問題の場所。
winscard_clnt.c
SCardTransmit()に、
2894 unsigned char buffer[sizeof(sharedSegmentMsg) + MAX_BUFFER_SIZE_EXTENDED];
2895 transmit_struct_extended *scTransmitStructExtended = (transmit_struct_extended *)buffer;
2896 sharedSegmentMsg *pmsgStruct = (psharedSegmentMsg)buffer;
2897
2898 scTransmitStructExtended->hCard = hCard;
2899 scTransmitStructExtended->cbSendLength = cbSendLength;
というコードがある。
構造体 transmit_struct_extended は、winscard_msg.h で定義されていて、
struct transmit_struct_extended
{
int32_t hCard;
uint32_t pioSendPciProtocol;
uint32_t pioSendPciLength;
uint32_t cbSendLength;
uint32_t pioRecvPciProtocol;
uint32_t pioRecvPciLength;
uint32_t pcbRecvLength;
uint32_t rv;
uint64_t size;
uint8_t data[1];
};
typedef struct transmit_struct_extended transmit_struct_extended;
2898行目で設定された hCard は、2899行目が動いた瞬間に、違う値になる。例えば、0x00011D90 だったのが、0x1D900001 になる。
構造体を見れば、cbSendLength が hCard に干渉するはずが無い。
ああ恐ろしあ。天狗じゃー天狗の仕業じゃー。
構造体をダンプしてみた。
値がおかしくなる前の段階で、メンバ hCard のダンプは、01 00 00 00。hCardとして見たら 0x00011D90が返る。まてまて。
unsigned char なバッファを構造体にエイリアスしているのに問題がある。
対処方法は、CFLAGS に -fno-strict-aliasing を追加。
# このオプションも、エイリアスの否定なのか、エイリアスを最適化の否定なのか、イマイチわかりにくい名前だ。
configure しても付かないコンパイルオプションなので、出来上がった Makefile を手で直す。
何か方法が有るのかも知れないけど、とりあえず。
debian のパッケージの作り方は、これから覚えなきゃならんので、出回っているパッケージは誰か治して。
ぬ、configure でもつかないですか (スコア:1)
とりあえず、後でバグ報告やってみましょうか。
Re:ぬ、configure でもつかないですか (スコア:1)
configure の仕組みも良く解っていなかったりします。
...って中身のことではなく、./configure する時のオプションという事なら、多分無かったと思います。
いやしかし、アーキテクチャの違いでこんな事になるとは...。
Re:ぬ、configure でもつかないですか (スコア:1)
バグ番号が分かったらコメントさせてもらいます。
僕は C とか「まったく」分かって無いので、ツッコミはお願いしますね :-)
Re:ぬ、configure でもつかないですか (スコア:1)
Re:ぬ、configure でもつかないですか (スコア:2)
Re:ぬ、configure でもつかないですか (スコア:1)
本業のほうが煮詰まっていて、録画機の開発まで手が回っていないんですけど、勢いが出たら再開しようと存じます。
オープンソースって、こんな風に、自然療養みたいな感じでだんだんと直っていくから、良いですね。
Re: (スコア:0)
lennyの導入には、NAS Centralに置いてあるLenny-armel image 0.3.2を利用しました。
pcscdのバージョンは1.4.102-1です。
ソースパッケージの中のパッチ(pcsc-lite_1.4.102-1.diff.gz)を調べてみると、
+CFLAGS += -Wall -D_REENTRANT
と、まだパッチが適用されていませんでした。そこで、投稿どおり修正をしたのですが、コンパイル中にエラーメッセージが表示されます。(後半のオプションが認識されていないようです。)
パッケージは作成されますが、b25の実行をするとやは
ありがとうございます (スコア:1)
ここで嵌って頓挫してしまう人が減れば、面白い物を作ってくれる人が出るかも知れませんし。
Re:ありがとうございます (スコア:1)
どのバージョンのパッケージ(or ソース)でこの現象が起きたかを教えていただけますか?
お手数をお掛けします (スコア:1)
その後に、パッケージを remove して、ソースからビルドを試みた時に使用したのは、pcsc-lite-1.4.102.tar.bz2 です。
行番号は、vi で set number して表示させた物をそのまま使いました。
ARMなコンピュータは、皆さん持ってるとは限りませんからねえ。
Re:お手数をお掛けします (スコア:1)
lenny リリースには間に合いませんが、とりあえず進めようとはしているということでご容赦を。
何かあればメールでご連絡くださいませー