linux下用ACE獲取主機名一個Bug

在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_rgethostbyname2_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的。

發佈了62 篇原創文章 · 獲贊 11 · 訪問量 29萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章