在Linux 2.6下使用ACE根據地址解析主機名的時候,發現一個BUG。
解析用的ACE函數是ACE_INET_Addr::get_host_name,查看源碼發現,這個函數最終調用了glibc2中的gethostbyaddr_r函數。在OS_NS_netdb.inl文件中128~141行:
上面的問題在於,gethostbyaddr_r這個函數出錯時,返回值也可能爲0。所以,根據返回值爲0判斷成功是不對的。判斷是否執行成功,需要判斷錯誤號“*h_errnop”的值是否爲0,
例如,我測試執行的時候,就發現*h_errnop==1(即HOST_NOT_FOUND),返回值=0的情況。
不過,這個問題最終根源更可能是glibc2的實現錯誤。因爲,在linux文檔中,雖然沒有找到關於gethostbyaddr_r返回值的表述,但有關於gethostbyname_r 和gethostbyname2_r 的返回值描述,其中提到:“These return 0 on success and non-zero on error.”
而且,從這個函數設計的角度來說,出錯時返回值也不應該爲0。
先記下來再說。
---------------
補充:
又查看了glibc2.1.12的源碼,調用路徑爲:
__gethostbyaddr_r --> __gethostbyaddr2_r --> __nss_hostname_digits_dots
當*h_errnop == HOST_NOT_FOUND時,返回值爲errno,但此時*h_errnop != errno,因此BUG應該在這裏。
注:h_errnop是爲了函數可重入而引入代替errno的。