Linux でバイナリ環境変数をいじっているときに、一部の 1 バイトが不良であると思われる奇妙な動作を見つけました。詳しく調べてみたところ、setenv() に指定すると、特定のバイトが常に正しく「変換」されないようです。これを見てください:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
char array[256];
int i;
for(i = 1; i < 256; i++) {
array[i] = i;
}
setenv("badenv", array, 1);
system("/bin/sh");
return 0;
}
このプログラムを実行してから、echo $badenv > test; を実行します。私が見るhexdumpテスト:
0000000 0101 0302 0504 0706 2008 0c0b 0e0d 100f
0000010 1211 1413 1615 1817 1a19 1c1b 1e1d 201f
0000020 2221 2423 2625 2827 2a29 2c2b 2e2d 302f
0000030 3231 3433 3635 3837 3a39 3c3b 3e3d 403f
0x9は0x20、0xaは0xbなどに変換されているようです。
私はsetenv()を悪用していますか、それとも一般的に環境変数を悪用していますか? マンページを調べて、いくつかを検索して、環境変数がバイナリ値を処理できるかどうかを確認しましたが、よくわかりません。
この動作の原因は何ですか? 環境変数を使用している場合、それを回避する方法はありますか?