法楽日記

デジタル散策記&マインド探訪記

FreeBSD 11.1R: getsockaddr()

FreeBSD 11.1R では、sockaddr 構造体を引数に持つシステムコールには bind(), bindat(), connect(), connectat(), sendto() があります。また、sendmsg() は引数の msghdr 構造体を通して sockaddr 構造体が指定される場合があります。

これらのシステムコールが呼び出されると、カーネル内ではそれぞれ sys_bind(), sys_bindat(), sys_connect(), sys_connectat(), sys_sendto(), sys_sendmsg() が呼び出されます。

これらのカーネル内関数の中で getsockaddr() が呼び出されて、ユーザ空間からカーネル空間へ sockaddr 構造体がコピーされます。

getsockaddr() では、sockaddr 構造体のメンバー sa_len が、システムコールの引数で与えられた長さで上書きされます。したがって FreeBSD 11 では(それ以前のバージョンも含めて)、システムコール呼び出し時に sa_len に書き込んだ長さは全く無視されます。しかし、たとえ無視されるとしても正しい値を書き込んでおくべきだと、私は思います。

なお、以上のカーネル内関数はいずれも sys/kern/uipc_syscalls.c で定義されています。