パスワードを忘れた? アカウント作成
398590 journal

hixの日記: エイリアスを大いに語る 11

日記 by hix
帝国軍の機械屋さんが外しておいたハイパードライブの線を繋ぎなおした気分。
# 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 のパッケージの作り方は、これから覚えなきゃならんので、出回っているパッケージは誰か治して。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

UNIXはただ死んだだけでなく、本当にひどい臭いを放ち始めている -- あるソフトウェアエンジニア

読み込み中...