12-检查返回状态和安全地处理失败情况
38.11 检查返回状态和安全地处理失败情况
特权程序应该总是检查系统调用和库函数调用是否成功以及它们是否返回了预期的值。(当然所有程序都应该这么做,但这一点对于特权程序来讲特别重要。)各种各样的系统调用都可能会失败,即使程序以root的身份运行。如当达到系统的进程数限制时fork()调用就会失败,对只读文件系统调用open()以获取写权限时会失败,或者当目标目录不存在时调用chdir()会失败。
即使系统调用成功了也有必要检查其结果。如,在需要的时候,特权程序应该检查成功的open()调用没有返回三个标准文件描述符0、1或2中的某个。
最后,如果特权程序碰到了未知情形,那么恰当的处理方式通常是终止执行或如果是服务器的话就丢弃客户端请求。试图修复未知的问题通常要求满足一些前提条件,但并不是所有的场景都满足这些前提条件,当不满足时就可能会产生安全漏洞。在这种情况下,更安全的做法是让程序终止或让服务器把信息记录下来并丢弃客户端的请求。