Closed hcmiya closed 7 years ago
opuscommentが編集を受け入れる前段のフィルタで問題が発生して、テキスト出力をやめてしまったとする。その時、opuscommentは行の途中がNAME=VALUEという形式を満たしてさえいればファイル終端で改行が無くても編集が成立し、タグが書き換わってしまう。
NAME=VALUE
なんでこの話が必要かというと、vorbis commentの仕様としてはレコードが先程の形式を満たしていることと文字列がUTF-8でエンコードされていることが必要だが、Opusのタグの内部形式的には任意のバイナリを保存できるようになっているので、opuscommentが出力モードでそのエラーを検知すると途中まで出力をしたままその場で止まってしまう。一方で入力側は途切れた編集を受け入れられるので、そのまま編集が成立してしまった場合、元のファイルはタグを失うことになってしまい、しかもそれは正常終了で0を返し、おかしな編集があったことに気付かなくなるかも知れない。
例えば、信頼できないOpusファイルがUTF-8として不正なバイト列を持っている場合、それに遭遇するまでは正常に出力されてしまうので、以下のような単純なコマンドでも内容を失う可能性がある。
opuscomment utf8-broken.opus |opuscomment -w some.opus
編集内容を確認しないのはスクリプトが悪いと言われれば、それはその通りなのだが、opuscomment側でも不正な編集や間違った編集に対してそれを検知できれば利用者への負担軽減になるとは思う。
さて、出力モード時に内部フォーマットにエラーがあった時にわざと改行でない何文字かを出力して、-Tで受け付けてるopuscommentをエラーにさせる処理を入れて完成かと思ったけど、それってdeferredオプションで事足りるんだよね。だからいらないって事でissue閉じ。
opuscommentが編集を受け入れる前段のフィルタで問題が発生して、テキスト出力をやめてしまったとする。その時、opuscommentは行の途中が
NAME=VALUE
という形式を満たしてさえいればファイル終端で改行が無くても編集が成立し、タグが書き換わってしまう。なんでこの話が必要かというと、vorbis commentの仕様としてはレコードが先程の形式を満たしていることと文字列がUTF-8でエンコードされていることが必要だが、Opusのタグの内部形式的には任意のバイナリを保存できるようになっているので、opuscommentが出力モードでそのエラーを検知すると途中まで出力をしたままその場で止まってしまう。一方で入力側は途切れた編集を受け入れられるので、そのまま編集が成立してしまった場合、元のファイルはタグを失うことになってしまい、しかもそれは正常終了で0を返し、おかしな編集があったことに気付かなくなるかも知れない。
例えば、信頼できないOpusファイルがUTF-8として不正なバイト列を持っている場合、それに遭遇するまでは正常に出力されてしまうので、以下のような単純なコマンドでも内容を失う可能性がある。
編集内容を確認しないのはスクリプトが悪いと言われれば、それはその通りなのだが、opuscomment側でも不正な編集や間違った編集に対してそれを検知できれば利用者への負担軽減になるとは思う。