diff --git a/ext/include/opentelemetry/ext/http/server/http_server.h b/ext/include/opentelemetry/ext/http/server/http_server.h index b0f8299047..d714792523 100644 --- a/ext/include/opentelemetry/ext/http/server/http_server.h +++ b/ext/include/opentelemetry/ext/http/server/http_server.h @@ -199,13 +199,20 @@ class HttpServer : private SocketTools::Reactor::SocketCallback void setServerName(std::string const &name) { m_serverHost = name; } - int addListeningPort(int port) + int addListeningPort(uint16_t port) { + + + SocketTools::SocketAddr addr(0, port); + if (addr.port() == -1) + { + return -1; + } + SocketTools::Socket socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); socket.setNonBlocking(); socket.setReuseAddr(); - SocketTools::SocketAddr addr(0, port); socket.bind(addr); socket.getsockname(addr); diff --git a/ext/include/opentelemetry/ext/http/server/socket_tools.h b/ext/include/opentelemetry/ext/http/server/socket_tools.h index 3a5baf99eb..440fb41825 100644 --- a/ext/include/opentelemetry/ext/http/server/socket_tools.h +++ b/ext/include/opentelemetry/ext/http/server/socket_tools.h @@ -174,8 +174,9 @@ struct SocketAddr /// SocketAddr SocketAddr() {} - SocketAddr(u_long addr, int port) + SocketAddr(u_long addr, u_int16_t port) { + sockaddr_in &inet4 = reinterpret_cast(m_data); inet4.sin_family = AF_INET; inet4.sin_port = htons(static_cast(port)); diff --git a/ext/test/http/socket_tools_test.cc b/ext/test/http/socket_tools_test.cc index 34f9dac51b..87ff73a76f 100644 --- a/ext/test/http/socket_tools_test.cc +++ b/ext/test/http/socket_tools_test.cc @@ -71,6 +71,13 @@ TEST(SocketAddrTest, AcceptsLeadingZeroPort) EXPECT_EQ(addr.port(), 80); } +TEST(SocketAddrTest, RejectsOutOfRangeIntegerPorts) +{ + ExpectInvalid(SocketTools::SocketAddr(0, -1)); + ExpectInvalid(SocketTools::SocketAddr(0, 65536)); + ExpectInvalid(SocketTools::SocketAddr(0, 99999)); +} + TEST(SocketAddrTest, RejectsOutOfRangePort) { SocketTools::SocketAddr addr("127.0.0.1:99999");