「なでしこv1」開発掲示板

なでしこv1のバグや要望を書き込む掲示板
[一覧へ] > (@762) [緊急] [未処理]
@762■ (#2402) ハッシュ変換時に文字列に制御文字が含まれているとフリーズ - canot (2015-03-29 22:17) /緊急 未処理
【症状】
「メディアタグ取得」の命令で取得したID3タグの中に
制御文字「COMM」や「TPE2」のあとにそのあとに続く項目のサイズを指定するバイトコードが混ざることがある。
これを含むハッシュを文字列にキャストし、そこからまたハッシュに変換しようとするとハッシュ変換命令が暴走する。

関数にハッシュを渡す時、ハッシュはどうしても一度文字列型にキャストされているようで、関数を利用する限り回避できない。

【再現方法】
下記のファイルをスクリプトと同じ位置に配置してください

http://drowsepost.com/sample/bugs/bug1.txt
http://drowsepost.com/sample/bugs/bug2.txt

#サンプル====================================
Sとは文字列 = 「bug1.txt」を開く
Hとはハッシュ = Sをハッシュ変換
Hとメモ記入
#サンプル====================================

【要望】
1:制御文字がなでしこの動作に影響しないようにしてください
2:ハッシュ変換のコードがフリーズしないようにしてください
3:ハッシュ型の変数を関数に渡す時、文字列型にキャストしないように(内部的にハッシュ変換が呼ばれないように)してください

【バージョン】1.550
【その他】
ファイルによっては結構危険なのではないかとおもい
優先度を緊急にさせていただきました。
なにとぞよろしくお願い申し上げます。

(#2403) ハッシュ変換時に文字列に制御文字が含まれているとフリーズ - うぇいく (2015-04-18 10:45) /緊急 未処理
3に関するサンプルはありますか?
受け取る側の関数で変換しているか、関数を宣言する際に型を指定してない限り、型は変換されません。その関数が文字列に変換しているとしたら、文字列が入力ではないと処理ができない(と考えられて設計されている)ためと思います。
具体的に、どの関数でどう困っているのか、どう動作するのが良いのかがあれば、検討・対応可能かもしれません。
(ユーザ関数を定義して変数型確認などで関数全般の話なのか、個々の関数の仕様なのか、試してみてください。例えば、以下ではハッシュと表示されると思います。
-----
Aとはハッシュ
Aでテスト関数
●テスト関数(Bで)
 Bの変数型確認を言う
-----

なお、メモ記入の引数は文字列である必要があります。テキストエディタはテキスト(=文字列)以外をどう扱ってよいのか知りません。もし、ハッシュうけとって編集してハッシュを返すとうなエディタのようなものがあるとしたら、プロパティエディタのような感じになると推測できます。
(なお、通常、ハッシュは配列と違い、内容に順序を持たない(維持しない)ことも注意が必要です)

1と2については調べて対策するようにします。

なお、改行や「=」という、特定の文字コードで意味のある文字に依存している以上、制御コードや文字コードに存在しない文字については、期待している通りに処理できる保証はできません。特に、Shift_JISであるこが前提となっているため、場合によってうまく動かないなどの場合には、Shift_JISの文字に絞り込んでください(バイナリ対応の一部の命令を除いてバイナリを正しく扱えません。特に、$00で切れてしまったりとかします)

今回の場合ですと、おそらく、文字コード$00までが扱いたいデータで、その後ろはゴミっぽい感じがします。以下のような関数で切り出してから処理してみてください。
----
●ゴミ除去({参照渡し}Sから)
 Iとは整数
 IはSで「{\\0}」が何バイト目
 もし、Iが2以上ならば、
  SはLEFTB(S,I-1)
 違えばもし、Iが1ならば、
  Sは``
 それはS
-----
ここで使用している、「何バイト目」と「LEFTB」は、(数少ない?)バイナリを扱える命令です。

(#2404) 3の再現性につきまして - canot (2015-04-21 23:42) /緊急 未処理
うぇいくさま
大変ご丁寧な対応ありがとうございます。
先日本件の開発者グループへの書き込みが通知され
とても感動していたところでした。

こちらでも本件解決してみようとGITHUBのコードをしばらく眺めてみたのですが
なかなかキモになりそうな部分を見つけられず、
あまりお役に立てず申し訳ありません

>3に関するサンプルはありますか?
申し訳ありません、$00の問題を見つけて喜んでしまい、コードを保存していなかったようです。
たしかにハッシュをシンプルに利用すると型変換が発生しないようですね。

もしかすると「メディアタグ取得」の返り値が「ハッシュ形式の文字列」であったため、むしろ変換せずに渡してしまっていたかもしれません。

>特定の文字コードで意味のある文字に依存している
「ゴミ除去」のコード大変参考になりました。
何とか自力で除去しようと四苦八苦していましたが
別件にも応用できそうです。

何らかのツールを作っているといやがおうにも例外データが入ってきますので
なでしこ側でエラーをキャッチできさえすれば何とかなるのですが、
なかなか難しいものですね。

(#2402)へ返信する:

👆お手数ですが、いたずら防止のために、「真夏」の読み方を記入してください。

編集時に使うキーを入力(省略可能)

画像ファイル(最大300KB)を添付可能