stuncloud / UWSCR

UWSC互換スクリプト実行ツール
MIT License
54 stars 5 forks source link

バイト配列型VARIANTの変換処理が不正 #200

Open cocco84 opened 3 months ago

cocco84 commented 3 months ago

概要

5行目: binary = .responseBody [VARIANT変換エラー] 不正なVARIANT型(13)  が出ます

正確に言えばprint もできなかったので代入に限らず取り扱いそのものの問題でしょうか? responseTextは問題ありませんでした

再現スクリプト

url = "https://hoge.com/fuga.png"
with createoleobj("Msxml2.XMLHTTP")
    .open("GET", url, FALSE)
    .send()
    binary = .responseBody
endwith

再現手順

No response

回避方法

No response

備考

No response

バージョン

1.0.2

不具合発生環境

No response

stuncloud commented 3 months ago

@cocco84 VARIANT変換の実装漏れです VARIANT型の変数はprintや代入など、その値にアクセスする際に該当するUWSCRデータ型に変換を行うのですが、バイナリに対しての変換処理がそもそも実装されていなかったため不正なVARIANT型と判定されています

対策

stuncloud commented 3 months ago

.responseBodyVAR_ARRAY or VAR_BYTE

VARIANTのバイト配列がUWSCR型に変換されるとVARIANTの配列になっている しかしそのvtが異常で、example.comのresponseBodyの冒頭は以下のようになっている

print .responseBody
// [VARIANT(60), VARIANT(33), VARIANT(100), VARIANT(111), ...]

どうやらこれはバイト値がそのままvtとなっているためで、取りうる値によっては不正なVARIANT型エラーとなるものと考えられる

変換処理は要調査

stuncloud commented 3 months ago

タイトル変更しました

stuncloud commented 2 weeks ago

調査結果

vtがVT_ARRAYであるためVARIANT::Anonymous::Anonymous::Anonymous::parrayからSAFEARRAYのポインタを得て、その中のVARIANTをそれぞれObjectに変換する処理を行っているが、SAFEARRAYから取り出したVARIANTがすでに壊れている?のでどうにもならない SafeArrayGetElementによるコピーもSafeArrayAccessDataでの直アクセスでもうまくいかない 原因が不明なのでwindows-rsのアップデートで解消されることに期待し、ひとまず調査は打ち切り

対応

windows-rsのアップデート ただし、現行バージョンは破壊的変更を伴うのですぐにはできない v2対応になるかも

検証用スクリプト

stream = createoleobj("ADODB.Stream")
stream.open()
stream.type = 2
stream.writetext("abc")
stream.position = 0
stream.type = 1
bytes = stream.read(stream.size)
stream.close()

expected = [255,254,97,0,98,0,99,0,]
print 'returned: ' + bytes
print 'expected: ' + expected
print 'result  : ' + (bytes == expected)