2016-05-03 9 views
2

OCaml Unixモジュールを使用して、指定されたシステムコールのコンテキストで驚くべき効果を持つ特定のバイトを含む文字列を拒否するかどうかを調べました。例外をスローします。例えば。 prog引数のヌルバイトをUnix.create_processに、またはenv : string array引数の文字列の1つに改行を入れます。OCamlの文字列にヌル文字/バイトを含めるための慣用句

"/bin/ls\0"(文字列リテラルでは不正なエスケープシーケンス)や"/bin/ls"^string_of_char '\0'(文字リテラルでは不正なシーケンス)など、ヌルバイトを文字列に含める方法をいくつか試しました。最後に、ゼロに文字列をキャストしてから、ヌル文字を含む長さ1の文字列を作成し、それを文字列に連結します。

module U = Unix;; 

let string_of_char ch : string = String.make 1 ch 

let sketchy_string = "/bin/ls"^string_of_char (char_of_int 0) 

let _ = U.create_process sketchy_string [|"ls"|] U.stdin U.stdout U.stderr 

ocaml文字列にnullバイトを追加する正しい方法はありますか?

+0

ところで、どのようにUnixモジュールがそれらのヌルバイトをすべて処理しましたか? – hugomg

+1

Unixモジュールの 'create_process'関数は、最初のヌルバイトの後の文字を無視するので、内容をチェックせずにocaml文字列をヌル終了文字列に変換しているように見えます。私はそれがどのように実装されているかを確認する必要があります。 –

+0

OCamlの文字列は常に終了しているので、余分なヌル文字を追加する必要はありません。 https://realworldocaml.org/v1/en/html/memory-representation-of-values.html#string-values – ivg

答えて

3

あなたは一般的な「進コード」NULLバイト(またはその他の必要なバイト)を書くためにエスケープシーケンスを使用することができます:OCamlのマニュアルのセクションには、エスケープシーケンスをカバーする参照、さらに参考のため

let null_byte = '\x00';; 
let sketchy_string = "/bin/ls\x00";; 

を:http://caml.inria.fr/pub/docs/manual-ocaml/lex.html#escape-sequence

関連する問題