Correctly bind to the wildcard address in AsyncServerSocket::bind
authorChristopher Dykes <cdykes@fb.com>
Tue, 22 Nov 2016 17:48:18 +0000 (09:48 -0800)
committerFacebook Github Bot <facebook-github-bot-bot@fb.com>
Tue, 22 Nov 2016 17:53:32 +0000 (09:53 -0800)
Summary: Because Windows disagrees with everything else about how to specify that you want the wildcard address. It's done with an empty string on Windows, but `nullptr` everywhere else.

Reviewed By: yfeldblum

Differential Revision: D4216970

fbshipit-source-id: b5dc136946d9677a96be3252e44d383a6abca800

folly/io/async/AsyncServerSocket.cpp

index 65d4c5c48af4a9549121eefcc7b90e51040ce691..3ad284c8b874c0a752e979fdec269193f3b21d15 100644 (file)
@@ -21,6 +21,7 @@
 #include <folly/io/async/AsyncServerSocket.h>
 
 #include <folly/FileUtil.h>
+#include <folly/Portability.h>
 #include <folly/SocketAddress.h>
 #include <folly/String.h>
 #include <folly/detail/SocketFastOpen.h>
@@ -370,7 +371,10 @@ void AsyncServerSocket::bind(uint16_t port) {
   hints.ai_flags = AI_PASSIVE | AI_NUMERICSERV;
   snprintf(sport, sizeof(sport), "%u", port);
 
-  if (getaddrinfo(nullptr, sport, &hints, &res0)) {
+  // On Windows the value we need to pass to bind to all available
+  // addresses is an empty string. Everywhere else, it's nullptr.
+  constexpr const char* kWildcardNode = kIsWindows ? "" : nullptr;
+  if (getaddrinfo(kWildcardNode, sport, &hints, &res0)) {
     throw std::invalid_argument(
                               "Attempted to bind address to socket with "
                               "bad getaddrinfo");