[ アカウントをゲット! ]
帝国軍の機械屋さんが外しておいたハイパードライブの線を繋ぎなおした気分。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 のパッケージの作り方は、これから覚えなきゃならんので、出回っているパッケージは誰か治して。
このページのすべての商標と著作権はそれぞれの所有者が有します。
コメントやユーザ日記に関しては投稿者が有します。
のこりのものは、© 2001-2010 OSDN です。
ぬ、configure でもつかないですか (スコア:1)
とりあえず、後でバグ報告やってみましょうか。
コメントを書く
Re:ぬ、configure でもつかないですか (スコア:2)
コメントを書く
親コメント