8-10的Solaris:host2ip转换问题(Solaris 8-10: host2ip con

2019-10-17 05:25发布

我有我的工作在一个非常特殊的问题。 我有在Solaris 8 / SPARC平台的旧的编译器(GCC 2.95或更老)编译的代码。 它运行在Solaris 8 / SPARC不错,但10 / SPARC Solaris上的崩溃。 (SOLARIS 10是假想向后兼容的Solaris 8)

在调试时,我看到了,问题出现了,当应用程序试图进入其相应的I / P地址转换成主机名。 它采用gethostbyname_r,其次是INET_NTOA获得的IPv4四点缀数。 通过该解决方案gdb'ing使我在那里我看到,gethostbyname_r返回的组in_addr具有代表的I / P地址的正确整数点,但INET_NTOA调用返回错误字符串。 在确认其确实是INET_NTOA失败的一个困难是,代码是这样写下面

strcpy(hostaddr, inet_ntoa(*((struct in_addr *) hostdata.h_addr)));

因此从技术上讲,我不能看到INET_NTOA返回的值。 但我可以做一个

print (char*)inet_ntoa(*((struct in_addr *) hostdata.h_addr_list[0]))

上GDB看(这是足够我假定接近)和它打印格式错误的I / P地址。 例如, “0.0。” (主机名具有有效的I / P地址等的I / P开始0.0可以从机来解决。也没有正确的值)

你可以看到,使用与INET_NTOA不安全的strcpy造成了一点不明,导致段故障。

这将是伟大的人谁经历了类似的事情,至于什么可能是INET_NTOA的这种故障的原因的消息。 不知怎的,该系统发挥作用,我不能找出它也别想可以做些什么来解决这个问题。

所有评论将不胜感激。

约束:我不能修改代码,使其工作(否则这是微不足道的解决)。 所以,尽管知道的strcpy是一个非常不安全的功能WRT赛格故障和INET_NTOA不赞成我无奈在这一方面。

编辑:我有一种感觉,这是一个并行处理的问题。 我不知道,但我不认为应用程序是多线程的。 但新SOL10该机是一款64核的机器。 究其原因,思想链是与INET_NTOA唯一真正的问题是静态缓冲区和代码确实让在一个循环此调用。

Answer 1:

我发现了链接(和菜糟糕的代码)是问题。 一些超好听的人,虽然这是一个伟大的主意,有由完全相同的名称的功能作为标准库函数(inet_ntoa_r)。 当我试图同时与库链接我的代码使用-static选项,它开始抱怨这个符号在用户库文件存在。 一旦我摆脱它从那一声移动用户库函数的(到我试图解决一些其他问题。期待着另一个问题:))。 希望有人发现这很有用



文章来源: Solaris 8-10: host2ip conversion problems