誰かがすでに見つけているかもしれませんが、新しいfork爆弾を見つけたので書いておうと思います。
fork爆弾について知らない人は
を見てください。
見つけたものは以下です。
:()(:|:&);:
wikipediaに書いてある有名なやつは13文字(不要なスペースを消ば12文字)ですが、これは11文字でちょっと短いです。
有名なfork爆弾は
:(){ :|:& };:
というもので、わかりやすく書き直すと、以下のようになります。
main ()
{
main | main &
};
main
これはgroup_commandを呼び出す関数mainを定義し、main内部でバックグラウンドプロセスを再帰的に呼び出すことで、
大量のプロセスを作るというものです。
一方、今回の爆弾をわかりやすく書き直すと、
以下のようになります。
main ()
(
main | main &
);
main
これはsubshellを呼び出す関数mainを定義し、その中でmainを再帰的に呼び出します。
subshellがforkしている場合は、forkしてから更に2回forkするので、合計3回forkすると思われます。
bashの関数の定義方法ははparse.yの930行目あたりで以下のように定義されています。
function_def
: WORD '(' ')' newline_list function_body
| FUNCTION WORD '(' ')' newline_list function_body
| FUNCTION WORD function_body
| FUNCTION WORD '\n' newline_list function_body
;
newline_list
:
| newline_list '\n'
;
function_body
: shell_command
| shell_command redirection_list
;
私は、関数定義の際は '{' '}' を使って定義するのだと思い込んでいたのですが、定義を見る限り、関数の内容の部分はshell_commandと認識されるものであればなんでもいいようです。
つまり、以下のように書いても関数が定義できることがわかります。
#WORD '(' ')' newline_list for_command
func1() for i in $(seq 10); do echo hello;done
#WORD '(' ')' newline_list while_command
func2() while文
#WORD '(' ')' newline_list subshell
func3() (サブシェル)
#WORD '(' ')' newline_list group_command
func4() {グループコマンド}
よく見る関数の定義
main ()
{
echo hello;
}
はグループコマンドを使った定義方法です。