[ruby-list:50723] Re: ENV / ARGV でNULL文字で終わってしまう
From:
haruka@...
Date:
2018-12-24 14:55:38 UTC
List:
ruby-list #50723
神戸さん、ご回答ありがとうございます。
成る程、プロセス置き換え時に既に失われてしまっているのですね…
確かに
zsh -c 'print -r "$param"'
でも消えました。
おとなしくnul文字を含まない方法を考えようと思います。
失礼しました。
ありがとうございました。
2018.12.24 23:42 に Takahiro Kambe が書きました:
> In message <69e9b6d34f923668447fa88545c8b984@reasonset.org>
> on Mon, 24 Dec 2018 23:32:18 +0900,
> haruka@reasonset.org wrote:
>> 環境変数(ENV)または引数(ARGV)でNULL文字を含む文字列を渡すと、
>> Ruby側ではNULL文字で終端したものとして扱われてしまいます。
> 「NULL文字」は nul文字 ('\0')のことと思いますが、UNIX系OSの場合は
> execve(2)でプロセスを置き換える際に第3引数で文字列のポインタの配列とし
> て渡します。
>
> int execve(const char *path, char *const argv[], char *const envp[]);
>
> 置き換えられた後のプログラムでは、
>
> int main(int argc, char *argv[], char *envp[]);
>
> とmain関数の引数か、広域変数
>
> extern char **environ;
>
> として参照できます。envpやenvironの文字列ポインターの配列で参照してい
> る文字列は'\0'で終端されたC言語の文字列ですので、そもそも途中に'\0'を
> 含めること自体できないと思いますが、如何でしょうか?
>
> どうしても'\0'を含めたい場合は何かエンコードしておくしかないと思います。