当UNIX域套接字的监听队列已满时,大多数系统上的connect(2)
会失败并返回ECONNREFUSED。最好能够返回EAGAIN。
原因是能够区分死套接字(节点在文件系统中存在但没有进程再监听)和队列已满两种情况非常有用。当移植一些Linux软件时,我遇到了这个问题,其中有一些代码用于清除无效的套接字,但如果可以通过垃圾邮件来填充它们的后备队列以使代码被欺骗而删除套接字,那么这就是一个安全漏洞。
只有Linux返回EAGAIN;AIX、Solaris和Darwin遵循BSD的行为(在每个系统上进行了测试)。
POSIX并没有将EAGAIN作为connect()
的可能返回代码之一,(链接),所以这里可能存在某些符合性问题。
要让所有人与Linux保持一致,最好的方法是什么?我可以向Oracle、Apple、FreeBSD提交错误报告,并在每个组织的邮件列表上争论。还是应该纠缠标准机构(Austin group)的某个人?即使优点是显而易见的,试图让每个人都改变这里的做法是否明智?