【问题标题】:gethostname silently truncates result instead of giving ENAMETOOLONG errorgethostname 默默地截断结果而不是给出 ENAMETOOLONG 错误
【发布时间】:2021-08-22 23:00:19
【问题描述】:
#include <stdio.h>
#include <unistd.h>
int main (int argc, char *argv[]) {
  char buf[4];
  int err = gethostname(buf, 4);
  printf("name: %s n: %d\n", buf, err); // BUG: err should be -1, and errno should give ENAMETOOLONG
  return 0;
}

在 OSX 上,这给出: name: xyz n: 0

即使我的主机名大于 3;相反,我希望 err 为 -1 而 errno 为 ENAMETOOLONG;

请注意,如果用户不知道此错误,并且在缓冲区太短时预计 err 为 -1(文档说 \0 未写入缓冲区),这也可能导致缓冲区溢出错误如果缓冲区太短),因此即使 err == 0,上述 printf 也是不合理的。我在调查 https://github.com/nim-lang/Nim/issues/18088 时观察到了这一点。

这是一个错误吗?如果有,在哪里举报?

【问题讨论】:

  • 您误解了gethostname 函数的规范。再读一遍。
  • 你如何解释这个? [ENAMETOOLONG] The current host name is longer than namelen. (For gethostname() only.)
  • 什么意思?我没有看到与文档相矛盾的消息。
  • 我的主机名长度为 23;我正在传递namelen = 4,它
  • 可能是文档错误。 linux equivalent 的行为不同。

标签: c macos


【解决方案1】:

macOS 手册说:

错误
这些调用可能会返回以下错误:

[ENAMETOOLONG] 当前主机名比 namelen 长。 (仅适用于 gethostname()。)

它还记录:

主机名的长度限制为 {sysconf(_SC_HOST_NAME_MAX)} 个字符,不包括结尾的 null,目前为 255。

手册中还提到了{_POSIX_HOST_NAME_MAX}

另请参阅gethostname() 的 POSIX 规范,其中说:

gethostname() 函数应返回当前机器的标准主机名。 namelen 参数应指定 name 参数指向的数组的大小。返回的名称应以空结尾,除非namelen 的长度不足以容纳主机名,则返回的名称应被截断,并且未指定返回的名称是否以空结尾。

主机名限制为{HOST_NAME_MAX} 字节。

主机名限制为 {HOST_NAME_MAX} 个字节。

您应该采取措施避免使用太短的字符串,而使用sysconf() 是一种方法。

由于 POSIX 未指定任何错误,因此尚不清楚您是否需要报告错误,但我同意手册页暗示您应该收到 ENAMETOOLONG 错误。

【讨论】:

  • 我不明白这如何解释我观察到的行为;它只是说最大可能的主机名长度是sysconf(_SC_HOST_NAME_MAX);手册页说如果The current host name is longer than namelen,API 应该给出 ENAMETOOLONG,在我的示例中就是这种情况(namelen = 4,但我的主机名长度> 10),但 API 调用给出 err = 0
  • 该调用返回 0,因为实际找到了主机名。 C 不牵你的手,所以你必须确保缓冲区大小等
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-04
  • 2010-11-03
  • 2017-11-12
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多