stack_start として 0 を渡して clone システム コールを呼び出すとどうなりますか? clone のマニュアルページによると、 を返すはず-EINVAL
ですが、そうするとSIGSEGV (11)
エラーが表示されます。
clone(func,NULL,0,args);
-EINVALを返す必要がありますが、失敗しますSIGSEGV
stack_start として 0 を渡して clone システム コールを呼び出すとどうなりますか? clone のマニュアルページによると、 を返すはず-EINVAL
ですが、そうするとSIGSEGV (11)
エラーが表示されます。
clone(func,NULL,0,args);
-EINVALを返す必要がありますが、失敗しますSIGSEGV
Linuxカーネルによると、そのようなコールチェーンがあります。
sys_clone(... stack_start ...) ->do_fork
do_fork(... stack_start ...) ->copy_process
copy_process(... stack_start ...) ->copy_thread
X86_32の場合はcopy_thread(... stack_start ...)、X86_64の場合はcopy_thread(... stack_start ...)
copy_thread
この関数は正確性(コードのsp引数)をチェックしないstack_start
ため、クローン作成後、無効なスタックポインターを持つタスクがあり、ゼロアドレスでの最初の参照はにつながるという仮定につながりSIGSEGV
ます。
クローン関数のglibcラッパーも確認することをお勧めします。