Tag: API

  • 從 inet_ntoa 看 thread safe 的 API

    這周 refactor 一段 code 之後,被同事說:「為什麼 log 的來源 IP 跟目的地 IP 總是一樣呢?」 後來仔細想了一下 inet_ntoa 的 prototype,我就明白了!如果這個 function 不必特意去 free 回傳的 pointer,那可能在內部有一個 static buffer 去保存這個值。果不期然,FreeBSD 的原始碼是這樣實作的 到這邊我們大概就知道,inet_ntoa 並不是一個 thread safe 的 function,你可以用下面這段程式測一下會發生什麼事情。 輸出大概會像 127.0.0.2 => 127.0.0.1 127.0.0.1 => 127.0.0.2 127.0.0.1 => [inet_ntoa error] 127.0.0.2 => 127.0.0.2 所以,直接使用 inet_ntoa 在 reentrant 上可能會發生問題,如果你必須面對這些問題,最好的方式就是使用 inet_ntoa_r 這個 reentrant 的版本,或者直接使用 inet_ntop。 而這難道非得要踩到地雷,或者從…