c-gethostname静默地截断结果,而不是给出ENAMETOOLONG错误


#include <stdio.h>
#include <unistd.h>
int main (int argc, char *argv[]) {
char buf[4];
int err = gethostname(buf, 4);
printf("name: %s n: %dn", buf, err); // BUG: err should be -1, and errno should give ENAMETOOLONG
return 0;
}

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

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

请注意,这也可能导致缓冲区溢出错误,以防用户没有意识到这个错误,并在缓冲区太短时预期错误为-1(文档说,如果缓冲区太短,不会写入缓冲区(,因此即使错误==0,如上所述的printf也是不健全的。我在调查时观察到了这一点https://github.com/nim-lang/Nim/issues/18088.

那是个虫子吗?如果是,在哪里报告?

macOS手册上说:

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

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

它还记录了:

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

手册中也提到了{_POSIX_HOST_NAME_MAX}

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

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

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

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

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

由于POSIX没有指定任何错误,所以不清楚您是否有错误需要报告,尽管我同意手册页暗示您应该得到ENAMETOOLONG错误。

最新更新