【发布时间】:2017-03-06 06:11:26
【问题描述】:
我正在修复对 gethostname() 的调用,其中旧代码将 hostName 数组声明为 10 个字符,导致边界错误,因为主机名比那个大。我的解决方法是使用MAXHOSTNAMELEN 声明hostName(我的平台的parm.h 声明为64)。另一位程序员现在说需要将数组声明为 hostName[MAXHOSTNAMELEN+1] 并清除,因为(来自他的电子邮件):
这是来自手册页: POSIX.1-2001 保证 “主机名(不包括终止空字节)限制为 HOST_NAME_MAX 字节”
所以要处理所有情况,你必须在缓冲区大小上加一,并用空字符初始化缓冲区。
现在我在网上看到的每个示例都在执行 char hostName[MAXHOSTNAMELEN] 并且由于调用要么有效要么无效,因此将 hostName 数组归零或将其初始化为 null 对我来说毫无意义,因为 if它可以工作,将数组设置为主机名,如果没有,则调用返回错误。
将参数声明或初始化为gethostname() 的稳健方法是什么?
【问题讨论】:
标签: c sockets posix buffer-overrun